使用sherpa-ncnn进行中文语音识别(ubuntu22)

2024-06-21 23:04

本文主要是介绍使用sherpa-ncnn进行中文语音识别(ubuntu22),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

语音大模型专栏总目录

        获取该开源项目的渠道,是我在b站上,看到了由csukuangfj制作的一套语音识别视频。以下地址均为csukuangfj在视频中提供,感谢分享!

新一代Kaldi + RISC-V: VisionFive2 上的实时中英文语音识别_哔哩哔哩_bilibili

开源项目地址:GitHub - k2-fsa/sherpa-ncnn: Real-time speech recognition using next-gen Kaldi with ncnn without Internet connection. Support iOS, Android, Raspberry Pi, VisionFive2, LicheePi4A etc.

文档地址:Python API — sherpa 1.3 documentation

该开源项目可以在linux\windows\ios\安卓使用

我用的机器是ubuntu22虚拟机进行测试

        请注意,需要首先安装安装了所有必要的依赖项,包括 CMake、Git 和一个合适的 C/C++ 编译器。如果遇到任何问题,您可以查看 sherpa-ncnn 的 GitHub 仓库(Issues · k2-fsa/sherpa-ncnn · GitHub)或相关文档获取帮助。

        使用sherpa-ncnn前,安装并编译过kaldi,所以在编译sherpa-ncnn前只安装了cmake

        安装命令如下:

sudo apt install cmake

其他依赖如需安装,可以参考kaldi的相关依赖安装

详细解析Ubuntu22 部署Kaldi大模型-CSDN博客

一、安装sherpa-ncnn

(!!!按照文档写的,使用python的同志直接跳过,看二、使用sherpa-ncnn的python API实现语音识别)

按照要求,执行安装命令:

(一)下载sherpa-ncnn脚本文件

git clone https://github.com/k2-fsa/sherpa-ncnn

(二)编译 

1. 进入sherpa-ncnn文件夹后,新建build文件并进入build目录

cd sherpa-ncnn
mkdir build
cd build

 2. 配置编译

cmake -DCMAKE_BUILD_TYPE=Release ..

3. 开始编译

make -j 6

编译后结果显示如下:

编译后,在bin文件夹获得这两个文件:

 4.(可选)剥离二进制文件: 

        您可以通过 strip 命令减小二进制文件的大小,移除调试符号

        回到sherpa-ncnn文件夹中,执行下列命令:

strip bin/sherpa-ncnn
strip bin/sherpa-ncnn-microphone

二、使用sherpa-ncnn的Python API实现语音识别

         参考Python API — sherpa 1.3 documentation 

        我们将实现如下工作:

                实时语音识别

                识别一个文件

(一) 安装必备软件及依赖

         在Linux或Windows上使用时,python版本必须>=3.6       

        如果您使用方法1,它将安装预编译的库。缺点是它可能没有针对您的平台进行优化,而优点是您不需要安装cmake或C++编译器。

        对于其他方法,需要先执行以下命令:

        安装cmake:

pip install cmake

         C++编译器,例如在Linux和macOS上的GCC,在Windows上的Visual Studio,这里我们使用的ubuntu22所以安装gcc

sudo apt update
sudo apt install build-essential

    build-essential 包含了编译 C 和 C++ 程序所需的工具,其中就包括 GCC。

安装完成后,您可以通过以下命令来检查 GCC 的版本,以确保它已正确安装:

gcc --version

(二)安装 Python 包 sherpa-ncnn

 1. 方法1

        安装sherpa-ncnn包

pip install sherpa-ncnn

        安装完毕显示如下:

2. 方法2

        下载并进入sherpa-ncnn文件夹

git clone https://github.com/k2-fsa/sherpa-ncnn
cd sherpa-ncnn

        执行安装命令(按照官网说法没有使用sudo命令,会报错)

sudo python3 setup.py install

3. 方法3

        直接使用以下命令进行安装

pip install git+https://github.com/k2-fsa/sherpa-ncnn

4. 方法4(适用于开发者和嵌入式开发板)

        针对不同平台,有不同的安装方式。

 

        使用ubuntu22平台,使用x86_64的安装方法

