sherpa + ncnn 离线语音识别

发布于:2024-04-25 ⋅ 阅读:(23) ⋅ 点赞:(0)

在这里插入图片描述

前言

小编需要实现离线音视频语言部分识别,将纯音频及视频中的音频中语言部分(中文)提取出来进行后续的逻辑处理,并且结合C语言去使用,调查发现sherpa + ncnn可以满足小编的需求,将整个可执行程序编译及使用整理如下:

Sherpa-NCNN 是一个基于 C++ 的轻量级神经网络推理框架,是 kaldi 下的一个子项目,它专门针对移动设备和嵌入式系统进行了优化。 Sherpa-NCNN 的目标是提供高性能、低延迟的推理能力,适用于移动设备和嵌入式系统,可以以满足实时应用需求。
主要功能:语音识别、流式语音识别。即边说话,边识别。不需要访问网络,不需要数据传输,完全本地识别。
识别效果:识别速度很快,效果比较好,但是只支持wav格式的音频,其他格式的需要转换后才能识别。
不足:目前只支持单通道、16 kHz 采样率、.wav 格式的音频文件。

音视频格式转为wav

关于音视频格式转换请移驾到 ffmpeg安装使用(详细)

sherpa-ncnn编译

更加详细的资料可参阅sherpa-ncnn,此环节需要下载sherpa-ncnn源码进行编译,以下命令中有下载源码的命令,但需要有Git环境才可使用,没有Git环境可在此下载sherpa-ncnn下载

Linux

git clone https://github.com/k2-fsa/sherpa-ncnn
cd sherpa-ncnn
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j6

编译脚本会自动下载编译需要的相关文件,编译完成后可执行文件在 build/bin 目录下。

-rwxr-xr-x 1 root root 6769904 416 17:36 decode-file-c-api
-rwxr-xr-x 1 root root 6692384 416 17:36 generate-int8-scale-table
-rwxr-xr-x 1 root root 6770152 416 17:36 sherpa-ncnn
-rwxr-xr-x 1 root root 6775088 416 17:36 sherpa-ncnn-alsa
-rwxr-xr-x 1 root root 6931624 416 17:36 sherpa-ncnn-microphone

Windows

git clone https://github.com/k2-fsa/sherpa-ncnn
cd sherpa-ncnn 
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build . --config Release -- -m:6

编译脚本会自动下载编译需要的相关文件,编译完成后可执行文件在 build/bin/Release 目录下。

total 18032
-rwxr-xr-x 1 Administrator 197121 4594176 Apr 18 14:16 decode-file-c-api.exe*
-rwxr-xr-x 1 Administrator 197121 4515328 Apr 18 14:16 generate-int8-scale-table.exe*
-rwxr-xr-x 1 Administrator 197121 4749824 Apr 18 14:16 sherpa-ncnn-microphone.exe*
-rwxr-xr-x 1 Administrator 197121 4596224 Apr 18 14:16 sherpa-ncnn.exe*

windows编译中遇到的问题

问题“‘nmake’ ‘-?’ failed with: no such file or directory”
$ cmake -DCMAKE_BUILD_TYPE=Release ..
-- Building for: NMake Makefiles
CMake Error at CMakeLists.txt:2 (project):
  Running

   'nmake' '-?'

  failed with:

   no such file or directory


CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
-- Configuring incomplete, errors occurred!
编译失败原因

AI 分析如下,分析的很准确,小编是因为没有安装“Visual Studio”造成的,换了一台装有“Visual Studio”的电脑编译成功;

这个错误表明nmake命令无法找到指定的帮助文件。nmake是Microsoft Visual Studio的一个组件,用于编译使用Makefile文件定义的项目。当尝试运行nmake -?时,它会寻找帮助信息,但无法在系统上找到相应的文件。
解决方法:

  1. 确认Visual Studio是否正确安装,并且nmake工具是否在系统的环境变量PATH中。
  2. 如果Visual Studio安装了,可能是环境变量设置不正确。检查并确保nmake所在的目录被添加到PATH中。
  3. 如果Visual Studio未安装,需要安装它或者单独安装Build Tools for Visual Studio,其中包括nmake。
  4. 如果你确认Visual Studio已安装,但问题依旧存在,尝试修复Visual Studio安装或者重新安装Visual Studio。
  5. 确认你的系统是32位还是64位,因为nmake通常与Visual Studio版本一致,如果你的系统是64位,确保你没有意外地只安装了32位版本的Visual Studio。

