• sherpa + ncnn 离线语音识别


    在这里插入图片描述

    前言

    小编需要实现离线音视频语言部分识别,将纯音频及视频中的音频中语言部分(中文)提取出来进行后续的逻辑处理,并且结合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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    编译脚本会自动下载编译需要的相关文件,编译完成后可执行文件在 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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    编译脚本会自动下载编译需要的相关文件,编译完成后可执行文件在 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*
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    编译失败原因

    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或者国产系统必须根据自己的架构去处理,相同架构下编译执行。

    LinuxWindows作用说明
    sherpa-ncnnsherpa-ncnn.exe识别单个 wav 文件
    sherpa-ncnn-microphonesherpa-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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    参考文献

    1. https://zhuanlan.zhihu.com/p/576293033
    2. https://zhuanlan.zhihu.com/p/675428374
  • 相关阅读:
    数据分析三剑客之Matplotlib
    系统集成|第十一章(笔记)
    msvcr120.dll文件的作用、丢失的原因及解决办法分享
    c语言练习6
    【毕业季·进击的技术er】青春不散场
    CPU、内存、磁盘性能监控
    自动驾驶感知算法实战14——感知算法模型生产线
    【leetcode】最近最少使用缓存
    《大数据之路:阿里巴巴大数据实践》-第4篇 数据应用篇 -第16章 数据应用
    python毕业设计题目推荐飞机票销售订票系统
  • 原文地址:https://blog.csdn.net/weixin_43948057/article/details/137922033