-
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="./pretrained_models/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch",
disable_update=True,
vad_model="./pretrained_models/speech_fsmn_vad_zh-cn-16k-common-pytorch",
vad_kwargs={"max_single_segment_time": 60000},
)
def generate_asr(speech_url, hotword):
res = model.generate(input=speech_url,
batch_size_s=300,
batch_size_threshold_s=60,
hotword=hotword
)
res = rich_transcription_postprocess(res[0]["text"])
return res
if __name__ == "__main__":
res = generate_asr("https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/vad_example.wav")
print(res)使用这个示例配置推理一个长18分钟的视频,返回结果是完全不搭边的胡言乱语。 |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment
-
|
这里主要混淆了 VAD 切段 和 切段后的动态 batching:
当前实现也是按这个顺序执行:先得到 VAD 片段,再依据后两个参数组织 batch(源码、batch 逻辑)。 你现在的 另外, from funasr import AutoModel
model = AutoModel(
model="./pretrained_models/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch",
vad_model="./pretrained_models/speech_fsmn_vad_zh-cn-16k-common-pytorch",
vad_kwargs={"max_single_segment_time": 30000},
disable_update=True,
)
def generate_asr(audio_path, hotword=""):
res = model.generate(
input=audio_path,
batch_size_s=60,
batch_size_threshold_s=30,
hotword=hotword,
)
return res[0]["text"]
print(generate_asr("input_16k.wav"))排查视频容器/解码差异时,建议先固定成 16 kHz、单声道 PCM WAV 再跑同一配置: ffmpeg -i input.mp4 -vn -ac 1 -ar 16000 -c:a pcm_s16le input_16k.wav如果改成 30 秒切段后仍复现,请补充:
这样可以继续区分是 VAD 边界、原视频音轨/采样率,还是具体音频片段本身的问题。 |
Beta Was this translation helpful? Give feedback.
这里主要混淆了 VAD 切段 和 切段后的动态 batching:
max_single_segment_time:VAD 允许的单个语音片段最大时长,单位毫秒;这是三者中真正控制“最长切段”的参数。batch_size_s:VAD 切完后,一个动态 batch 的总音频时长预算,单位秒;它不会再切音频。batch_size_threshold_s:某个 VAD 片段超过该阈值时,让它单独组成一个 batch,单位秒;它同样不会把片段截短。当前实现也是按这个顺序执行:先得到 VAD 片段,再依据后两个参数组织 batch(源码、batch 逻辑)。
你现在的
max_single_segment_time=60000允许连续语音以最长 60 秒的片段送进 Paraformer;而文档说明模型输入通常应控制在 30 秒以内(参数说明)。这与“18 分钟文件异常、截出的短片正常”的现象吻合。建议先把最长 VAD 片段降到 30 秒;连续讲话很多时可进一步试 15–20 秒。另外,
rich_transcription_postprocess是处理 SenseVoice 语言/情感/事件标签的后处理,当前 README 也只在 SenseVoiceSmall 示例中使用(示例)。Paraformer 的普通文本应直接读取res[0]["text"]。你贴出的__main__调用还少传了必需的hotword参数,下面顺便给它一个默认值: