如何在Python中将Telegram语音转换为WAV文件?(报错求助)
看起来你在处理Telegram Bot接收的OGG语音转WAV格式时,遇到了soundfile库的读取错误。先把你的代码和报错信息整理出来:
你的代码
def ReceiveVoice(bot, update, user_data): voice = bot.getFile(update.message.voice.file_id) voice.download('file.ogg') data, samplerate = sf.read('file.ogg') sf.write('file.wav', data, samplerate)
报错信息
File "C:\Python27\lib\site-packages\soundfile.py", line 257, in read
subtype, endian, format, closefd) as f:
File "C:\Python27\lib\site-packages\soundfile.py", line 624, in init...
问题分析
Telegram发送的语音文件是OPUS编码的OGG容器格式,而你使用的Python2.7对应的soundfile版本大概率比较老旧,它依赖的libsndfile库可能不支持OPUS编码的文件读取,这是导致报错的核心原因。另外Python2.7已经停止官方维护,很多库的更新都不再支持它,这也会加剧兼容性问题。
可行解决方案
1. 升级依赖(环境允许的话优先尝试)
如果你的项目还能调整环境,建议先迁移到Python3.x,然后安装最新版的soundfile:
pip install --upgrade soundfile
如果必须坚守Python2.7,尝试更新soundfile,并确保系统安装了支持OPUS编码的libsndfile版本(Windows用户可以找带OPUS支持的预编译libsndfile二进制包替换现有文件)。
2. 改用ffmpeg转换(更稳定的跨平台方案)
ffmpeg对音频编码的支持非常全面,完全不受libsndfile的限制,是处理这类转换更可靠的选择。你可以用subprocess调用ffmpeg命令来完成转换:
import subprocess def ReceiveVoice(bot, update, user_data): voice = bot.getFile(update.message.voice.file_id) ogg_path = 'file.ogg' wav_path = 'file.wav' voice.download(ogg_path) # 调用ffmpeg将OPUS-OGG转换为WAV subprocess.run([ 'ffmpeg', '-i', ogg_path, '-acodec', 'pcm_s16le', '-ar', '44100', # 指定PCM编码和44.1kHz采样率 wav_path ], check=True)
注意:需要先在你的系统上安装ffmpeg,并确保它在系统环境变量的PATH中,这样Python才能找到并调用它。
3. 先验证文件完整性
有时候网络问题可能导致下载的OGG文件不完整,你可以在读取前先检查文件是否有效:
import os def ReceiveVoice(bot, update, user_data): voice = bot.getFile(update.message.voice.file_id) ogg_path = 'file.ogg' voice.download(ogg_path) # 检查文件是否为空 if os.path.getsize(ogg_path) == 0: print("下载的语音文件为空,可能是网络问题") return # 尝试转换并捕获异常 try: data, samplerate = sf.read(ogg_path) sf.write('file.wav', data, samplerate) except Exception as e: print(f"转换失败: {str(e)}")
内容的提问来源于stack exchange,提问作者Francesco