# 下载sherpa-ncnn
git clone https://github.com/k2-fsa/sherpa-ncnn
# 进入sherpa-ncnn目录
cd sherpa-ncnn
# 新建build目录
mkdir build
# 进入build目录
cd build# 配置编译
cmake \-D SHERPA_NCNN_ENABLE_PYTHON=ON \-D SHERPA_NCNN_ENABLE_PORTAUDIO=OFF \-D BUILD_SHARED_LIBS=ON \..
# 开始编译
make -j6

        配置环境变量

export PYTHONPATH=$PWD/lib:$PWD/../sherpa-ncnn/python:$PYTHONPATH

5. 检查安装是否成功

(1)检查方法1

        使用命令,导入sherpa-ncnn和_sherpa_ncnn两个包,并显示其所在路径

python3 -c "import sherpa_ncnn; print(sherpa_ncnn.__file__)"
python3 -c "import _sherpa_ncnn; print(_sherpa_ncnn.__file__)"

         执行完毕显示如下:

(2)检查方法2

        使用命令,显示sherpa-ncnn的版本号

python3 -c "import sherpa_ncnn; print(sherpa_ncnn.__version__)"

        执行后显示如下:

(三)实时语音识别

        安装python图形化编译器geany,命令如下:

sudo apt install geany
1.实时语音识别(使用麦克风)
(1)环境配置
        A. 设置虚拟机共享主机麦克风

                a.在VirtualBox虚拟机窗口右下角,点击音频,在声音输入上打勾

                 b.在ubuntu22声音设置中,声音输入选择“line in”,并关掉设置窗口。 

        B. 测试麦克风 
rec test.wav

         使用"Ctrl+C"结束录音,可以直接双击test.wav文件进行播放,检查刚才是否已经将声音录制进去。

        C. 安装python声音设备驱动包,命令如下:
pip install sounddevice
         D. 让python命令可以直接调用python3,执行如下命令
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
        E. 安装portaudio(我在后面的执行中的出现了报错,显示sounddevice不包括protaudio,解决办法就是单独安装一下),命令如下
sudo apt install portaudio19-dev

(2)使用下列代码

可以直接从这里下载代码:https://github.com/k2-fsa/sherpa-ncnn/blob/master/python-api-examples/speech-recognition-from-microphone.py

在shell窗口中输入geany,打开编译器。复制代码并另存为speech-recognition-from-microphone.py(该文件只有在sherpa-ncnn下可以使用)

import systry:import sounddevice as sd
except ImportError as e:print("Please install sounddevice first. You can use")print()print("  pip install sounddevice")print()print("to install it")sys.exit(-1)import sherpa_ncnndef create_recognizer():# Please replace the model files if needed.# See https://k2-fsa.github.io/sherpa/ncnn/pretrained_models/index.html# for download links.recognizer = sherpa_ncnn.Recognizer(tokens="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/tokens.txt",encoder_param="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/encoder_jit_trace-pnnx.ncnn.param",encoder_bin="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/encoder_jit_trace-pnnx.ncnn.bin",decoder_param="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/decoder_jit_trace-pnnx.ncnn.param",decoder_bin="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/decoder_jit_trace-pnnx.ncnn.bin",joiner_param="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/joiner_jit_trace-pnnx.ncnn.param",joiner_bin="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/joiner_jit_trace-pnnx.ncnn.bin",num_threads=4,)'''# 可以使用这里的代码,将浮点16位,改为8位recognizer = sherpa_ncnn.Recognizer(tokens="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/tokens.txt",encoder_param="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/encoder_jit_trace-pnnx.ncnn.int8.param",encoder_bin="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/encoder_jit_trace-pnnx.ncnn.int8.bin",decoder_param="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/decoder_jit_trace-pnnx.ncnn.param",decoder_bin="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/decoder_jit_trace-pnnx.ncnn.bin",joiner_param="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/joiner_jit_trace-pnnx.ncnn.int8.param",joiner_bin="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/joiner_jit_trace-pnnx.ncnn.int8.bin",num_threads=4,'''return recognizerdef main():print("Started! Please speak")recognizer = create_recognizer()sample_rate = recognizer.sample_ratesamples_per_read = int(0.1 * sample_rate)  # 0.1 second = 100 mslast_result = ""with sd.InputStream(channels=1, dtype="float32", samplerate=sample_rate) as s:while True:samples, _ = s.read(samples_per_read)  # a blocking readsamples = samples.reshape(-1)recognizer.accept_waveform(sample_rate, samples)result = recognizer.textif last_result != result:last_result = resultprint(result)if __name__ == "__main__":devices = sd.query_devices()print(devices)default_input_device_idx = sd.default.device[0]print(f'Use default device: {devices[default_input_device_idx]["name"]}')try:main()

