Python开发者必备:sherpa-onnx语音识别教程
引言:告别复杂配置,拥抱轻量级语音识别
你是否还在为语音识别项目的繁琐配置而头疼?是否因模型部署的硬件限制而束手束脚?sherpa-onnx的出现,彻底改变了这一局面。作为一款基于ONNX(Open Neural Network Exchange)格式的语音识别工具包,sherpa-onnx以其跨平台、低资源消耗、零依赖的特性,成为Python开发者处理语音任务的理想选择。
本文将带你从零开始,掌握sherpa-onnx的核心功能与高级应用,让你在半小时内搭建起工业级语音识别系统。读完本文,你将能够:
- 快速部署离线/在线语音识别模型
- 实现麦克风实时语音转写
- 生成视频字幕与语音增强处理
- 优化模型性能以适应不同硬件环境
技术选型:为什么选择sherpa-onnx?
在深度学习模型层出不穷的今天,选择合适的语音识别工具至关重要。sherpa-onnx凭借以下优势脱颖而出:
跨平台兼容性
sherpa-onnx支持x86、ARM、RISC-V等多种架构,可运行于Linux、Windows、macOS、Android、iOS等操作系统,甚至支持WebAssembly在浏览器中直接运行。
多语言API支持
提供Python、C++、Java、Go等12种编程语言接口,满足不同开发场景需求。对于Python开发者,可直接通过pip安装,无需复杂编译过程。
丰富的功能集
涵盖语音识别(ASR)、文本转语音(TTS)、说话人识别、语音活动检测(VAD)等全方位语音处理能力。
轻量级部署
模型体积小,资源占用低,可在树莓派等嵌入式设备上高效运行,实时性强。
环境准备:5分钟快速上手
安装sherpa-onnx
通过pip命令一键安装:
pip install sherpa-onnx
验证安装
import sherpa_onnx
print(sherpa_onnx.__version__)
若输出版本号,则表示安装成功。
获取模型文件
sherpa-onnx支持多种预训练模型,可从项目仓库获取。以中文语音识别为例,推荐使用以下模型:
# 克隆项目仓库
git clone https://gitcode.com/GitHub_Trending/sh/sherpa-onnx
cd sherpa-onnx
# 下载中文语音识别模型(示例)
./scripts/download-pretrained-models.sh
核心功能实战
1. 离线文件识别
离线识别适用于处理已录制好的音频文件,支持wav、mp3等多种格式。以下是使用Whisper模型进行离线识别的示例:
import sherpa_onnx
def offline_asr(encoder_path, decoder_path, tokens_path, audio_path):
# 创建识别器
recognizer = sherpa_onnx.OfflineRecognizer.from_whisper(
encoder=encoder_path,
decoder=decoder_path,
tokens=tokens_path,
num_threads=4,
language="zh",
task="transcribe"
)
# 读取音频文件
import wave
with wave.open(audio_path, 'rb') as f:
sample_rate = f.getframerate()
num_channels = f.getnchannels()
sample_width = f.getsampwidth()
num_frames = f.getnframes()
audio_data = f.readframes(num_frames)
# 转换音频格式
import numpy as np
audio = np.frombuffer(audio_data, dtype=np.int16).astype(np.float32) / 32768.0
# 创建流并识别
stream = recognizer.create_stream()
stream.accept_waveform(sample_rate, audio)
recognizer.decode_stream(stream)
return stream.result.text
# 使用示例
result = offline_asr(
encoder_path="sherpa-onnx-whisper-base/encoder.onnx",
decoder_path="sherpa-onnx-whisper-base/decoder.onnx",
tokens_path="sherpa-onnx-whisper-base/tokens.txt",
audio_path="test.wav"
)
print("识别结果:", result)
支持的模型类型
sherpa-onnx支持多种模型架构,可根据需求选择:
| 模型类型 | 特点 | 适用场景 |
|---|---|---|
| Whisper | 多语言支持,高精度 | 通用语音识别 |
| Paraformer | 轻量级,低延迟 | 实时语音识别 |
| SenseVoice | 中文优化,高精度 | 中文语音识别 |
| Moonshine | 流式识别,低资源 | 嵌入式设备 |
2. 实时麦克风语音识别
实时语音识别是许多应用的核心功能,如语音助手、实时字幕等。以下示例展示如何从麦克风实时获取音频并进行识别:
import sherpa_onnx
import sounddevice as sd
import numpy as np
def realtime_asr(encoder_path, decoder_path, tokens_path):
# 创建识别器
recognizer = sherpa_onnx.OnlineRecognizer.from_transducer(
encoder=encoder_path,
decoder=decoder_path,
joiner=joiner_path,
tokens=tokens_path,
num_threads=4,
sample_rate=16000,
feature_dim=80,
decoding_method="greedy_search"
)
# 配置麦克风
sample_rate = 16000
channels = 1
blocksize = int(sample_rate * 0.1) # 100ms
# 创建音频流
stream = recognizer.create_stream()
def callback(indata, frames, time, status):
if status:
print(status, file=sys.stderr)
# 将音频数据送入识别器
stream.accept_waveform(sample_rate, indata.flatten())
# 检查是否有识别结果
while recognizer.is_ready(stream):
recognizer.decode_stream(stream)
result = recognizer.get_result(stream)
if result:
print("\r" + result.text, end="", flush=True)
# 启动录音
with sd.InputStream(samplerate=sample_rate, channels=channels, callback=callback, blocksize=blocksize):
print("开始说话... (按Ctrl+C停止)")
while True:
pass
# 使用示例
realtime_asr(
encoder_path="sherpa-onnx-streaming-zipformer/encoder.onnx",
decoder_path="sherpa-onnx-streaming-zipformer/decoder.onnx",
joiner_path="sherpa-onnx-streaming-zipformer/joiner.onnx",
tokens_path="sherpa-onnx-streaming-zipformer/tokens.txt"
)
3. 语音活动检测(VAD)与端点检测
VAD技术可用于检测音频中的语音片段,去除静音部分,提高识别效率。以下示例展示如何结合VAD进行语音识别:
import sherpa_onnx
import numpy as np
def vad_asr(vad_model_path, asr_model_path, tokens_path, audio_path):
# 配置VAD
vad_config = sherpa_onnx.VadModelConfig()
vad_config.silero_vad.model = vad_model_path
vad_config.silero_vad.min_silence_duration = 0.25 # 250ms静音判断为结束
vad_config.sample_rate = 16000
vad = sherpa_onnx.VoiceActivityDetector(vad_config)
# 配置ASR
asr = sherpa_onnx.OfflineRecognizer.from_paraformer(
paraformer=asr_model_path,
tokens=tokens_path,
num_threads=4
)
# 读取音频文件
audio, sample_rate = sherpa_onnx.read_wave(audio_path)
# 处理音频
window_size = vad_config.silero_vad.window_size
buffer = []
results = []
for i in range(0, len(audio), window_size):
frame = audio[i:i+window_size]
if len(frame) < window_size:
break
vad.accept_waveform(frame)
while not vad.empty():
# 获取语音片段
segment = vad.front
vad.pop()
# 识别语音片段
stream = asr.create_stream()
stream.accept_waveform(sample_rate, segment.samples)
asr.decode_stream(stream)
results.append({
"start_time": segment.start / sample_rate,
"end_time": (segment.start + len(segment.samples)) / sample_rate,
"text": stream.result.text
})
return results
# 使用示例
segments = vad_asr(
vad_model_path="silero_vad.onnx",
asr_model_path="sherpa-onnx-paraformer/model.onnx",
tokens_path="sherpa-onnx-paraformer/tokens.txt",
audio_path="test.wav"
)
# 打印结果
for i, seg in enumerate(segments):
print(f"片段 {i+1}: {seg['start_time']:.2f}s - {seg['end_time']:.2f}s")
print(f"内容: {seg['text']}\n")
4. 视频字幕生成
利用sherpa-onnx的VAD和ASR能力,可以轻松实现视频字幕生成功能:
import sherpa_onnx
import subprocess
import numpy as np
from pathlib import Path
def generate_subtitles(video_path, output_path, vad_model_path, asr_model_path, tokens_path):
# 从视频中提取音频
audio_path = "temp_audio.wav"
subprocess.run([
"ffmpeg", "-i", video_path, "-f", "s16le", "-acodec", "pcm_s16le",
"-ac", "1", "-ar", "16000", audio_path
], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
# 使用VAD+ASR处理音频
segments = vad_asr(vad_model_path, asr_model_path, tokens_path, audio_path)
# 生成SRT字幕文件
with open(output_path, "w", encoding="utf-8") as f:
for i, seg in enumerate(segments):
f.write(f"{i+1}\n")
start = format_time(seg['start_time'])
end = format_time(seg['end_time'])
f.write(f"{start} --> {end}\n")
f.write(f"{seg['text']}\n\n")
# 清理临时文件
Path(audio_path).unlink()
return output_path
def format_time(seconds):
hours = int(seconds // 3600)
minutes = int((seconds % 3600) // 60)
seconds = seconds % 60
return f"{hours:02d}:{minutes:02d}:{seconds:06.3f}".replace(".", ",")
# 使用示例
generate_subtitles(
video_path="input.mp4",
output_path="output.srt",
vad_model_path="silero_vad.onnx",
asr_model_path="sherpa-onnx-paraformer/model.onnx",
tokens_path="sherpa-onnx-paraformer/tokens.txt"
)
高级应用:构建完整语音交互系统
1. 语音助手架构
以下是一个基于sherpa-onnx的语音助手系统架构图:
2. 多模型集成
sherpa-onnx支持同时加载多个模型,实现更复杂的语音处理任务。例如,结合说话人识别实现会议记录:
import sherpa_onnx
def meeting_transcription(audio_path, vad_model, asr_model, sid_model, tokens_path):
# 初始化VAD、ASR和说话人识别模型
vad = sherpa_onnx.VoiceActivityDetector(vad_model)
asr = sherpa_onnx.OfflineRecognizer.from_paraformer(asr_model, tokens_path)
speaker_embedding = sherpa_onnx.SpeakerEmbeddingExtractor.from_tdnn(sid_model)
# 处理音频,获取语音片段
segments = vad_process(audio_path, vad)
# 对每个片段进行说话人识别和语音识别
results = []
speakers = {}
speaker_id = 0
for seg in segments:
# 提取说话人特征
embedding = speaker_embedding.extract(seg["samples"])
# 说话人聚类
speaker = None
for id, emb in speakers.items():
if cosine_similarity(embedding, emb) > 0.8:
speaker = id
break
if speaker is None:
speaker = speaker_id
speakers[speaker_id] = embedding
speaker_id += 1
# 语音识别
text = asr_recognize(seg["samples"], asr)
results.append({
"start_time": seg["start_time"],
"end_time": seg["end_time"],
"speaker": speaker,
"text": text
})
return results
性能优化策略
模型选择
根据应用场景选择合适的模型:
| 模型 | 大小 | 实时性 | 准确率 | 适用场景 |
|---|---|---|---|---|
| tiny | ~10MB | 极高 | 中等 | 嵌入式设备 |
| base | ~100MB | 高 | 高 | 移动端应用 |
| large | ~1GB | 中 | 极高 | 服务器端应用 |
参数调优
- 线程数调整:根据CPU核心数设置合理的线程数
- 解码方法选择:greedy_search速度快,modified_beam_search准确率高
- 特征参数调整:如梅尔频谱维度、采样率等
硬件加速
sherpa-onnx支持多种硬件加速方式:
# 使用CUDA加速
recognizer = sherpa_onnx.OfflineRecognizer.from_whisper(
encoder="encoder.onnx",
decoder="decoder.onnx",
tokens="tokens.txt",
provider="cuda" # 使用CUDA加速
)
# 使用CoreML加速(macOS/iOS)
recognizer = sherpa_onnx.OfflineRecognizer.from_whisper(
encoder="encoder.onnx",
decoder="decoder.onnx",
tokens="tokens.txt",
provider="coreml" # 使用CoreML加速
)
常见问题与解决方案
1. 识别准确率低
- 尝试使用更大的模型
- 调整音频采样率与模型要求一致
- 使用VAD去除静音部分
- 增加音频前处理(如降噪)
2. 实时性差
- 使用更小的模型
- 减少线程数
- 优化解码方法
- 降低特征维度
3. 模型加载失败
- 检查模型文件路径是否正确
- 确认模型版本与sherpa-onnx版本兼容
- 检查ONNX Runtime是否支持相应硬件
总结与展望
sherpa-onnx为Python开发者提供了一个功能强大、易于使用的语音识别工具包。通过本文的介绍,你已经掌握了sherpa-onnx的核心功能和应用方法,能够快速构建从简单语音识别到复杂语音交互系统的各种应用。
随着语音技术的不断发展,sherpa-onnx也在持续更新,未来将支持更多模型类型和硬件平台。建议关注项目仓库以获取最新动态,同时参与社区交流,分享你的应用案例和使用经验。
最后,附上一些实用资源:
- 项目仓库:https://gitcode.com/GitHub_Trending/sh/sherpa-onnx
- 预训练模型:项目仓库中的models目录
- 示例代码:python-api-examples目录下的各种示例脚本
- 技术交流:项目README中提供的微信群和QQ群
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



