Sherpa-ONNX
扫码查看

一个无需联网即可实现语音识别和语音合成的工具

Sherpa-ONNX

综合介绍

sherpa-onnx 是一个基于新一代 Kaldi 框架的开源语音处理工具包。 它专门设计用于在没有网络连接的离线环境中运行,通过利用 ONNX Runtime 实现高效的神经网络计算。 该项目的核心优势在于其卓越的跨平台能力,能够广泛支持包括服务器端的 Linux、Windows,桌面端的 macOS,移动端的 Android、iOS、HarmonyOS,以及各种嵌入式设备,如树莓派和基于 RISC-V 架构的硬件。sherpa-onnx 不仅仅是一个语音识别(ASR)工具,它还整合了语音合成(TTS)、声纹识别、语音活动检测(VAD)、语音增强和关键词识别等多种功能,为开发者提供了一个功能全面且无需依赖云服务的本地化语音解决方案。该项目支持多达12种编程语言,包括 C++, Python, Java, C# 和 Swift 等,极大地降低了在不同应用中集成本地语音功能的门槛。

功能列表

  • 语音识别 (ASR): 支持流式和非流式两种模式,能够进行实时的语音转文字。同时支持多种语言,并提供了丰富的预训练模型。
  • 语音合成 (TTS): 可以将文本转换为自然流畅的语音。
  • 声纹分离 (Speaker Diarization): 能够识别和区分音频中的不同说话人。
  • 语音活动检测 (VAD): 用于检测音频流中是否包含语音,可有效过滤静音片段。
  • 关键词识别 (Keyword Spotting): 用于检测特定的唤醒词或关键词。
  • 语音增强 (Speech Enhancement): 提升嘈杂环境中的语音清晰度。
  • 多语言支持: 提供了覆盖中文、英文、日文、韩文等多种语言的预训练模型。
  • 跨平台兼容: 支持在 x86_64, ARM32/64, RISC-V 等不同架构的硬件上运行,覆盖主流操作系统和嵌入式平台。
  • 多语言编程接口: 提供包括 C++, C, Python, Java, C#, Swift, Go 在内的12种编程语言接口。

使用帮助

sherpa-onnx 的强大之处在于它将复杂的语音处理模型打包成易于使用的工具,让开发者可以轻松地在各种项目中集成。以下是详细的使用帮助,旨在让用户能快速上手。

核心概念

sherpa-onnx 的工作流程主要分为三步:

  1. 选择并下载模型:根据你的需求(如语言、任务、性能要求)从官方发布的预训练模型列表中选择合适的模型。这些模型都是 .onnx 格式。
  2. 加载模型:在你的代码中,通过 sherpa-onnx 提供的 API 加载这些模型文件。
  3. 执行任务:将你的音频数据(来自文件或麦克风)输入给加载好的模型,并获取结果,如识别的文本或合成的语音。

环境准备与安装

sherpa-onnx 支持多种集成方式,最简单的方式是使用预编译好的库或通过包管理器安装。

对于 Python 用户 (最常见):可以通过 pip 直接安装,这是最快捷的方式。

pip install sherpa-onnx

对于 C++ / C# / Java 等其他语言用户:你需要从项目的 GitHub Releases 页面下载对应你的操作系统和硬件架构的预编译库文件。仓库中也提供了详细的编译脚本(如 build-*.sh),如果你需要针对特定环境进行编译,可以按照官方文档的指引从源码构建。

基本功能操作流程

1. 进行语音识别 (ASR)

以下以 Python 为例,演示如何使用 sherpa-onnx 对一个 WAV 音频文件进行识别。

第一步:下载预训练模型你需要从 sherpa-onnx 的模型库中下载一个语音识别模型。例如,我们选择一个支持中英双语的流式 Zipformer 模型。下载后,你会得到一个包含 .onnx 文件和 tokens.txt 等配置文件的文件夹。

第二步:编写 Python 代码创建一个 Python 文件,例如 test_asr.py,然后输入以下代码。请确保将模型文件的路径和音频文件路径修改为你的实际路径。

import sherpa_onnx
def main():
# 1. 定义识别器配置
# 请将以下路径替换为你下载的模型文件的实际路径
recognizer_config = sherpa_onnx.RecognizerConfig(
encoder_path="/path/to/your/encoder.onnx",
decoder_path="/path/to/your/decoder.onnx",
joiner_path="/path/to/your/joiner.onnx",
tokens_path="/path/to/your/tokens.txt",
use_gpu=False, # 如果有兼容的 GPU 并安装了 onnxruntime-gpu,可以设为 True
)
# 2. 创建识别器实例
recognizer = sherpa_onnx.Recognizer(recognizer_config)
# 3. 读取音频文件
# 请将此路径替换为你的 WAV 音频文件路径
# 注意:音频文件必须是单声道,采样率需与模型要求匹配(通常是 16000 Hz)
with open("test_audio.wav", "rb") as f:
# 读取整个文件
audio_data = f.read()
# 4. 创建音频流并输入数据
stream = recognizer.create_stream()
stream.accept_waveform(16000, audio_data)
# 告知识别器所有音频都已输入
stream.input_finished()
# 5. 解码并输出结果
result = recognizer.get_result(stream)
print(f"识别结果: {result.text}")
if __name__ == "__main__":
main()