成功编译截图

编译过程有点微微长,需耐心等待…

  • cmake -DCMAKE_BUILD_TYPE=Release …
    在这里插入图片描述
  • cmake --build . --config Release – -m:6
    在这里插入图片描述

可执行程序说明

默认采用静态链接,可执行程序没有外部依赖。windows系统下在一台电脑上编译完后,可以直接拷贝到其他的电脑运行;Linux或者国产系统必须根据自己的架构去处理,相同架构下编译执行。

Linux Windows 作用说明
sherpa-ncnn sherpa-ncnn.exe 识别单个 wav 文件
sherpa-ncnn-microphone sherpa-ncnn-microphone.exe 用于识别麦克风的实时语音

模型下载

  1. sherpa-ncnn提供训练好的模型(170MB);
  2. 小编使用的模型(24.2MB,对模型文件大小有要求的可使用此模型);

语言识别测试

Linux

测试结果:

$ ./sherpa-ncnn \
>  /home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/tokens.txt \
>  /home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/encoder_jit_trace-pnnx.ncnn.param \
>  /home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/encoder_jit_trace-pnnx.ncnn.bin \
m \
 /home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/joiner_jit_trace-pnnx.ncnn.bin \
 /home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/test_wavs/0.wav>  /home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/decoder_jit_trace-pnnx.ncnn.param \
>  /home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/decoder_jit_trace-pnnx.ncnn.bin \
>  /home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/joiner_jit_trace-pnnx.ncnn.param \
>  /home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/joiner_jit_trace-pnnx.ncnn.bin \
>  /home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/test_wavs/0.wav
RecognizerConfig(feat_config=FeatureExtractorConfig(sampling_rate=16000, feature_dim=80), model_config=ModelConfig(encoder_param="/home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/encoder_jit_trace-pnnx.ncnn.param", encoder_bin="/home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/encoder_jit_trace-pnnx.ncnn.bin", decoder_param="/home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/decoder_jit_trace-pnnx.ncnn.param", decoder_bin="/home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/decoder_jit_trace-pnnx.ncnn.bin", joiner_param="/home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/joiner_jit_trace-pnnx.ncnn.param", joiner_bin="/home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/joiner_jit_trace-pnnx.ncnn.bin", tokens="/home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/tokens.txt", encoder num_threads=4, decoder num_threads=4, joiner num_threads=4), decoder_config=DecoderConfig(method="greedy_search", num_active_paths=4), endpoint_config=EndpointConfig(rule1=EndpointRule(must_contain_nonsilence=False, min_trailing_silence=2.4, min_utterance_length=0), rule2=EndpointRule(must_contain_nonsilence=True, min_trailing_silence=1.4, min_utterance_length=0), rule3=EndpointRule(must_contain_nonsilence=False, min_trailing_silence=0, min_utterance_length=20)), enable_endpoint=False, hotwords_file="", hotwrods_score=1.5)
wav filename: /home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/test_wavs/0.wav
wav duration (s): 5.61462
Started!
Done!
Recognition result for /home/kaixuan/Desktop/kaldi/sherpa-ncnn-2022-09-30/test_wavs/0.wav
text: 对我做了介绍那么我想说的是呢大家如果对我的研究感兴趣
timestamps: 0.44 0.64 0.88 0.92 1 1.04 2.12 2.16 2.24 2.36 2.48 2.64 2.72 2.88 3.48 3.56 3.72 3.8 3.88 4 4.08 4.12 4.24 4.44 4.52 4.56 
Elapsed seconds: 4.015 s
Real time factor (RTF): 4.015 / 5.615 = 0.715

Windows

测试结果:

