SenseVoice-small-onnx语音识别参数详解:language/use_itn/batch_size深度解析
本文介绍了如何在星图GPU平台上自动化部署sensevoice-small-语音识别-onnx模型(带量化后)镜像,并深度解析了其核心参数。该镜像支持多语言语音识别,可高效应用于会议录音实时转写、批量生成字幕等场景,帮助用户快速构建智能语音处理应用。
SenseVoice-small-onnx语音识别参数详解:language/use_itn/batch_size深度解析
今天咱们来聊聊一个非常实用的语音识别工具——SenseVoice-small-onnx。你可能已经把它部署起来了,Web界面也能打开,API也能调通,但面对那一堆参数,是不是有点懵?尤其是language、use_itn、batch_size这几个,它们到底有什么用?怎么设置才对?
别担心,这篇文章就是为你准备的。我会用最直白的话,把这几个核心参数掰开揉碎了讲清楚,让你不仅知道怎么用,更明白为什么要这么用。咱们不聊复杂的理论,就讲实际应用,保证你看完就能用上。
1. 先认识一下SenseVoice-small-onnx
在深入参数之前,咱们先快速回顾一下这个工具是干什么的。
SenseVoice-small-onnx是一个基于ONNX量化格式的多语言语音识别服务。简单说,它能把你说的话(录音文件)快速、准确地转换成文字。它有几个特别吸引人的地方:
- 支持多语言:不仅能识别中文、英文,还能搞定粤语、日语、韩语,甚至能自动检测你说的到底是哪种语言(支持超过50种)。
- 速度快:官方说10秒的音频,推理只要70毫秒,在实际使用中确实感觉很快。
- 功能丰富:除了转文字,还能分析说话人的情感(比如高兴、生气),检测音频里的事件(比如笑声、掌声)。
- 开箱即用:提供了完整的Web界面和REST API,部署起来非常方便。
它的核心是一个叫做SenseVoiceSmall的模型,我们通过调整参数来告诉这个模型:“嘿,请按照我的要求来处理这段音频。”
接下来,我们就聚焦到三个最常用、也最容易让人困惑的参数上。
2. 参数一:language - 告诉模型“你在说什么语言”
language参数可能是你最常需要打交道的。它决定了模型用哪种“语言知识”来识别你的音频。
2.1 参数值怎么选?
这个参数接受一个字符串(string),常用的选项如下:
| 参数值 | 含义 | 适用场景 |
|---|---|---|
"auto" |
自动检测语言。模型会先分析音频,判断它最可能是哪种语言,再用对应的语言模型识别。 | 不确定音频语言时;处理多语言混合的音频流(效果可能有限)。这是最省心、最推荐的默认选项。 |
"zh" |
指定为中文(普通话)。模型会强制使用中文识别模型。 | 你100%确定音频内容全是普通话,想获得可能更准确的中文识别结果。 |
"en" |
指定为英语。 | 处理英文会议录音、英文播客等。 |
"yue" |
指定为粤语。 | 处理广东话、香港话的音频内容。 |
"ja" |
指定为日语。 | 处理日语音频。 |
"ko" |
指定为韩语。 | 处理韩语音频。 |
2.2 实际代码示例与对比
光看表格可能不直观,我们写点代码看看效果。
假设我们有一个中文录音 chinese_audio.wav 和一个英文录音 english_audio.wav。
from funasr_onnx import SenseVoiceSmall
# 初始化模型,指定模型路径
model_path = "/root/ai-models/danieldong/sensevoice-small-onnx-quant"
model = SenseVoiceSmall(model_path)
# 场景1:用`auto`让模型自己判断
files = ["chinese_audio.wav", "english_audio.wav"]
results_auto = model(files, language="auto")
print("【Auto模式结果】")
for i, r in enumerate(results_auto):
print(f"文件{i+1}: {r}")
# 场景2:明确指定语言
result_zh = model(["chinese_audio.wav"], language="zh")
result_en = model(["english_audio.wav"], language="en")
print("\n【指定语言结果】")
print(f"中文指定: {result_zh[0]}")
print(f"英文指定: {result_en[0]}")
你会看到什么?
对于清晰的中文或英文音频,auto模式和指定对应语言模式的结果通常非常接近,甚至一样。因为模型的语言检测能力很强。
那什么时候必须指定?
- 音频质量很差:背景噪音大、说话人口音很重时,语言自动检测可能会“猜错”。如果你知道真实语言,直接指定会提升识别准确率。
- 超短语音:比如只有一个单词的音频,模型缺乏足够信息判断语言,此时指定语言更靠谱。
- 追求极致性能:跳过“语言检测”这一步,直接进入识别环节,理论上会快一丢丢(虽然感觉不明显)。
一句话建议:除非你有明确理由,否则就用 language="auto",让它智能处理。
3. 参数二:use_itn - 让数字和符号“说人话”
use_itn 是个布尔值参数,只能是 True 或 False。它控制是否进行“逆文本正则化”。
这名字听起来挺唬人,其实干的事儿很简单:把识别出来的原始文本,转换成更符合人类阅读和书写习惯的形式。
3.1 ITN到底做了什么?
举个例子你就明白了:
- 你说了句:“今天花了三百五十块钱。”
- 没有ITN (
use_itn=False),模型可能输出:“今天花了三百五十块钱。” - 开启ITN (
use_itn=True),模型会输出:“今天花了350块钱。”
看,它把中文数字“三百五十”自动转换成了阿拉伯数字“350”。除此之外,它还能处理:
- 百分数:“百分之二十” → “20%”
- 日期:“二零二三年十月一日” → “2023年10月1日”
- 货币:“一千美元” → “1000美元”
- 分数:“三分之二” → “2/3”
- 单位:“十五公斤” → “15kg”
3.2 如何选择True还是False?
这个选择完全取决于你的下游用途。
| 选择 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
use_itn=True |
文本更规范,便于后续的数据分析、信息提取、存入数据库。数字可以直接用于计算。 | 转换可能不完全符合所有语境或特定领域习惯。 | 会议纪要转结构化数据、财务报告分析、生成字幕希望格式统一、为搜索或分析做准备。 |
use_itn=False |
保留原始口语化表述,更“原汁原味”。 | 文本中包含大量中文数字,不利于机器处理。 | 需要完全忠实于语音内容的记录,如司法笔录、心理访谈分析、纯粹为了阅读的速记。 |
3.3 代码示例
from funasr_onnx import SenseVoiceSmall
model = SenseVoiceSmall("/root/ai-models/danieldong/sensevoice-small-onnx-quant")
audio_with_numbers = "number_audio.wav" # 假设内容为“我的电话是幺三九零一二三四五六七”
result_no_itn = model([audio_with_numbers], language="zh", use_itn=False)
result_with_itn = model([audio_with_numbers], language="zh", use_itn=True)
print(f"关闭ITN: {result_no_itn[0]}") # 可能输出:“我的电话是幺三九零一二三四五六七”
print(f"开启ITN: {result_with_itn[0]}") # 可能输出:“我的电话是13901234567”
建议:如果你打算对识别出的文字做进一步处理(比如找里面的金额、日期),强烈建议开启 use_itn=True。如果只是给人看,可以按喜好选择。
4. 参数三:batch_size - 决定“一口吃多少”
batch_size 是一个整数参数,它在初始化模型时设置,而不是在每次调用时传入。它决定了模型一次同时处理多少条音频。
4.1 它如何影响性能?
你可以把它想象成食堂打饭的窗口。
batch_size=1:一个窗口,一次只服务一个人(处理一条音频)。效率低,但每个人都能立刻拿到饭(延迟低)。batch_size=10:还是那个窗口,但一次性能接10个人的饭盒,一起炒好再分(一次处理10条音频)。整体做饭时间平均到每个人身上更短(吞吐量高),但第一个拿到饭的人需要等一会儿(延迟增加)。
关键影响:
- 吞吐量 (Throughput):单位时间内能处理的总音频量。
batch_size越大,吞吐量通常越高。 - 延迟 (Latency):从提交一条音频到得到结果所需的时间。
batch_size越大,单条音频的延迟可能越高(因为要等“凑够一锅”)。
4.2 如何设置batch_size?
这里没有标准答案,只有最适合你场景的方案。
# 在初始化模型时设置batch_size
model_for_single = SenseVoiceSmall(model_path, batch_size=1) # 适合实时交互
model_for_batch = SenseVoiceSmall(model_path, batch_size=16) # 适合离线批量处理
场景化建议:
| 你的应用场景 | 推荐 batch_size |
原因 |
|---|---|---|
| 实时语音转写 (如直播字幕、语音助手) | 1 | 追求最低延迟,用户说完马上看到文字。 |
| API服务,接收零星请求 | 1 或 较小值(如4) | 平衡延迟和一定的并发处理能力。 |
| 离线批量处理 (如处理一个文件夹里100个录音文件) | 尽可能大的值(如16, 32) | 最大化利用计算资源,用最短总时间完成所有任务。你需要自己将文件列表分批喂给模型。 |
| 内存有限的环境 | 较小值(1-4) | batch_size 越大,一次性占用的内存越多。如果程序崩溃,尝试调小它。 |
一个批量处理的例子:
import os
from funasr_onnx import SenseVoiceSmall
model = SenseVoiceSmall(model_path, batch_size=10) # 设置为批量处理模式
audio_folder = "./recordings"
all_files = [os.path.join(audio_folder, f) for f in os.listdir(audio_folder) if f.endswith('.wav')]
# 手动将文件列表分成批次
batch_results = []
for i in range(0, len(all_files), 10): # 步长为batch_size
batch = all_files[i:i+10]
results = model(batch, language="auto", use_itn=True)
batch_results.extend(results)
print(f"已处理 {i+len(batch)}/{len(all_files)} 个文件")
print(f"全部处理完成,共{len(batch_results)}条结果。")
重要提示:batch_size 的“最佳值”取决于你的硬件(特别是GPU内存)。可以从一个适中的值(如8)开始测试,如果内存溢出(OOM),就调小;如果发现GPU利用率不高,且处理大量文件,可以尝试调大。
5. 总结:参数组合实战指南
好了,三个参数都讲完了。最后,我们把他们组合起来,看看在不同真实场景下应该如何配置。
5.1 场景一:制作会议录音字幕(实时性要求高)
language="auto":参会人可能中英文混杂。use_itn=True:让时间戳、金额等数字在字幕里显示得更规范。batch_size=1:在初始化模型时设置,确保每句话都能被尽快转写出来,降低延迟。- 调用方式:每收到一小段实时音频流,就立即调用一次API。
5.2 场景二:处理海外短视频平台的音频内容(批量、多语言)
language="auto":视频来自全球,语言未知,必须用自动检测。use_itn=False或True:取决于你是否需要提取数字信息。如果只是做内容概要,可以关闭。batch_size=16或更大:在初始化模型时设置。因为任务是离线批量处理几千个文件,目标是总耗时最短。- 调用方式:编写脚本,将文件分批(每批16个)送入模型处理。
5.3 场景三:搭建一个通用的语音转写API服务
language:作为API参数暴露给调用者,让调用方自己决定是传“auto”还是“zh”等。use_itn:同样作为API参数暴露,让调用方根据用途选择。batch_size=4:在服务端初始化模型时设置。这是一个折中的值,既能同时处理几个并发请求,又不会让单个请求等太久。- 调用方式:通过FastAPI暴露
/api/transcribe接口,接收客户端的音频文件和参数。
记住,技术参数是为业务目标服务的。先想清楚你要做什么,再回过头来调整这些“旋钮”,你会发现SenseVoice-small-onnx这个工具变得异常顺手。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐



所有评论(0)