You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python中将Telegram语音转换为WAV文件?(报错求助)

解决Telegram语音文件转WAV时soundfile报错的问题

看起来你在处理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

火山引擎 最新活动