(3)创建识别器:使用模型: csukuangfj/sherpa-ncnn-conv-emformer-transducer-2022-12-06 (Chinese + English) 可以同时识别英语和中文。
A. 进入sherpa-ncnn目录
cd /path/to/sherpa-ncnn
B.执行下列命令,下载模型
wget https://github.com/k2-fsa/sherpa-ncnn/releases/download/models/sherpa-ncnn-conv-emformer-transducer-2022-12-06.tar.bz2
tar xvf sherpa-ncnn-conv-emformer-transducer-2022-12-06.tar.bz2
(4)执行语音识别功能

进入sherpa-ncnn目录

执行speech-recognition-from-microphone.py脚本,命令如下:

python speech-recognition-from-microphone.py

(四)识别一个Wav文件

wav文件要求:波形文件的采样率必须是 16 kHz。此外,它应该只包含一个通道,并且采样应该以 16 位(即 int16)编码。

1. 获得脚本

        下载脚本地址:https://github.com/k2-fsa/sherpa-ncnn/blob/master/python-api-examples/decode-file.py

         也可以复制下面脚本内容到decode-file.py(该文件只有在sherpa-ncnn下可以使用)

import waveimport numpy as np
import sherpa_ncnndef main():recognizer = sherpa_ncnn.Recognizer(tokens="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/tokens.txt",encoder_param="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/encoder_jit_trace-pnnx.ncnn.param",encoder_bin="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/encoder_jit_trace-pnnx.ncnn.bin",decoder_param="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/decoder_jit_trace-pnnx.ncnn.param",decoder_bin="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/decoder_jit_trace-pnnx.ncnn.bin",joiner_param="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/joiner_jit_trace-pnnx.ncnn.param",joiner_bin="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/joiner_jit_trace-pnnx.ncnn.bin",num_threads=4,)'''# 可以使用这里的代码,将浮点16位,改为8位       recognizer = sherpa_ncnn.Recognizer(tokens="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/tokens.txt",encoder_param="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/encoder_jit_trace-pnnx.ncnn.int8.param",encoder_bin="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/encoder_jit_trace-pnnx.ncnn.int8.bin",decoder_param="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/decoder_jit_trace-pnnx.ncnn.param",decoder_bin="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/decoder_jit_trace-pnnx.ncnn.bin",joiner_param="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/joiner_jit_trace-pnnx.ncnn.int8.param",joiner_bin="./sherpa-ncnn-conv-emformer-transducer-2022-12-06/joiner_jit_trace-pnnx.ncnn.int8.bin",num_threads=4,
)'''filename = ("./sherpa-ncnn-conv-emformer-transducer-2022-12-06/test_wavs/1.wav")with wave.open(filename) as f:assert f.getframerate() == recognizer.sample_rate, (f.getframerate(),recognizer.sample_rate,)assert f.getnchannels() == 1, f.getnchannels()assert f.getsampwidth() == 2, f.getsampwidth()  # it is in bytesnum_samples = f.getnframes()samples = f.readframes(num_samples)samples_int16 = np.frombuffer(samples, dtype=np.int16)samples_float32 = samples_int16.astype(np.float32)samples_float32 = samples_float32 / 32768recognizer.accept_waveform(recognizer.sample_rate, samples_float32)tail_paddings = np.zeros(int(recognizer.sample_rate * 0.5), dtype=np.float32)recognizer.accept_waveform(recognizer.sample_rate, tail_paddings)recognizer.input_finished()print(recognizer.text)if __name__ == "__main__":main()
2. 执行脚本

        执行decode-file.py脚本,将对sherpa-ncnn//sherpa-ncnn-conv-emformer-transducer-2022-12-06/test_wavs/1.wav文件进行转换

python decode-file.py

        执行结果如下:

3. 替换指定文件路径

如果想要对指定文件进行转换,可以修改脚本红框内容为想要转换的wav文件的路径

要了解预训练模型以获取更多模型,可以参考Pre-trained models — sherpa 1.3 documentation

这篇关于使用sherpa-ncnn进行中文语音识别(ubuntu22)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1082589

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]