使用speech_recognition转WAV至文本遇Error 400,求本地解决方案
解决方案:本地处理WAV转文本避免Google接口报错
问题分析
你遇到的HTTP Error 400: Bad Request是因为Google免费语音识别接口有音频时长/大小限制,且依赖网络。哪怕2MB的文件如果时长过长(比如高采样率音频),也会触发限制导致请求失败。同时你原代码一次性上传整段音频,完全依赖在线服务,无法满足本地处理大文件的需求。
本地替代方案:使用Vosk离线模型
Vosk是开源离线语音识别工具,支持多语言(含德语de-DE),无时长/大小限制,完全本地运行,适合处理大音频文件。
步骤1:安装依赖
pip install vosk pydub
pydub用于音频格式转换(若需要),vosk负责本地识别。
步骤2:下载德语Vosk模型
下载适配的德语模型(如vosk-model-de-0.21),解压到本地目录并记录路径。
步骤3:本地识别代码
import vosk import wave import json def speech_to_text_local(filename, model_path): # 加载本地模型 model = vosk.Model(model_path) # 打开WAV文件 wf = wave.open(filename, "rb") # 校验音频格式(Vosk要求16kHz单声道PCM) if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getcomptype() != "NONE": print("请确保音频为16kHz单声道WAV格式") return rec = vosk.KaldiRecognizer(model, wf.getframerate()) rec.SetWords(True) # 可选:输出带时间戳的词 # 逐块读取音频并识别 result_text = [] while True: data = wf.readframes(4000) if len(data) == 0: break if rec.AcceptWaveform(data): res = json.loads(rec.Result()) result_text.append(res["text"]) # 处理剩余音频片段 final_res = json.loads(rec.FinalResult()) result_text.append(final_res["text"]) # 合并结果并保存 full_text = " ".join(result_text) with open("deruntertan.txt", "w+", encoding="utf-8") as af: af.write(full_text) print(full_text) return full_text # 调用:替换为你的WAV路径和模型解压路径 speech_to_text_local("untertanaudio.wav", "./vosk-model-de-0.21")
格式转换(若音频不符合要求)
如果你的WAV不是16kHz单声道,用pydub转换:
from pydub import AudioSegment def convert_audio(input_path, output_path): audio = AudioSegment.from_wav(input_path) audio = audio.set_frame_rate(16000).set_channels(1) audio.export(output_path, format="wav") # 先转换再识别 convert_audio("untertanaudio.wav", "converted_audio.wav") speech_to_text_local("converted_audio.wav", "./vosk-model-de-0.21")
原代码崩溃原因
recognize_google调用Google在线API,免费版严格限制音频时长(通常1分钟内)和大小,超出即返回400错误。- 2MB文件若为高采样率(如48kHz),时长可能超过限制,同样触发报错。
内容的提问来源于stack exchange,提问作者FoxOverflow
相关产品推荐
相关产品推荐

