如何让recognize_google正确识别Discord语音聊天录制的音频
Discord语音转文字识别失败的解决方法
核心问题:音频格式不兼容
Discord语音采用Opus编码传输,而recognize_google要求输入PCM格式的音频(16kHz采样率、单声道、16位深度)。直接读取录制文件的原始字节流是Opus数据,无法被Google识别服务解析,这是最常见的失败原因。
分步解决方案
1. 安装必要依赖
需要解码Opus音频并处理格式转换,安装以下包:
pip install py-cord SpeechRecognition pydub
注:pydub需要ffmpeg支持,Windows/macOS可直接下载ffmpeg并添加到环境变量,Linux通过包管理器安装(如apt install ffmpeg)
2. 修改回调函数,添加音频格式转换
在once_done回调中,先将Opus音频解码并转换为符合要求的PCM格式,再传入recognize_google:
import speech_recognition as sr from pydub import AudioSegment import io async def once_done(sink, channel): recognizer = sr.Recognizer() for user_id, file in sink.audio_files.items(): # 重置文件指针到起始位置 file.fp.seek(0) # 读取Opus音频并解码 opus_audio = AudioSegment.from_file(file.fp, format="opus") # 转换为Google识别要求的格式:16kHz、单声道、16位 target_audio = opus_audio.set_frame_rate(16000)\ .set_channels(1)\ .set_sample_width(2) # 将转换后的音频导出为WAV字节流 pcm_stream = io.BytesIO() target_audio.export(pcm_stream, format="wav") pcm_stream.seek(0) # 创建AudioData并识别 audio_data = sr.AudioData(pcm_stream.read(), 16000, 2) try: # 可指定语言,比如zh-CN识别中文 text = recognizer.recognize_google(audio_data, language="zh-CN") await channel.send(f"<@{user_id}> 说:{text}") except sr.UnknownValueError: await channel.send(f"<@{user_id}> 的语音无法识别") except sr.RequestError as e: await channel.send(f"识别服务请求失败:{str(e)}")
3. 优化识别准确率的额外措施
- 提升音量:如果录制的语音音量过小,可在转换格式前添加增益:
target_audio = target_audio + 15 # 增加15dB音量,根据实际情况调整 - 降噪处理:用
speech_recognition的降噪功能预处理音频:# 在创建AudioData后添加 audio_data = recognizer.adjust_for_ambient_noise(audio_data, duration=0.5) - 权限检查:确保Bot拥有
CONNECT、SPEAK、RECORD_AUDIO权限,否则无法正常录制音频。
内容的提问来源于stack exchange,提问作者Lederer Guy
相关产品推荐
相关产品推荐

