【问题标题】:Python convert mp3 to wav with PydubPython 使用 Pydub 将 mp3 转换为 wav
【发布时间】:2015-08-18 13:04:48
【问题描述】:

好的,现在我正忙于将 mp3 转换为 wav。我已经看到了不同的答案,但我想我会选择 pydub,我已经使用这几行代码完成了

from pydub import AudioSegment

AudioSegment.from_mp3("/input/file.mp3").export("/output/file.wav", format="wav")

但是当我运行上面的代码时,我得到了以下错误

C:\Python27\lib\site-packages\pydub-0.14.2-py2.7.egg\pydub\utils.py:165: RuntimeWarning: 找不到 ffmpeg 或 avconv - 默认为 ffmpeg,但可能不工作

Traceback(最近一次调用最后一次): 文件“C:/Users/phourlhar/Desktop/VoiceDetector/yeah.py”,第 7 行,在 stereo_to_mono()

文件“C:\Users\phourlhar\Desktop\VoiceDetector\utils.py”,第 25 行,在 stereo_to_mono

sound = AudioSegment.from_mp3(PROJECT_DIR+'\\files\\rec'+str(c)+'.mp3')

文件“build\bdist.win32\egg\pydub\audio_segment.py”,第 346 行,在 来自文件

init 中的文件“C:\Python27\lib\subprocess.py”,第 711 行 读错,写错)

文件“C:\Python27\lib\subprocess.py”,第 948 行,在 _execute_child 中 启动信息)

WindowsError: [错误 2] 系统找不到指定的文件

我不知道为什么会引发此错误,因为我非常确定该文件存在。虽然我有建议安装 ffmpeg 的答案,但我不知道以后是否会以任何方式影响应用程序部署

【问题讨论】:

    标签: python audio pydub


    【解决方案1】:

    pydub 模块使用ffmpegavconf 程序进行实际转换。所以你必须安装ffmpeg 才能完成这项工作。

    但是如果你不需要pydub 做其他事情,你可以使用内置的subprocess 模块来调用像ffmpeg 这样的转换器程序:

      import subprocess
    
      subprocess.call(['ffmpeg', '-i', '/input/file.mp3',
                       '/output/file.wav'])
    

    顺便说一句,这要求 ffmpeg 二进制文件位于 $PATH 中的某个位置。

    编辑:据我所知,使用ffmeg,您无法将立体声转换为单声道。您只能选择左声道或右声道。我假设这不是你想要的。

    sox 程序可以将立体声转换为单声道:

      import subprocess
    
      subprocess.call(['sox', '/input/file.mp3', '-e', 'mu-law', 
                       '-r', '16k', '/output/file.wav', 'remix', '1,2'])
    

    这将以 16 kHz 采样,8 位/采样,为您提供 16 kb/s。

    【讨论】:

    • 谢谢,真的很有帮助。但现在我需要使用 subprocess 和 ffmpeg 将 mp3 文件直接转换为单声道 wav,如果你能帮忙,我将不胜感激
    • @user3760740 据我所知,您无法使用ffmpeg 将立体声输入转换为单声道输出。您可以使用 sox 执行此操作,请参阅更新的答案。
    • @RolandSmtih 谢谢,会检查“sox”。但是有没有办法我可以用 sox 强制输出为 16kb/s 单声道 wav
    • @user3760740 编码(sox -e 选项)和采样率(sox -r 选项)的不同组合可以实现这一点。请参阅manual。哪一个适合您的应用程序比我能说的要多。您可能必须尝试最适合您的方法。
    • @user3760740 我已经更新了我的答案,为 16 kb/s 提供了一个明显的选项。
    【解决方案2】:

    pydub你一定要去,它是一个很好的音频文件相关操作的模块。

    注意。记得在使用 pydub 之前安装 ffmpeg。

    有关安装 ffmpeg 的帮助,您可以使用此link

    然后要安装 pydub,只需打开命令提示符并键入

    pip install pydub
    

    然后将任何文件从 mp3 转换为 wav 只需使用 pydub as

    import pydub
    sound = pydub.AudioSegment.from_mp3("D:/example/apple.mp3")
    sound.export("D:/example/apple.wav", format="wav")
    

    【讨论】:

    • 我们可以做同样的操作,将音频流对象保存在内存中而不是写入文件吗?
    • 有点。 memfile = io.BytesIO(); sound.export(memfile, 'wav'); sound=AudioSegment.from_wav(memfile)
    • @user2647513 我在尝试打开该 memfile 时遇到 EOFError
    【解决方案3】:

    问题是由于缺少ffmpeg。 Pydub 要求它执行格式转换的操作。要解决这个问题,有两种方法:

    1. 只需使用 conda,而不是 pip 安装 pydub(尽管在 Pydub's GitHub page 上有建议)

      conda install -c conda-forge pydub
      

    这应该可以正常工作。原因未知,可能是兼容性问题。

    1. 另一种解决方案(如果您已经使用 pip 安装 Pydub,但它不起作用)是安装缺少的 ffmpeg 包。另一个问题来了。虽然我们可以在pypianaconda 上找到一个名为ffmpeg 的包,但如果我们只安装了其中一个源,我们可能会看到如下错误

      In [1]: import ffmpeg                                                                               
      ---------------------------------------------------------------------------
      ModuleNotFoundError                       Traceback (most recent call last)
      <ipython-input-1-16f5f3b4de71> in <module>
      ----> 1 import ffmpeg
      
      ModuleNotFoundError: No module named 'ffmpeg'
      

    经过几次测试,我发现必须安装两者才能使包ffmpeg 工作(安装两次,换句话说)。否则,即使它是通过 pip 或 anaconda 安装的,python 也无法找到该包。所以只需输入

    pip install ffmpeg
    conda install ffmpeg
    

    现在尝试在 python 中导入ffmpeg。如果没有错误,问题应该已经解决了。

    注意,从FFmpeg website 手动下载ffmpeg 并将bin 路径附加到sys.path 可能无法解决此问题。同样,手动指定ffmpeg的可执行文件路径(在Windows上为ffmpeg.exe)也可能无法解决问题。

    【讨论】:

    • 手动下载 FFmpeg 并将其设置为环境变量路径在 Windows 10 中工作。添加新路径后需要更新 Cmd 或 PowerShell 会话。如果它不起作用,请尝试在环境变量路径中添加 pydub 路径。您可以查看here
    • 将它添加到 Windows 中的路径对我不起作用,但是这样做了!谢谢!
    猜你喜欢
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 2017-07-06
    • 2020-11-26
    • 2017-08-23
    • 2014-10-17
    • 1970-01-01
    相关资源
    最近更新 更多