Python案例如何转换音频格式?

wen python案例 53

本文目录导读:

Python案例如何转换音频格式?

  1. 方法一:使用 pydub(最简单)
  2. 方法二:使用 librosa(适合音频分析)
  3. 方法三:使用 ffmpeg-python(直接调用ffmpeg)
  4. 方法四:音频参数调整
  5. 完整实用案例:音频转换工具
  6. 常见问题解决

我来为你介绍几种Python转换音频格式的常用方法。

使用 pydub(最简单)

安装依赖

pip install pydub
# 还需要安装 ffmpeg
# Windows: 下载ffmpeg并添加到环境变量
# Mac: brew install ffmpeg
# Linux: sudo apt-get install ffmpeg

基本转换案例

from pydub import AudioSegment
# 1. MP3转WAV
def mp3_to_wav(input_file, output_file):
    audio = AudioSegment.from_mp3(input_file)
    audio.export(output_file, format="wav")
    print(f"转换完成:{output_file}")
# 2. WAV转MP3
def wav_to_mp3(input_file, output_file, bitrate="192k"):
    audio = AudioSegment.from_wav(input_file)
    audio.export(output_file, format="mp3", bitrate=bitrate)
    print(f"转换完成:{output_file}")
# 3. 通用格式转换(支持多种格式)
def convert_audio(input_file, output_file, format=None):
    # 自动识别格式
    audio = AudioSegment.from_file(input_file)
    # 指定输出格式
    if format:
        audio.export(output_file, format=format)
    else:
        # 根据扩展名推断格式
        audio.export(output_file)
    print(f"转换完成:{output_file}")
# 使用示例
if __name__ == "__main__":
    # MP3转WAV
    mp3_to_wav("input.mp3", "output.wav")
    # WAV转MP3
    wav_to_mp3("input.wav", "output.mp3")
    # 通用转换
    convert_audio("input.flac", "output.mp3", format="mp3")
    convert_audio("input.ogg", "output.wav", format="wav")

高级功能:批量转换

import os
from pydub import AudioSegment
from pathlib import Path
def batch_convert_audio(input_dir, output_dir, input_format, output_format):
    """
    批量转换音频格式
    Args:
        input_dir: 输入文件夹路径
        output_dir: 输出文件夹路径
        input_format: 输入格式(如 "mp3")
        output_format: 输出格式(如 "wav")
    """
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)
    # 遍历输入文件夹
    for file in Path(input_dir).glob(f"*.{input_format}"):
        try:
            # 读取音频
            audio = AudioSegment.from_file(str(file), format=input_format)
            # 构建输出文件名
            output_file = os.path.join(
                output_dir, 
                f"{file.stem}.{output_format}"
            )
            # 导出音频
            audio.export(output_file, format=output_format)
            print(f"转换成功:{file.name} -> {output_file}")
        except Exception as e:
            print(f"转换失败 {file.name}: {e}")
# 使用示例
batch_convert_audio("mp3_files", "wav_files", "mp3", "wav")

使用 librosa(适合音频分析)

import librosa
import soundfile as sf
def convert_with_librosa(input_file, output_file, target_sr=22050):
    """
    使用librosa转换音频格式
    Args:
        input_file: 输入文件
        output_file: 输出文件
        target_sr: 目标采样率
    """
    # 加载音频
    audio, sr = librosa.load(input_file, sr=target_sr)
    # 保存音频
    sf.write(output_file, audio, target_sr)
    print(f"转换完成:{output_file}")
    return audio, target_sr
# 使用示例
convert_with_librosa("input.mp3", "output.wav", target_sr=44100)

使用 ffmpeg-python(直接调用ffmpeg)

import ffmpeg
def convert_with_ffmpeg(input_file, output_file, **kwargs):
    """
    使用ffmpeg转换音频格式
    Args:
        input_file: 输入文件
        output_file: 输出文件
        **kwargs: 额外参数(如 bitrate, sample_rate等)
    """
    try:
        # 构建ffmpeg命令
        stream = ffmpeg.input(input_file)
        stream = ffmpeg.output(stream, output_file, **kwargs)
        # 执行转换
        ffmpeg.run(stream, overwrite_output=True)
        print(f"转换完成:{output_file}")
    except ffmpeg.Error as e:
        print(f"转换失败: {e.stderr.decode()}")
# 使用示例
convert_with_ffmpeg("input.mp3", "output.wav", acodec="pcm_s16le")
convert_with_ffmpeg("input.wav", "output.mp3", audio_bitrate="192k")
convert_with_ffmpeg("input.flac", "output.ogg", acodec="libvorbis")

音频参数调整

from pydub import AudioSegment
def convert_with_parameters(input_file, output_file, **params):
    """
    调整参数后转换音频
    Args:
        input_file: 输入文件
        output_file: 输出文件
        **params: 可调整的参数
            - sample_rate: 采样率
            - channels: 声道数 (1=单声道, 2=立体声)
            - sample_width: 采样宽度 (1, 2, 4字节)
            - bitrate: 比特率 (如 "192k")
    """
    audio = AudioSegment.from_file(input_file)
    # 调整采样率
    if 'sample_rate' in params:
        audio = audio.set_frame_rate(params['sample_rate'])
    # 调整声道
    if 'channels' in params:
        if params['channels'] == 1:
            audio = audio.set_channels(1)  # 转为单声道
        elif params['channels'] == 2:
            audio = audio.set_channels(2)  # 转为立体声
    # 调整采样宽度
    if 'sample_width' in params:
        audio = audio.set_sample_width(params['sample_width'])
    # 导出音频
    export_params = {}
    if 'bitrate' in params:
        export_params['bitrate'] = params['bitrate']
    audio.export(output_file, format=output_file.split('.')[-1], **export_params)
    print(f"转换完成:{output_file}")
# 使用示例
convert_with_parameters(
    "input.mp3", 
    "output.wav",
    sample_rate=44100,  # CD音质
    channels=2,         # 立体声
    bitrate="320k"      # 高比特率
)

完整实用案例:音频转换工具

import os
import argparse
from pydub import AudioSegment
from pathlib import Path
class AudioConverter:
    """音频转换工具类"""
    SUPPORTED_FORMATS = ['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a']
    def __init__(self, input_dir=".", output_dir="converted"):
        self.input_dir = Path(input_dir)
        self.output_dir = Path(output_dir)
        self.output_dir.mkdir(parents=True, exist_ok=True)
        self.conversion_count = 0
        self.error_count = 0
    def convert_single(self, input_file, output_format, **kwargs):
        """转换单个文件"""
        input_path = Path(input_file)
        # 构建输出路径
        output_path = self.output_dir / f"{input_path.stem}.{output_format}"
        try:
            # 加载音频
            audio = AudioSegment.from_file(str(input_path))
            # 应用参数调整
            if 'sample_rate' in kwargs:
                audio = audio.set_frame_rate(kwargs['sample_rate'])
            if 'channels' in kwargs:
                audio = audio.set_channels(kwargs['channels'])
            # 导出
            export_kwargs = {'format': output_format}
            if 'bitrate' in kwargs:
                export_kwargs['bitrate'] = kwargs['bitrate']
            audio.export(str(output_path), **export_kwargs)
            self.conversion_count += 1
            print(f"✓ 转换成功: {input_path.name} -> {output_path.name}")
            return str(output_path)
        except Exception as e:
            self.error_count += 1
            print(f"✗ 转换失败 {input_path.name}: {e}")
            return None
    def batch_convert(self, input_format, output_format, **kwargs):
        """批量转换"""
        print(f"开始批量转换: {input_format} -> {output_format}")
        print("-" * 40)
        # 查找所有匹配的文件
        for file in self.input_dir.glob(f"*.{input_format}"):
            self.convert_single(str(file), output_format, **kwargs)
        # 显示统计信息
        print("-" * 40)
        print(f"转换完成! 成功: {self.conversion_count}, 失败: {self.error_count}")
    def get_audio_info(self, input_file):
        """获取音频信息"""
        audio = AudioSegment.from_file(input_file)
        print(f"文件: {input_file}")
        print(f"时长: {len(audio)/1000:.2f}秒")
        print(f"采样率: {audio.frame_rate}Hz")
        print(f"声道数: {audio.channels}")
        print(f"采样宽度: {audio.sample_width * 8}bit")
        print(f"帧数: {audio.frame_count()}")
        return {
            'duration': len(audio)/1000,
            'sample_rate': audio.frame_rate,
            'channels': audio.channels,
            'sample_width': audio.sample_width
        }
# 命令行接口
def main():
    parser = argparse.ArgumentParser(description="音频格式转换工具")
    parser.add_argument("input", help="输入文件或文件夹路径")
    parser.add_argument("output_format", help="输出格式 (mp3, wav, ogg, flac)")
    parser.add_argument("-o", "--output", help="输出目录", default="converted")
    parser.add_argument("-r", "--sample-rate", type=int, help="采样率")
    parser.add_argument("-c", "--channels", type=int, help="声道数 (1或2)")
    parser.add_argument("-b", "--bitrate", help="比特率 (如 192k)")
    args = parser.parse_args()
    converter = AudioConverter(output_dir=args.output)
    # 判断是文件还是目录
    if os.path.isfile(args.input):
        kwargs = {}
        if args.sample_rate:
            kwargs['sample_rate'] = args.sample_rate
        if args.channels:
            kwargs['channels'] = args.channels
        if args.bitrate:
            kwargs['bitrate'] = args.bitrate
        output_path = converter.convert_single(args.input, args.output_format, **kwargs)
        if output_path:
            print(f"输出文件: {output_path}")
    elif os.path.isdir(args.input):
        converter.input_dir = Path(args.input)
        # 自动检测输入格式
        converter.batch_convert('*', args.output_format)
    else:
        print("错误: 输入路径无效")
if __name__ == "__main__":
    # 示例1: 转换单个文件
    converter = AudioConverter()
    converter.convert_single("input.mp3", "wav", sample_rate=44100)
    # 示例2: 批量转换所有mp3文件
    converter.batch_convert("mp3", "wav", bitrate="320k")
    # 示例3: 获取音频信息
    converter.get_audio_info("input.mp3")

常见问题解决

# 1. 处理中文文件名
AudioSegment.converter = "ffmpeg"
AudioSegment.ffmpeg = "ffmpeg"
# 2. 设置临时目录(避免磁盘空间不足)
import tempfile
AudioSegment._strtemp = tempfile.mkdtemp()
# 3. 错误处理
try:
    audio = AudioSegment.from_file("corrupted.mp3")
except Exception as e:
    print(f"无法读取音频文件: {e}")
    # 尝试修复
    import subprocess
    subprocess.run([
        "ffmpeg", "-i", "corrupted.mp3",
        "-acodec", "copy",
        "fixed.mp3"
    ])

这些方法可以帮你处理大多数音频格式转换需求,pydub是最简单的选择,librosa适合需要进行音频分析的场景,ffmpeg-python则提供最底层的控制。

抱歉,评论功能暂时关闭!