HOWTO · Python
在 Python 中将 MP3 转换为 WAV
在本教程中,我们将讨论如何在 Python 中将 MP3 转换为 WAV
本页内容
在 Python 中将 MP3 转换为 WAV,可以使用 pydub 提供简洁的库接口,也可以调用 ffmpeg,以便直接控制命令行选项。两种方式都要求系统中有可用的 ffmpeg 可执行文件。WAV 通常未压缩,文件可能比 MP3 大得多;将有损 MP3 转换为 WAV 无法恢复压缩时丢失的音频细节。
使用 pydub 将 MP3 转换为 WAV
在运行脚本的环境中执行 python -m pip install pydub 安装 pydub。你还需要安装 ffmpeg 可执行文件,并确保它位于 PATH 中;单独安装 pydub 不会一并安装 ffmpeg。有关背景信息,请参阅 ffmpeg 指南。不同操作系统的安装步骤有所不同,请使用系统支持的包管理器或安装方式。
本示例以 input.mp3 为源文件,以 test.wav 为目标文件。请将这两个路径替换为自己的文件路径。代码会先检查输入文件是否存在,再导入 pydub,因此可以直接作为模板运行;输入文件存在时,代码会载入 MP3 并导出 WAV 文件。
本节中的代码以及显示的标签或输出仍为英文。
from pathlib import Path
source_path = Path("input.mp3")
destination_path = Path("test.wav")
if not source_path.is_file():
print(f"Place an MP3 file at {source_path} and run again.")
else:
from pydub import AudioSegment
audio = AudioSegment.from_mp3(str(source_path))
audio.export(str(destination_path), format="wav")
print(f"Created {destination_path}")
直接运行 ffmpeg 将 MP3 转换为 WAV
你可以在终端中运行 ffmpeg,无需使用 Python 音频库。请确认已安装 ffmpeg,且可以直接通过名称调用;也可以使用其可执行文件的完整路径。-i 参数指定输入文件,最后一个参数指定输出路径:ffmpeg -i input.mp3 test.wav。
此命令假设 input.mp3 位于当前目录,并会写入 test.wav,与下面的 Python 示例使用相同的路径。如果输入文件位于其他位置,请填写正确路径。覆盖已存在的目标文件时,ffmpeg 可能会先询问;你可以改用新文件名,或仅在确实要替换该文件时使用覆盖选项。
在 Python 中使用 subprocess 将 MP3 转换为 WAV
在 Python 脚本中,subprocess.run() 可以将参数列表传递给外部 ffmpeg 程序。这样无需拼接 shell 命令字符串,也能让 Python 检测非零进程状态。本示例与其他方法一样,使用 input.mp3 作为源文件、test.wav 作为目标文件;请按自己的文件替换这两个路径。调用 ffmpeg 前,代码会先检查源文件是否存在。
本节中的代码以及显示的标签或输出仍为英文。
from pathlib import Path
import subprocess
source_path = Path("input.mp3")
destination_path = Path("test.wav")
if not source_path.is_file():
print(f"Place an MP3 file at {source_path} and run again.")
else:
subprocess.run(
["ffmpeg", "-i", str(source_path), str(destination_path)],
check=True,
)
print(f"Created {destination_path}")
使用 check=True 时,转换失败会由 Python 报告,而不会悄然继续。ffmpeg 会写入目标音频文件;subprocess 不会将其标准输出重定向到该 WAV 文件。批量处理时,可以捕获 subprocess.CalledProcessError,并记录源文件路径和错误详情,以便诊断失败的文件。
验证 WAV 输出并排查常见问题
三个转换示例都使用 input.mp3 作为源文件、test.wav 作为目标文件。如果你在转换示例中更改了目标路径,请将下面的 destination_path 改为完全相同的路径。此检查会先确认文件存在,然后使用 Python 的 wave 模块打开文件,以确认其中包含可读取的 WAV 容器。该检查与后面的合成 WAV 测试文件相互独立;后者用于测试 WAV 检查流程,并不会执行 MP3 转换。
本节中的代码以及显示的标签或输出仍为英文。
from pathlib import Path
import wave
# Match this path to the destination used by the conversion example.
destination_path = Path("test.wav")
if not destination_path.is_file():
print(f"WAV file not found: {destination_path}")
else:
try:
with wave.open(str(destination_path), "rb") as wav_file:
print(
f"WAV: {wav_file.getnchannels()} channel(s), "
f"{wav_file.getframerate()} Hz"
)
except (OSError, wave.Error) as error:
print(f"Could not read WAV file: {error}")
下面的独立示例使用 Python 标准库创建一个小型 WAV 测试文件,并检查其基本元数据。它只演示 WAV 检查,不会解码 MP3。
from pathlib import Path
import tempfile
import wave
with tempfile.TemporaryDirectory() as directory:
output_path = Path(directory) / "test.wav"
with wave.open(str(output_path), "wb") as wav_file:
wav_file.setnchannels(1)
wav_file.setsampwidth(2)
wav_file.setframerate(8000)
wav_file.writeframes(b"\x00\x00" * 800)
with wave.open(str(output_path), "rb") as wav_file:
print(f"WAV: {wav_file.getnchannels()} channel(s), {wav_file.getframerate()} Hz")
输出:
WAV: 1 channel(s), 8000 Hz
打印出的数值描述的是 WAV 音频流,并不能说明其音质是否优于 MP3 源文件。如果 Python 找不到 ffmpeg,请安装该可执行文件或将其所在目录添加到 PATH,然后重新启动运行 Python 的终端或进程。如果 ffmpeg 无法打开输入文件,请检查文件名,并确认源文件路径是相对于脚本的工作目录而言正确的。如果转换失败,请查看 ffmpeg 的诊断信息,并检查输入文件是否可读、目标目录是否可写。脚本适合使用简单 API 时,可以选择 pydub;需要直接访问 ffmpeg 选项并检查进程状态时,可以通过 subprocess 调用 ffmpeg。