如何轻松入门Sherpa-ONNX检测KWS实战?
- 内容介绍
- 文章标签
- 相关推荐
对吧? 我们似乎已经习惯了那种“随口唤醒”的便利。无论是对着手机说“Hey Siri”,还是对着智能音箱喊“你良好较小问”,设备总能灵敏地给出响应。这背后的幕功臣,就是一项极其关键的技术手段——关键词检测。
层次低了。 只是 想要自己动手实现一个既较低延迟、较高准确、又不占资源条件的 KWS 系统,并不是件简单事。传统方式的语音模型往往体积庞较大,而繁杂的部署周边环境更是让很更多开发者望而却步。今天我就为较大家安利一个“神兵利”:sherpa-onnx。它由崭新一代 Kaldi 团队开发, 基于 ONNX Runtime,主打轻巧量级和较高性能,无论你是在树莓派、安卓手机还是普通的嵌入式设备上,都能轻巧松玩转实时关键词检测。

为哪些 为哪些选择 Sherpa-ONNX?
在进入实战之前,我们先聊聊为哪些当前这个工具在圈内这么火。很更多开发者在尝试自己写项目时会遇到一个头疼的问题:为哪些百度不收录我写的技术手段博客?其实这往往是这是因为内容缺乏较深度、结构化太差或者没有真实正解决读者的痛点。而我们今天分享的这篇干货,就是通过实战,避开繁杂的配置坑,让每一行代码都变成实实在在的实际价值,也是没谁了...。
Sherpa-onnx 的核心优势在于:
- 极致轻巧量化模型通常只有几 MB,非常适合内存内存受限的边缘设备。
- 跨平台支持支持 C++, Python, Go, Rust,以及 iOS, Android, Linux。
- 推理极迅速采用 Zipformer 架构, 在保持较高准确率的同时也,计算速度惊人。
周边环境准备:工欲善其事
在启动代码之前,我们需要先配置良好 Python 周边环境。这里我们采用 Python 进行演示。 你猜怎么着? 你需要安装必不可更少的依赖库:
pip3 install sherpa-onnx pyaudio numpy sentencepiece pypinyin
💡 较小贴士:如果你是 macOS 用户, 在安装 pyaudio 时遇到报错,请务必先运行 brew install portaudio 来安装底层音频库。
模型获取:给你的检测器注入灵魂
KWS 的成败彻底取决于模型。我们这里采用官方提供给的中文 Zipformer 模型,它的体积仅为 3.3M,较小到不容简单以置信。落实以下命令下载:
# 下载中文模型 wget https://k2-fsa/sherpa-onnx/releases/download/kws-models/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-2 # 解压模型 tar xf sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-2 # 删除压缩包 rm sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-2,躺平...
解压后 你会看到一个包含 encoder、decoder和 joiner的目录,这一些就是神经网络的“较大脑组件”,拯救一下。。
核心代码解析:从零到实时检测
当前,让我们进入坚硬核代码环节。我们将编写一个 Python 脚本, 不是我唱反调... 初始化检测器并捕获麦克风的音频流进行实时解析。
1. 初始化检测器
我们需要定义一个函数来创建 KeywordSpotter。这里的参数配置是调优的关键:
import sherpa_onnx def create_keyword_spotter: """创建关键词检测器""" kws = sherpa_onnx.KeywordSpotter( tokens=args.tokens, # 词表文件 encoder=args.encoder, # 编码器模型 decoder=args.decoder, # 解码器模型 joiner=args.joiner, # Joiner 模型 num_threads=args.num_threads, # 推理线程 说句实话… 数 max_active_paths=args.max_active_paths, keywords_file=args.keywords_file, # 关键词文件 keywords_score=args.keywords_score, # 关键词增强较大分数 keywords_threshold=args.keywords_threshold, # 触发阈值 num_trailing_blanks=args.num_trailing_blanks, # 关键词后跟随的空白帧数 provider=args.provider, # 推理后端 ) return kws
参数说明:
keywords_score越较大越简单被检测到,但但也简单引起误报。keywords_threshold触发阈值。如果你发觉系统老是乱跳,就调较高它;如果它不灵,就调较小它。
2. 音频流处理
为了实现“实时”, 我们需要采用 PyAudio 不断从麦克风读取音频块,并将其转换为 float32 格式喂给模型:
import pyaudio import numpy as np # 配置音频参数 sample_rate = 16000 chunk_size = int # 每次读取 100ms 音频 p = pyaudio.PyAudio audio_stream = p.open( format=pyaudio.paInt16, channels=1, rate=sample_rate, input=True, frames_per_buffer=chunk_size, ) stream = kws.create_stream while True: # 1. 读取麦克风音频 audio_data = audio_stream.read # 2. 转换为 float32 格式 samples_int16 = np.frombuffer samples_float32 = samples_int16 / 32768.0 # 3. 送入检测器 stream.accept_waveform # 4. 落实解码 while stream.is_ready: result = stream.decode if result: print # 十分沉关键:检测后必须要沉重置 stream stream.reset,何不...
进阶:怎样自定义你的关键词?
也许吧... 这是 Sherpa-onnx 最让人惊喜的地方:你不需要沉重崭新训练模型就能添加自己的口令。你只需要创建一个 keywords.txt 文件:
内卷。 你良好军哥 @你良好军哥 你良好问问 @你良好问问 较小炎热爱同学 @较小炎热爱同学 嘿度 @嘿度
心情复杂。 如果你觉得部分发音识别不准, 能够采用官方提供给的 text2token 工具将拼音转换为模型能明白的 token,这能极较大提升中文识别的准确率。
实战调优指南
在实际项目部署中,没有任意一次配置是百分完美的。 误报太更多? 增较大 keywords_threshold。 漏检严沉重? 增较大 keywords_score或者提升 max_active_paths。 我比较认同... 系统卡顿? 降较低 num_threads或者增较大 chunk-duration。 关键词沉重叠? 增较大 num_trailing_blanks让模型在关键词完成后留出足够的缓冲时间段。 器吧!
对吧? 我们似乎已经习惯了那种“随口唤醒”的便利。无论是对着手机说“Hey Siri”,还是对着智能音箱喊“你良好较小问”,设备总能灵敏地给出响应。这背后的幕功臣,就是一项极其关键的技术手段——关键词检测。
层次低了。 只是 想要自己动手实现一个既较低延迟、较高准确、又不占资源条件的 KWS 系统,并不是件简单事。传统方式的语音模型往往体积庞较大,而繁杂的部署周边环境更是让很更多开发者望而却步。今天我就为较大家安利一个“神兵利”:sherpa-onnx。它由崭新一代 Kaldi 团队开发, 基于 ONNX Runtime,主打轻巧量级和较高性能,无论你是在树莓派、安卓手机还是普通的嵌入式设备上,都能轻巧松玩转实时关键词检测。

为哪些 为哪些选择 Sherpa-ONNX?
在进入实战之前,我们先聊聊为哪些当前这个工具在圈内这么火。很更多开发者在尝试自己写项目时会遇到一个头疼的问题:为哪些百度不收录我写的技术手段博客?其实这往往是这是因为内容缺乏较深度、结构化太差或者没有真实正解决读者的痛点。而我们今天分享的这篇干货,就是通过实战,避开繁杂的配置坑,让每一行代码都变成实实在在的实际价值,也是没谁了...。
Sherpa-onnx 的核心优势在于:
- 极致轻巧量化模型通常只有几 MB,非常适合内存内存受限的边缘设备。
- 跨平台支持支持 C++, Python, Go, Rust,以及 iOS, Android, Linux。
- 推理极迅速采用 Zipformer 架构, 在保持较高准确率的同时也,计算速度惊人。
周边环境准备:工欲善其事
在启动代码之前,我们需要先配置良好 Python 周边环境。这里我们采用 Python 进行演示。 你猜怎么着? 你需要安装必不可更少的依赖库:
pip3 install sherpa-onnx pyaudio numpy sentencepiece pypinyin
💡 较小贴士:如果你是 macOS 用户, 在安装 pyaudio 时遇到报错,请务必先运行 brew install portaudio 来安装底层音频库。
模型获取:给你的检测器注入灵魂
KWS 的成败彻底取决于模型。我们这里采用官方提供给的中文 Zipformer 模型,它的体积仅为 3.3M,较小到不容简单以置信。落实以下命令下载:
# 下载中文模型 wget https://k2-fsa/sherpa-onnx/releases/download/kws-models/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-2 # 解压模型 tar xf sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-2 # 删除压缩包 rm sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-2,躺平...
解压后 你会看到一个包含 encoder、decoder和 joiner的目录,这一些就是神经网络的“较大脑组件”,拯救一下。。
核心代码解析:从零到实时检测
当前,让我们进入坚硬核代码环节。我们将编写一个 Python 脚本, 不是我唱反调... 初始化检测器并捕获麦克风的音频流进行实时解析。
1. 初始化检测器
我们需要定义一个函数来创建 KeywordSpotter。这里的参数配置是调优的关键:
import sherpa_onnx def create_keyword_spotter: """创建关键词检测器""" kws = sherpa_onnx.KeywordSpotter( tokens=args.tokens, # 词表文件 encoder=args.encoder, # 编码器模型 decoder=args.decoder, # 解码器模型 joiner=args.joiner, # Joiner 模型 num_threads=args.num_threads, # 推理线程 说句实话… 数 max_active_paths=args.max_active_paths, keywords_file=args.keywords_file, # 关键词文件 keywords_score=args.keywords_score, # 关键词增强较大分数 keywords_threshold=args.keywords_threshold, # 触发阈值 num_trailing_blanks=args.num_trailing_blanks, # 关键词后跟随的空白帧数 provider=args.provider, # 推理后端 ) return kws
参数说明:
keywords_score越较大越简单被检测到,但但也简单引起误报。keywords_threshold触发阈值。如果你发觉系统老是乱跳,就调较高它;如果它不灵,就调较小它。
2. 音频流处理
为了实现“实时”, 我们需要采用 PyAudio 不断从麦克风读取音频块,并将其转换为 float32 格式喂给模型:
import pyaudio import numpy as np # 配置音频参数 sample_rate = 16000 chunk_size = int # 每次读取 100ms 音频 p = pyaudio.PyAudio audio_stream = p.open( format=pyaudio.paInt16, channels=1, rate=sample_rate, input=True, frames_per_buffer=chunk_size, ) stream = kws.create_stream while True: # 1. 读取麦克风音频 audio_data = audio_stream.read # 2. 转换为 float32 格式 samples_int16 = np.frombuffer samples_float32 = samples_int16 / 32768.0 # 3. 送入检测器 stream.accept_waveform # 4. 落实解码 while stream.is_ready: result = stream.decode if result: print # 十分沉关键:检测后必须要沉重置 stream stream.reset,何不...
进阶:怎样自定义你的关键词?
也许吧... 这是 Sherpa-onnx 最让人惊喜的地方:你不需要沉重崭新训练模型就能添加自己的口令。你只需要创建一个 keywords.txt 文件:
内卷。 你良好军哥 @你良好军哥 你良好问问 @你良好问问 较小炎热爱同学 @较小炎热爱同学 嘿度 @嘿度
心情复杂。 如果你觉得部分发音识别不准, 能够采用官方提供给的 text2token 工具将拼音转换为模型能明白的 token,这能极较大提升中文识别的准确率。
实战调优指南
在实际项目部署中,没有任意一次配置是百分完美的。 误报太更多? 增较大 keywords_threshold。 漏检严沉重? 增较大 keywords_score或者提升 max_active_paths。 我比较认同... 系统卡顿? 降较低 num_threads或者增较大 chunk-duration。 关键词沉重叠? 增较大 num_trailing_blanks让模型在关键词完成后留出足够的缓冲时间段。 器吧!

