sherpa + ncnn 离线语音识别

embedded/2024/11/13 9:40:15/

目录结构

    • 前言
    • 音视频格式转为wav
    • sherpa-ncnn编译
      • Linux
      • Windows
      • windows编译中遇到的问题
        • 问题“'nmake' '-?' failed with: no such file or directory”
        • 编译失败原因
      • 成功编译截图
    • 可执行程序说明
    • 模型下载
    • 语言识别测试
      • Linux
      • Windows
    • 参考文献

在这里插入图片描述

前言

小编需要实现离线音视频语言部分识别,将纯音频及视频中的音频中语言部分(中文)提取出来进行后续的逻辑处理,并且结合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 directoryCMake 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或者国产系统必须根据自己的架构去处理,相同架构下编译执行。

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

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

http://www.ppmy.cn/embedded/7074.html

相关文章

【Linux开发 第七篇】权限

权限 Linux组权限修改权限 Linux组 在linux中的每个用户必须属于一个组,不能独立于组外 文件/目录 所有者 一般为文件的创建者,谁创建了该文件,就自然的成为了该文件的所有者 这一列即为文件的所有者 修改文件的所有者: chown…

攻防演练,现在收到通知服务器已经被攻破,作为蓝方,怎么检查服务器被攻破的痕迹

在攻防演练中,如果您的服务器被告知已经被攻破,重要的是要快速并系统地响应,以确定攻击的范围、方法和影响。这包括确认攻击的痕迹、哪些数据可能被访问或盗取,以及如何尽快恢复安全状态。以下是一系列步骤和建议,帮助…

简介:Asp.Net Core进阶高级编程教程

课程简介目录 🚀前言一、课程背景二、课程目的三、课程特点四、课程适合人员六、最后 🚀前言 本文是《.Net Core进阶编程课程》教程专栏的导航站(点击链接,跳转到专栏主页,欢迎订阅,持续更新…&#xff09…

香港裸机云多IP服务器都有哪些配置?

香港裸机云多IP服务器是一种高效、灵活的云计算服务,为用户提供了多IP地址的配置选项,以满足各种复杂的网络需求。这种服务器在配置上具有丰富的多样性和高度的可定制性,下面我们就来科普一下香港裸机云多IP服务器的主要配置。 首先&#xff…

在PostgreSQL中如何进行全文搜索,以及如何优化全文搜索性能?

文章目录 如何进行全文搜索1. 创建全文搜索向量2. 执行全文搜索查询 如何优化全文搜索性能1. 使用GIN索引2. 限制搜索范围3. 优化文本处理4. 使用并发搜索5. 监控和调整配置 在PostgreSQL中,全文搜索通常通过使用tsvector和tsquery类型,以及to_tsvector和…

我与C++的爱恋:类和对象(四)

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:我与C的爱恋 ​ 朋友们大家好!本篇是类和对象的最后一个部分。 一、static成员 声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之…

appium控制手机一直从下往上滑动

用于使用Appium和Selenium WebDriver在Android设备上滚动设置应用程序的界面。具体来说,它通过WebDriverWait和expected_conditions等待元素出现,然后使用ActionChains移动到该元素并执行滚动动作。在setUp中,它初始化了Appium的WebDriver和c…

Android--ConnectivityManager使用

一、前言 Android10之后官方废弃了通过WifiManager连接WIFI的方式,现在要使用ConnectivityManager连接WIFI 二、连接WIFI public class MainActivity extends AppCompatActivity {private static final String TAG"lkx";Overrideprotected void onCrea…