SenseVoice-small-onnx语音识别参数详解:language/use_itn/batch_size深度解析

今天咱们来聊聊一个非常实用的语音识别工具——SenseVoice-small-onnx。你可能已经把它部署起来了,Web界面也能打开,API也能调通,但面对那一堆参数,是不是有点懵?尤其是languageuse_itnbatch_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模式和指定对应语言模式的结果通常非常接近,甚至一样。因为模型的语言检测能力很强。

那什么时候必须指定?

  1. 音频质量很差:背景噪音大、说话人口音很重时,语言自动检测可能会“猜错”。如果你知道真实语言,直接指定会提升识别准确率。
  2. 超短语音:比如只有一个单词的音频,模型缺乏足够信息判断语言,此时指定语言更靠谱。
  3. 追求极致性能:跳过“语言检测”这一步,直接进入识别环节,理论上会快一丢丢(虽然感觉不明显)。

一句话建议:除非你有明确理由,否则就用 language="auto",让它智能处理。

3. 参数二:use_itn - 让数字和符号“说人话”

use_itn 是个布尔值参数,只能是 TrueFalse。它控制是否进行“逆文本正则化”。

这名字听起来挺唬人,其实干的事儿很简单:把识别出来的原始文本,转换成更符合人类阅读和书写习惯的形式。

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=FalseTrue:取决于你是否需要提取数字信息。如果只是做内容概要,可以关闭。
  • 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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