2018年2月20日 星期二

Kaldi 使用解碼器時產生錯誤的解決方案

Kaldi 的即時解碼器 (Live Decoder) 是使用 PortAudio 來處理音源輸入的接口,但根據網友說述之 PortAudio 可能在 Kaldi 安裝 tools 的時候,缺少了設定導致失敗。


主要的問題


Kaldi 在做解碼模型的時候,如果要用 online-gmm-decode-faster 來做解碼,也就是在跑
$ ./run.sh  --test-mode live
這個指令時出現錯誤: PortAudio failed to open the default stream,就需要用以下的方案嘗試解決。

重新安裝


我把 Kaldi 的 tools, src 目錄都先做 make clean 清空,然後到 PortAudio 下載官方的 PortAudio 放到 tools 目錄下,取名叫 portaudio 的資料夾。

先做輸入指令設定確定沒有缺少功能:
./configure

如果 ALSA 是 NO 的話,請安裝 ALSA:
sudo apt-get install libasound-dev

然後修改 tools/portaudio/Makefile 這個檔案,在 CFLAGS 這個設定中,最後尾巴加上 -fPIC
...
CC = gcc
CXX = 
CFLAGS = -g -O2 -DPA_LITTLE_ENDIAN -I$(top_srcdir)/include -I$(top_srcdir)/src/common -I$(top_srcdir)/src/os/unix -pthread -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -DHAVE_SYS_SOUNDCARD_H=1 -DHAVE_LINUX_SOUNDCARD_H=1 -DSIZEOF_SHORT=2 -DSIZEOF_INT=4 -DSIZEOF_LONG=8 -DHAVE_CLOCK_GETTIME=1 -DHAVE_NANOSLEEP=1 -DPA_USE_ALSA=1 -DPA_USE_OSS=1 -fPIC
LIBS =  -lasound -lm -lpthread
...

然後進行編譯:
make

編譯成功後再安裝:
make install

接著,修改 /src/online 底下的 Makefile ,在 EXTRA_CXXFLAGS 設定中加入 -fPIC 設定:
all:

EXTRA_CXXFLAGS += -Wno-sign-compare -fPIC -I../../tools/portaudio/install/include
EXTRA_LDLIBS =
...

完成後,把 /src/online 目錄清空,使用指令:
make clean && make

清空後,就要到 tools 目錄和 src 目錄重新安裝,這時請參考這兩個目錄的 INSTALL 檔案來安裝就好了,但 online 目錄和 onlinebin 等 src 底下的目錄要確定是否有沒有 .o 的執行檔案,如果沒有,就到該目錄底下做 make 的動作。

修正 Kaldi 的 PortAudio 功能時重新編譯產生 recompile with -fPIC 錯誤


如果你在 /src/online 進行編譯時遇到這個錯誤,這個是 tools/portaudio 在編譯時沒有加 -fPIC 發生的錯誤,所以請回去 portaudio 重新清除安裝一次。

/usr/bin/ld: ../../tools/portaudio/install/lib/libportaudio.a(pa_front.o): 
relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; 
recompile with -fPIC


執行 DEMO 時再出錯,雖然 PortAudio 安裝和設定上的問題暫時被解決,但還是遇上再使用 online-gmm-decode-faster 時出現:
ALSA lib pcm_dsnoop.c:612:(snd_pcm_dsnoop_open) unable to open slave
ALSA lib pcm_dmix.c:1018:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_dmix.c:957:(snd_pcm_dmix_open) The dmix plugin supports only playback stream
ALSA lib pcm_dmix.c:1018:(snd_pcm_dmix_open) unable to open slave

就需要新增 ~/.asoundrc 這個檔案:
pcm.!default {
    type plug
    slave.pcm "asymed"
}

pcm.asymed {
        type asym
        playback.pcm "dmixer"
}


Reference:
http://blog.csdn.net/u011280621/article/details/68947604
http://blog.csdn.net/u012236368/article/details/71628777
http://portaudio.com/docs/v19-doxydocs/tutorial_start.html
http://portaudio.com/docs/v19-doxydocs/compile_linux.html
https://kaineshu.wordpress.com/2007/05/02/轉貼用gcc-自製-library/
http://blog.yjl.im/2012/11/pyaudio-portaudio-and-alsa-messages.html

沒有留言:

張貼留言

© ERIC RILEY , 自由無須告知轉貼
Background Japanese Sayagata by Olga Libby