第三步:运行脚本在终端中运行该脚本,即可看到对音频文件的识别结果。

python test_asr.py

2. 进行语音合成 (TTS)

语音合成的流程同样简单。

第一步:下载 TTS 模型从模型库下载一个 TTS 模型。TTS 模型通常包含一个 .onnx 模型文件和一个 tokens.txt 词汇表文件。

第二步:编写 Python 代码创建一个 test_tts.py 文件。

import sherpa_onnx
def main():
# 1. 定义 TTS 配置
# 请将以下路径替换为你下载的 TTS 模型的实际路径
tts_config = sherpa_onnx.TtsConfig(
model=sherpa_onnx.TtsModelConfig(
model="/path/to/your/tts_model.onnx",
tokens="/path/to/your/tokens.txt",
use_gpu=False,
)
)
# 2. 创建 TTS 实例
tts = sherpa_onnx.Tts(tts_config)
# 3. 定义要合成的文本和说话人 ID
text = "你好,欢迎使用sherpa-onnx进行语音合成。"
speaker_id = 0  # 对于多说话人模型,可以改变此 ID
speed = 1.0     # 语速,1.0 为正常语速
# 4. 生成音频
audio = tts.generate(text, sid=speaker_id, speed=speed)
# 5. 保存音频到文件
# audio.samples 是一个 NumPy 数组,audio.sample_rate 是采样率
with open("generated_audio.wav", "wb") as f:
f.write(audio.samples.tobytes())
print(f"音频已生成并保存为 generated_audio.wav,采样率: {audio.sample_rate}")
if __name__ == "__main__":
main()

第三步:运行脚本python test_tts.py运行后,当前目录下会生成一个名为 generated_audio.wav 的文件,即合成的语音。

在其他平台和语言中使用

仓库的 c-api-examplescxx-api-examplesjava-api-examples 等文件夹中包含了大量其他语言的示例代码,你可以直接参考这些示例来将 sherpa-onnx 集成到你的项目中。对于移动端开发,项目也提供了预编译的 Android APK 和 Flutter 示例程序,可以直接安装体验。

应用场景

  1. 智能家居与物联网设备在树莓派、ESP32 等算力有限的嵌入式设备上部署,实现离线语音控制家电、查询信息等功能,无需依赖云端服务,保证了响应速度和用户隐私。
  2. 车载娱乐与导航系统在汽车的车机系统中集成离线语音识别和合成功能,让驾驶员可以通过语音操作导航、播放音乐,不受网络信号影响,提升驾驶安全。
  3. 个人隐私保护应用开发完全在本地运行的笔记应用或语音助手,所有语音数据都在用户设备上处理,避免了将敏感个人信息上传到云端的风险。
  4. 教育与语言学习工具制作语言学习应用,利用语音识别功能判断发音准确性,或通过语音合成功能提供标准的单词和句子朗读,整个过程完全离线,适合在任何环境下使用。

QA

  1. sherpa-onnx 需要付费吗?sherpa-onnx 是一个开源项目,基于 Apache-2.0 许可,可以免费用于个人和商业项目。
  2. 我应该如何为我的项目选择合适的模型?选择模型时需要考虑几个因素:首先是语言,确保模型支持你需要识别或合成的语言;其次是任务,是需要流式识别(实时转写)还是非流式识别(文件转写);最后是性能,模型名称中通常会包含大小信息(如 smalllarge),在性能和准确率之间做出权衡,嵌入式设备通常选择较小的模型。
  3. sherpa-onnx 支持在浏览器里运行吗?是的,sherpa-onnx 支持 WebAssembly (WASM),这意味着它可以直接在现代浏览器中运行。官方提供了多个基于 WebAssembly 的 Hugging Face Spaces 演示页面,用户无需安装任何东西,在浏览器里就能体验其功能。
  4. 与其他语音识别工具相比,sherpa-onnx 的主要优势是什么?其主要优势在于完全离线卓越的跨平台性。它能在从服务器到微型嵌入式设备的几乎所有平台上运行,并提供了极其丰富的编程语言接口,这使得将它集成到任何项目中都变得非常简单。
微信微博Email复制链接