sherpa + ncnn 离线语音识别

news/2024/5/18 12:16:41

目录结构

    • 前言
    • 音视频格式转为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.mrgr.cn/p/45441777

相关文章

【问题处理】银河麒麟操作系统实例分享,服务器操作系统VNC远程问题分析

1.服务器环境以及配置 【内核版本】 4.19.90-23.8.v2101.ky10.aarch64 【OS镜像版本】 0518-server 2.问题现象描述 服务器通过vncserver:1.service服务启动的vnc服务后,普通用户用vnc连接时,锁屏后,然后输入登陆密码会报密码错误&…

写博客复制黏贴的模板

Armv8/Armv9架构从入门到精通,Armv8/Armv9架构从入门到精通(一期),Armv8/Armv9架构从入门到精通(二期) Armv8/Armv9架构从入门到精通(三期),Arm一期、Arm二期、学习资料、…

计算机网络---第十一天

生成树协议 stp作用: 作用:stp用于解决二层环路问题。 BPDU: 含义:桥协议数据单元,用于传递stp协议相关报文 分类:配置bpdu---用于传递stp的配置信息 tcn bpdu---用于通告拓扑变更信息 包含信息&…

2024.04.24 完成的任务

今天在菜鸟教程学了这些内容。。。具体内容如下: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>我的联通</title><head></head></head><body><h1>中国联通&…

用AI给“高品质”加速,爱奇艺长期主义的又一程

「 AI时代,爱奇艺心态稳定,路线清晰。 」2023年卷大模型,2024年卷应用。作为新质生产力,生成式AI正在千行百业落地——看上去离AI更近的影视行业,也被市场持续注视。 环境的变化催着行业跑起来,谁起跑更早,谁跑得更稳?身处变局中的人多少都闻到一些焦虑的味道。在这样的…

【Web安全之机器学习】①分析邮箱数据

Enron数据集:https://www2.aueb.gr/users/ion/data/enron-spam/ Enron(安然公司)在2001年宣告破产之前,拥有约21000名雇员,曾是世界上最大的电力、天然气以及电讯公司之一,2000年披露的营业额达1010亿美元之巨。公司连续六年被财富杂志评选为“美国最具创新精神公司”,然…

Windows编程系列:设备I/O

Windows设备 在Windows平台下,设备被定义为能够与之进行通信的任何东西。最常见的 I/O 设备包括:文件、文件流、目录、物理磁盘、卷、控制台缓冲区、磁带驱动器、通信资源、mailslot 和管道等。 平常我们使用的文件,目录都可以称之为设备。本文是介绍设备的通用操作,以文件…

【C 数据结构】二叉树

文章目录 【 1. 基本原理 】1.1 二叉树的性质1.2 满二叉树1.3 完全二叉树 【 2. 二叉树的顺序存储结构 】2.1 完全二叉树的顺序存储2.2 普通二叉树的顺序存储2.3 完全二叉树的还原 【 3. 二叉树的链式存储结构 】【 4. 二叉树的先序遍历 】4.1 递归实现4.2 非递归实现 【 5. 二…

Modbus转Profinet网关接电表与工控机通讯

Modbus转Profinet网关(XD-MDPN100/300)的主要功能是实现Modbus协议和Profinet协议之间的转换和通信。Modbus转Profinet网关集成了Modbus和Profinet两种协议,支持Modbus RTU主站/从站,并可以与RS485接口的设备,如变频器、智能高低压电器、电量测量装置等进行连接。同时,它…

安全中级-初开始

一、网络基础 重要点&#xff1a;TTL值&#xff08;防环&#xff0c;linux64.Windows128 &#xff09;&#xff0c;IP数据包包头格式字节&#xff08;20&#xff09; 标识标志偏移量起到什么作用&#xff08;数据超过1500会分片&#xff09; wireshack抓包会有一个MSS&#x…

面试被刷,原因居然是不会Git

大家好,我是知微! 假设你是一个刚入行的菜狗程序员,正在开发一个软件。现在老板需要你加一些功能,此时的你有一些担忧,如果对代码进行大刀阔斧的改动,最终却失败了。之前能正常运行的代码也被改得乱七八糟的,跑不起来了,那可咋办? 聪明的你想到了一个绝妙的主意,那就…

风格迁移adaIN 和iT的adaLN

文章目录 BN、LN、IN、GN的区别![](https://img-blog.csdnimg.cn/direct/d38c005616f145cba2aa1c4c2e046be0.png)图像风格迁移adaINDiT adaLN BN、LN、IN、GN的区别 BatchNorm&#xff1a;batch方向做归一化&#xff0c;算NxHxW的均值&#xff0c;对小batchsize效果不好&#x…

【pytorch学习】之线性神经网络-线性回归

线性神经网络 【摘要】在介绍深度神经网络之前,我们需要了解神经网络训练的基础知识。我们将介绍神经网络的整个训练过程,包括:定义简单的神经网络架构、数据处理、指定损失函数和如何训练模型。为了更容易学习,我们将从经典算法————线性神经网络开始,介绍神经网络的基…

分布式事务的实现方式

分布式事务的5种实现方式XA方案 TCc方案 本地方法表 可靠性消息最终一致性方案 最大努力通知方案1.两阶段提交/XA方案 所谓的 XA 方案,即:两阶段提交,有一个事务管理器的概念,负责协调多个数据库(资源管理器)的事务,事务管理器先问问各个数据库你准备好了吗?如果每个数…

使用shared lib将各个构建工具集成到一起

共享库代码 package devopsdef Build(buildType, buildShell){def buildTools ["mvn": "MVN", "ant": "ANT", "gradle": "GRADLE"]println("当前buildType是${buildType}")buildHome tool buildTool…

恶补《操作系统》2_1——王道学习笔记

2操作系统-进程 2.1_1 进程的定义、组成、组织方式、特征 组成&#xff1a;PCB&#xff08;进程存在唯一的标志&#xff09;&#xff0c;程序段&#xff0c;数据段 组织方式&#xff1a;链接方式&#xff0c;指针指向不同的队列&#xff1b;索引方式&#xff0c;索引表 特征…

检索增强生成(RAG)技术

随着大语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域的显著进步&#xff0c;它们在多个评估基准测试中显示出超越人类水平的语言和知识掌握能力。然而&#xff0c;这些模型在实际应用中也面临着一系列挑战&#xff0c;如制造事实、知识更…

【简单介绍下PostCSS】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

2024/4/24团队开发

讨论:我们的想法暂时很简单,目前认为完成项目比较简单,不知道后期会不会上难度,把场景搭建好之后,就开始结合ai,以及发送消息给手机号。 燃尽图:60%

前端使用 Konva 实现可视化设计器(7)- 导入导出、上一步、下一步

请大家动动小手,给我一个免费的 Star 吧~ 这一章实现导入导出为JSON文件、另存为图片、上一步、下一步。 github源码 gitee源码 示例地址导出为JSON文件 提取需要导出的内容getView() {// 复制画布const copy = this.render.stage.clone()// 提取 main layer 备用const main =…