Python 使用 Pydub 将 mp3 转换为 wav

问题描述 投票:0回答:4

好吧,现在我陷入了将 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,但可能不起作用

回溯(最近一次调用最后一次): 文件“C:/Users/phourlhar/Desktop/VoiceDetector/yeah.py”,第 7 行,位于 立体声到单声道()

文件“C:\Users\phourlhar\Desktop\VoiceDetector\utils.py”,第 25 行,位于 立体声到单声道

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

文件“build dist.win32 gg\pydub udio_segment.py”,第346行,在 来自文件

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

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

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

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

python audio pydub
4个回答
21
投票

pydub
模块使用
ffmpeg
avconf
程序来进行实际转换。因此,您必须安装
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。


14
投票

你一定要使用pydub,它是一个很棒的与音频文件相关的操作模块。

注意。使用 pydub 之前请记住安装 ffmpeg。

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

然后要安装 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")

0
投票

问题是由于缺少

ffmpeg
造成的。 Pydub需要它来执行格式转换的操作。解决这个问题有2种方法:

  1. 只需使用 conda 安装 pydub,而不是 pip(尽管Pydub 的 GitHub 页面上有建议

    conda install -c conda-forge pydub
    

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

  1. 另一个解决方案(如果您已经使用 pip 安装 Pydub,并且它不起作用)是安装缺少的

    ffmpeg
    包。另一个问题又来了。虽然我们可以在
    pypi
    anaconda 上找到一个名为 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 网站
手动下载 ffmpeg 并将
bin
路径附加到
sys.path
可能无法解决此问题。同样,手动指定
ffmpeg
可执行文件的路径(在 Windows 上是
ffmpeg.exe
)也可能无法解决问题。


0
投票

在 Linux 操作系统上,将

pydub
ffmpeg 一起使用还需要 ffprobe 的默认位置。为您的 Linux 发行版安装 FFMPeg,并确保可执行文件位于您的 PATH 中:

# Create a ffmpeg directory on AWS Linux
cd /usr/local/bin
mkdir ffmpeg && cd ffmpeg

# SET LATEST APP VERSION HERE
FFMPEG_APPVER='ffmpeg-7.0.2-amd64-static'

# Download and Unzip the ffmpeg binaries
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
tar -xf ffmpeg-release-amd64-static.tar.xz

# Copy extracted binaries to parent dir
cd /usr/local/bin/ffmpeg/$FFMPEG_APPVER/
cp -a /usr/local/bin/ffmpeg/$FFMPEG_APPVER/ . /usr/local/bin/ffmpeg/

# Create a symbolic link so ffmpeg and ffprobe are accessible inside of Python
ln -s /usr/local/bin/ffmpeg/ffmpeg /usr/bin/ffmpeg
ln -s /usr/local/bin/ffmpeg/ffprobe /usr/bin/ffprobe

您现在可以运行 python 导入并在此处设置每个文档的

AudioSegment
值:https://github.com/jiaaro/pydub

import ffmpeg
from pydub import AudioSegment

AudioSegment.converter = "/usr/bin/ffmpeg"
AudioSegment.ffmpeg = "/usr/bin/ffmpeg"
AudioSegment.ffprobe = "/usr/bin/ffprobe"
© www.soinside.com 2019 - 2024. All rights reserved.