qwen-audio语音转写失败需按五步排查:一、用ffmpeg统一转为16khz单声道16位wav;二、用modelscope api快速验证;三、用transformers手动构建多模态输入;四、长语音用滑动窗口分段处理;五、后处理校正数字、术语与分词。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您尝试使用Qwen-Audio对语音输入进行识别与转写,但结果出现错漏、延迟或无法响应,则可能是由于音频格式不兼容、采样率不匹配、预处理缺失或模型加载异常所致。以下是解决此问题的步骤:
一、确认音频输入格式与参数规范
Qwen-Audio对原始音频有明确的格式与参数要求,不符合标准会导致解析失败或识别质量显著下降。模型默认接受单声道、16位PCM编码、采样率为16kHz的WAV文件;若输入为MP3、AAC等压缩格式,必须先解码转换。
1、使用ffmpeg将任意格式音频统一转为标准WAV:
ffmpeg -i input.mp3 -ac 1 -ar 16000 -acodec pcm_s16le output.wav
2、验证输出文件参数:
ffprobe -v quiet -show_entries stream=codec_type,sample_rate,channels,bits_per_sample output.wav
3、确保输出中显示codec_type=audio、sample_rate=16000、channels=1、bits_per_sample=16,任一参数不符均需重新转换。
二、使用ModelScope API进行端到端语音转写
ModelScope提供封装好的推理接口,自动完成音频加载、特征提取与文本生成,适合快速验证与轻量集成,无需手动构造输入张量。
1、安装modelscope并导入必要模块:
pip install modelscope==1.9.5
2、编写调用脚本,加载Qwen-Audio-Chat模型:
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
asr_pipeline = pipeline(task=Tasks.audio_asr, model='qwen/Qwen-Audio-Chat')
3、执行转写:
result = asr_pipeline('output.wav')
print(result['text'])
该方式自动适配音频时长,支持最长120秒单段语音,且无需显式指定device参数。
三、基于Transformers手动构建输入张量
当需要精细控制音频特征(如截取片段、叠加掩码、注入上下文提示)时,应绕过高层pipeline,直接调用AutoProcessor与AutoModelForCausalLM,自行组织多模态输入结构。
1、加载处理器与模型:
from transformers import AutoProcessor, AutoModelForCausalLM
processor = AutoProcessor.from_pretrained('Qwen/Qwen-Audio', trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained('Qwen/Qwen-Audio', trust_remote_code=True, device_map='auto')
2、读取音频并构造输入:
import torchaudio
audio, sr = torchaudio.load('output.wav')
if sr != 16000: audio = torchaudio.transforms.Resample(sr, 16000)(audio)
inputs = processor(audio=audio, text="请转写这段语音。", return_tensors='pt')
3、执行前向推理:
inputs = {k: v.to(model.device) for k, v in inputs.items()}
generated_ids = model.generate(**inputs, max_new_tokens=128)
transcript = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
注意:text参数不可为空,必须提供有效指令;若需方言或领域术语增强,可在text中加入类似“使用四川话转写”“含专业医学术语”等提示。
四、处理长语音的分段与上下文拼接
Qwen-Audio原生支持最大约120秒音频输入,超出部分需切片处理。但简单截断会导致语义断裂与标点丢失,须采用滑动窗口+重叠抑制策略维持连贯性。
1、使用librosa按时间戳切分音频(保留0.5秒重叠):
import librosa
y, sr = librosa.load('long_audio.wav', sr=16000)
chunk_length = 16000 * 115 # 115秒
overlap = 16000 * 0.5
chunks = [y[i:i + chunk_length] for i in range(0, len(y), chunk_length - overlap)]
2、逐段送入模型获取结果:
all_texts = []
for i, chunk in enumerate(chunks):
torchaudio.save(f'chunk_{i}.wav', torch.tensor(chunk).unsqueeze(0), 16000)
text = asr_pipeline(f'chunk_{i}.wav')['text']
all_texts.append(text)
3、合并时去除重复句首与冗余标点:
final_text = '。'.join([t.strip().rstrip('。') for t in all_texts])
重叠段仅用于上下文锚定,最终输出中每个chunk贡献唯一主干句,避免机械拼接。
五、修复常见转写错误的后处理方法
即使模型输出基本准确,仍可能出现同音字误判、数字格式混乱、专有名词失真等问题。这些属于语言层错误,应在模型输出后引入规则驱动的矫正模块。
1、识别并标准化中文数字与阿拉伯数字混用:
import re
text = re.sub(r'零|一|二|三|四|五|六|七|八|九|十', lambda m: {'零':'0','一':'1','二':'2','三':'3','四':'4','五':'5','六':'6','七':'7','八':'8','九':'9','十':'10'}[m.group(0)], text)
2、构建领域词典强制替换(以医疗场景为例):
medical_dict = {'心电图': 'ECG', '血常规': 'CBC', 'CT': 'CT'}
for cn, en in medical_dict.items():
text = text.replace(cn, en)
3、使用jieba进行分词后校验实体边界:
import jieba
words = list(jieba.cut(text))
# 过滤孤立单字、合并连续数字字母组合
该步骤必须在模型输出后立即执行,不可嵌入模型推理流程中。











