kaldi编译在线识别工具报错undefined reference to `PaUtil_GetRingBufferReadAvailable'

本文详细介绍了使用Kaldi编译在线识别工具的步骤,包括安装ALSADevelopmentKit、portaudio,以及编译过程中的常见错误及其解决方法。针对libportaudio.so链接错误,提供了修改Makefile的具体方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考https://blog.csdn.net/u011280621/article/details/68947604

kaldi编译online识别工具的步骤:

1、Installing ALSA Development Kit
sudo apt-get install libasound-dev

2、安装portaudio

cd kaldi/tools
./install_portaudio.sh

根据输出设置LIB等参数(LD_LIBRARY_PATH等)

如果设置正确,发命令sudo  ldconfig -v,可以找到libportaudio.so

/home/boystray/kaldi/tools/extras/portaudio/install/lib:
    libportaudio.so.2 -> libportaudio.so.2.0.0

 

3、# 编译在线识别工具
cd src/
make ext

4、报错

make[1]: 进入目录“/home/boystray/kaldi/src/onlinebin”
g++ -std=c++11 -I.. -isystem /home/boystray/kaldi/tools/openfst/include -O1 -Wno-sign-compare -I../../tools/portaudio/install/include -Wall -Wno-sign-compare -Wno-unused-local-typedefs -Wno-deprecated-declarations -Winit-self -DKALDI_DOUBLEPRECISION=0 -DHAVE_EXECINFO_H=1 -DHAVE_CXXABI_H -DHAVE_ATLAS -I/home/boystray/kaldi/tools/ATLAS_headers/include -msse -msse2 -pthread -g  -DHAVE_CUDA -I/usr/local/cuda/include -fPIC -pthread -isystem /home/boystray/kaldi/tools/openfst/include   -c -o online-net-client.o online-net-client.cc
g++  -Wl,-rpath=/home/boystray/kaldi/tools/openfst/lib  -rdynamic  online-net-client.o ../online/kaldi-online.a ../decoder/kaldi-decoder.a ../lat/kaldi-lat.a ../hmm/kaldi-hmm.a ../feat/kaldi-feat.a ../transform/kaldi-transform.a ../gmm/kaldi-gmm.a ../tree/kaldi-tree.a ../util/kaldi-util.a ../matrix/kaldi-matrix.a ../base/kaldi-base.a  ../../tools/portaudio/install/lib/libportaudio.a -lrt /home/boystray/kaldi/tools/openfst/lib/libfst.so /usr/lib/x86_64-linux-gnu//libatlas.so.3 /usr/lib/x86_64-linux-gnu//libf77blas.so.3 /usr/lib/x86_64-linux-gnu//libcblas.so.3 /usr/lib/x86_64-linux-gnu//liblapack_atlas.so.3 -Wl,-rpath=/usr/lib/x86_64-linux-gnu -lm -lpthread -ldl -o online-net-client
/usr/bin/ld: ../online/kaldi-online.a(online-audio-source.o): in function `kaldi::OnlinePaSource::Read(kaldi::Vector<float>*)':
/home/boystray/kaldi/src/online/online-audio-source.cc:122: undefined reference to `PaUtil_GetRingBufferReadAvailable'
/usr/bin/ld: /home/boystray/kaldi/src/online/online-audio-source.cc:138: undefined reference to `PaUtil_ReadRingBuffer'
/usr/bin/ld: ../online/kaldi-online.a(online-audio-source.o): in function `kaldi::OnlinePaSource::OnlinePaSource(unsigned int, unsigned int, unsigned int, unsigned int)':
/home/boystray/kaldi/src/online/online-audio-source.cc:71: undefined reference to `PaUtil_InitializeRingBuffer'
/usr/bin/ld: ../online/kaldi-online.a(online-audio-source.o): in function `kaldi::OnlinePaSource::Callback(void const*, void*, long, PaStreamCallbackTimeInfo const*, unsigned long)':
/home/boystray/kaldi/src/online/online-audio-source.cc:164: undefined reference to `PaUtil_WriteRingBuffer'
/usr/bin/ld: /home/boystray/kaldi/src/online/online-audio-source.cc:161: undefined reference to `PaUtil_GetRingBufferWriteAvailable'
collect2: error: ld returned 1 exit status
make[1]: *** [<内置>:online-net-client] 错误 1

5、解决方法。修改kaldi/src/online目录下的Makfile,OBJFILES这个变量后面添加pa_ringbuffer.o

OBJFILES = pa_ringbuffer.o online-audio-source.o online-feat-input.o online-decodable.o online-faster-decoder.o onlinebin-util.o online-tcp-source.o

6、cd /src

       make ext

<think>好的,用户现在让我分析一个git clone命令,具体是: git clone -b vosk --single-branch --depth=1 https://github.com/alphacep/kaldi /opt/kaldi 首先,我需要分解这个命令的各个部分,解释每个参数的作用。用户可能是在Jetson AGX Orin上安装Kaldi,特别是Vosk相关的分支,所以需要确保命令适合ARM环境。 用户之前的问题是关于编译OpenFST在ARM架构上的问题,现在这个命令是克隆特定的Kaldi分支。可能需要检查这个分支是否兼容ARM,或者是否需要额外的步骤来适配。 接下来,我要逐个参数解释: - -b vosk:指定分支,这里可能需要确认vosk分支是否存在,或者是否稳定。 - --single-branch:只克隆该分支,节省时间和空间。 - --depth=1:浅克隆,只获取最近一次提交,减少下载量。 - 目标目录是/opt/kaldi,需要权限,可能需要sudo,但使用sudo克隆可能会有权限问题,需要提醒用户。 然后,分析潜在问题: 1. 目标目录/opt/kaldi可能需要root权限,用户可能需要使用sudo,但git clone用sudo可能导致权限错误,建议先检查目录权限,或者克隆到用户目录再移动。 2. Jetson AGX Orin是ARM架构,需要确保vosk分支的代码没有x86特定的依赖,比如SSE指令,之前用户遇到过类似问题,可能需要调整编译选项。 3. 网络问题,如果GitHub连接不稳定,可能需要设置代理或者重试。 4. 分支是否存在,alphacep的kaldi仓库是否有vosk分支,需要确认,如果不存在会导致克隆失败。 然后,给出步骤建议: 1. 检查分支是否存在,访问GitHub页面确认。 2. 确保目标目录可写,或者使用sudo正确。 3. 克隆完成后,进入目录进行编译,可能需要处理依赖,比如安装必要的工具链。 4. 适配ARM架构,修改编译脚本,移除不支持的指令集,如之前的SSE选项,使用ARM优化参数。 5. 处理可能的依赖问题,比如安装OpenBLAS等。 还需要考虑用户的使用场景,可能是在构建语音识别系统,使用Vosk模型,所以需要确保Kaldi正确编译并与Vosk集成。用户可能后续需要编译其他组件,提前提醒需要注意的地方,比如环境变量设置,库路径等。 最后,总结命令的作用和注意事项,帮助用户顺利完成克隆和后续的编译安装。</think>以下是对该命令的详细分析及在 **Jetson AGX Orin (Ubuntu 22.04 ARM架构)** 上的适配说明: --- ### **1. 命令解析** ```bash git clone -b vosk --single-branch --depth=1 https://github.com/alphacep/kaldi /opt/kaldi ``` - **`-b vosk`**: 指定克隆 `vosk` 分支(专为 [Vosk语音识别工具](https://alphacephei.com/vosk/) 优化的Kaldi版本) - **`--single-branch`**: 仅克隆 `vosk` 分支,减少下载量 - **`--depth=1`**: 浅克隆(仅保留最近一次提交历史,节省存储空间) - **目标路径**: `/opt/kaldi`(需管理员权限,通常需配合 `sudo`) --- ### **2. Jetson AGX Orin 适配关键点** #### **(1) 权限问题** - **风险**: 直接写入 `/opt` 目录需要 `sudo`,但 `git clone` 使用 `sudo` 可能导致后续文件权限混乱 - **建议方案**: ```bash # 先克隆到用户目录,再移动到 /opt git clone -b vosk --single-branch --depth=1 https://github.com/alphacep/kaldi ~/kaldi sudo mv ~/kaldi /opt/ ``` #### **(2) 架构兼容性** - **潜在冲突**:Kaldi 的某些代码可能默认包含 x86 优化(如 SSE/AVX 指令),需手动适配 ARM - **验证方法**: ```bash # 查看代码中是否包含 x86 特定指令 grep -rn "SSE\|AVX\|-march=native" /opt/kaldi/src ``` #### **(3) 依赖管理** - **必要依赖**: ```bash sudo apt install -y autoconf automake libtool libatlas-base-dev libopenblas-dev python3 python3-pip ``` - **ARM专用调整**: - 若使用 OpenBLAS,需在编译时指定 `TARGET=ARMV8`(适配 Jetson Orin 的 ARMv8 架构) - 修改 `/opt/kaldi/tools/Makefile` 中的 `OPENBLAS_ARCH=ARMV8` --- ### **3. 完整操作流程** ```bash # 步骤1: 克隆仓库(无需sudo) git clone -b vosk --single-branch --depth=1 https://github.com/alphacep/kaldi ~/kaldi # 步骤2: 移动目录并授权 sudo mv ~/kaldi /opt/ sudo chown -R $(whoami):$(whoami) /opt/kaldi # 避免权限问题 # 步骤3: 安装依赖 sudo apt update && sudo apt install -y autoconf automake libtool libatlas-base-dev libopenblas-dev # 步骤4: 配置OpenBLAS(ARM优化) cd /opt/kaldi/tools sed -i 's/NO_ARCH=1/OPENBLAS_ARCH=ARMV8/g' Makefile # 修改编译目标 # 步骤5: 编译工具链 make -j$(nproc) # 使用所有CPU核心加速编译 # 步骤6: 编译主库 cd ../src ./configure --shared --use-cuda=no # Jetson Orin若需CUDA则改为--use-cuda=yes make -j$(nproc) ``` --- ### **4. 常见问题与解决方案** #### **(1) 编译报错 `undefined reference to '__cpu_model'`** - **原因**: GCC 在 ARM 平台对某些 x86 内联函数的误用 - **修复**: ```bash # 在 /opt/kaldi/src/configure 中移除 -msse 等标志 sed -i 's/-msse//g; s/-mfpmath=sse//g' configure ``` #### **(2) 运行时缺少动态库** - **现象**: `error while loading shared libraries: libkaldi-base.so: cannot open shared object file` - **解决**: ```bash # 添加库路径到系统配置 echo "/opt/kaldi/src/lib" | sudo tee /etc/ld.so.conf.d/kaldi.conf sudo ldconfig ``` #### **(3) CUDA支持问题** - **Jetson Orin 需额外操作**: ```bash # 确认CUDA版本 nvcc --version # Ubuntu 22.04默认包含JetPack 5.x的CUDA 11.4 # 编译时启用CUDA ./configure --shared --use-cuda=yes --cudatk-dir=/usr/local/cuda ``` --- ### **5. 性能优化建议** 1. **NEON指令加速**: - 在 `src/configure` 中添加 ARM NEON 支持: ```bash CXXFLAGS="-O3 -mcpu=cortex-a78 -mfpu=neon" ./configure --shared ``` 2. **内存限制**: - Jetson AGX Orin 的 32GB 内存虽充足,但建议限制并行编译进程: ```bash make -j4 # 避免OOM错误 ``` 3. **散热监控**: ```bash sudo apt install lm-sensors sensors # 实时监控CPU/GPU温度 ``` --- ### **总结** - **命令核心目的**:快速获取专为 Vosk 优化的 Kaldi 版本。 - **ARM适配关键**:移除 x86 指令依赖 + 启用 ARM 优化(OpenBLAS/NEON)。 - **推荐流程**:优先在用户目录克隆,再移动至 `/opt` 并手动调整权限和编译参数。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值