$ ./sherpa-ncnn.exe  \
> C:\\Users\\Administrator\\Desktop\\ncnn\\sherpa-ncnn-2022-09-30\\tokens.txt \
> C:\\Users\\Administrator\\Desktop\\ncnn\\sherpa-ncnn-2022-09-30\\encoder_jit_trace-pnnx.ncnn.param \
> C:\\Users\\Administrator\\Desktop\\ncnn\\sherpa-ncnn-2022-09-30\\encoder_jit_trace-pnnx.ncnn.bin \
> C:\\Users\\Administrator\\Desktop\\ncnn\\sherpa-ncnn-2022-09-30\\decoder_jit_trace-pnnx.ncnn.param \
> C:\\Users\\Administrator\\Desktop\\ncnn\\sherpa-ncnn-2022-09-30\\decoder_jit_trace-pnnx.ncnn.bin \
> C:\\Users\\Administrator\\Desktop\\ncnn\\sherpa-ncnn-2022-09-30\\joiner_jit_trace-pnnx.ncnn.param \
> C:\\Users\\Administrator\\Desktop\\ncnn\\sherpa-ncnn-2022-09-30\\joiner_jit_trace-pnnx.ncnn.bin \
> C:\\Users\\Administrator\\Desktop\\ncnn\\sherpa-ncnn-2022-09-30\\test_wavs\\0.wav
Elapsed seconds: 4.401 s
Real time factor (RTF): 4.401 / 5.615 = 0.784
RecognizerConfig(feat_config=FeatureExtractorConfig(sampling_rate=16000, feature_dim=80), model_config=ModelConfig(encoder_param="C:\Users\Administrator\Desktop\ncnn\sherpa-ncnn-2022-09-30\encoder_jit_trace-pnnx.ncnn.param", encoder_bin="C:\Users\Administrator\Desktop\ncnn\sherpa-ncnn-2022-09-30\encoder_jit_trace-pnnx.ncnn.bin", decoder_param="C:\Users\Administrator\Desktop\ncnn\sherpa-ncnn-2022-09-30\decoder_jit_trace-pnnx.ncnn.param", decoder_bin="C:\Users\Administrator\Desktop\ncnn\sherpa-ncnn-2022-09-30\decoder_jit_trace-pnnx.ncnn.bin", joiner_param="C:\Users\Administrator\Desktop\ncnn\sherpa-ncnn-2022-09-30\joiner_jit_trace-pnnx.ncnn.param", joiner_bin="C:\Users\Administrator\Desktop\ncnn\sherpa-ncnn-2022-09-30\joiner_jit_trace-pnnx.ncnn.bin", tokens="C:\Users\Administrator\Desktop\ncnn\sherpa-ncnn-2022-09-30\tokens.txt", encoder num_threads=4, decoder num_threads=4, joiner num_threads=4), decoder_config=DecoderConfig(method="greedy_search", num_active_paths=4), endpoint_config=EndpointConfig(rule1=EndpointRule(must_contain_nonsilence=False, min_trailing_silence=2.4, min_utterance_length=0), rule2=EndpointRule(must_contain_nonsilence=True, min_trailing_silence=1.4, min_utterance_length=0), rule3=EndpointRule(must_contain_nonsilence=False, min_trailing_silence=0, min_utterance_length=20)), enable_endpoint=False, hotwords_file="", hotwrods_score=1.5)
wav filename: C:\Users\Administrator\Desktop\ncnn\sherpa-ncnn-2022-09-30\test_wavs\0.wav
wav duration (s): 5.61462
Started!
Done!
Recognition result for C:\Users\Administrator\Desktop\ncnn\sherpa-ncnn-2022-09-30\test_wavs\0.wav
text: 对我做了介绍那么我想说的是呢大家如果对我的研究感兴趣
timestamps: 0.44 0.64 0.88 0.92 1 1.04 2.12 2.16 2.24 2.36 2.48 2.64 2.72 2.88 3.48 3.56 3.72 3.8 3.88 4 4.08 4.12 4.24 4.44 4.52 4.56

参考文献

  1. https://zhuanlan.zhihu.com/p/576293033
  2. https://zhuanlan.zhihu.com/p/675428374