Python SpeechRecognition识别音频仅输出前30秒就截断如何解决
问题原因和解决方案
核心原因
- Azure 语音服务的短音频识别接口(也就是
SpeechRecognition库封装的recognize_azure调用的接口)单次请求最多支持30秒音频输入,超过长度的音频会被服务端自动截断,和你本地设置的pause_threshold、duration等参数无关。 pause_threshold参数仅用于实时麦克风识别场景下的停顿判断,本地文件全量读取时该参数不会生效,调整它无法解决截断问题。
前置排查项
先确认你导出的converted.wav文件本身是完整的:用本地播放器打开试听,确认80秒音频没有在导出环节被截断。导出时建议补充参数将音频转为语音识别兼容的格式,降低识别出错概率:
clip.audio.write_audiofile(r"converted.wav", ffmpeg_params=["-ac", "1", "-ar", "16000"])
上面的参数会把音频转为单声道、16kHz采样率的WAV格式,符合绝大多数语音识别服务的输入要求。
解决方法
方法1:音频分块识别(无需更换依赖)
将完整音频切分为小于30秒的分片,逐片识别后拼接结果,可直接复用你现有SpeechRecognition的调用逻辑。
首先安装音频处理依赖:pip install pydub
修改后的完整代码如下:
import speech_recognition as sr import moviepy.editor as mp from pydub import AudioSegment import os # 导出标准格式的音频文件 clip = mp.VideoFileClip(r"recording2.webm") clip.audio.write_audiofile(r"converted.wav", ffmpeg_params=["-ac", "1", "-ar", "16000"]) # 按25秒长度切分音频,预留5秒余量避免触发30秒限制 full_audio = AudioSegment.from_wav("converted.wav") chunk_duration = 25 * 1000 # 单位为毫秒 audio_chunks = [full_audio[i:i+chunk_duration] for i in range(0, len(full_audio), chunk_duration)] r = sr.Recognizer() full_transcript = "" # 逐块识别并拼接结果 for index, chunk in enumerate(audio_chunks): temp_chunk_path = f"temp_{index}.wav" chunk.export(temp_chunk_path, format="wav") with sr.AudioFile(temp_chunk_path) as source: audio_data = r.record(source) try: chunk_text = r.recognize_azure(audio_data, key=AZUREKEY, language="en-US", show_all=False, location="westeurope") full_transcript += chunk_text + " " except Exception as e: print(f"第{index}块识别失败:{str(e)}") # 删除临时分片文件 os.remove(temp_chunk_path) print(full_transcript)
方法2:使用Azure官方语音SDK
如果需要处理更长的音频、或者需要更高的识别稳定性,可以直接使用Azure官方的语音SDK,内置长音频连续识别能力,不需要手动切分音频。
内容的提问来源于stack exchange,提问作者eeveepotato
相关产品推荐
相关产品推荐

