Skip to content

音频处理

音频格式转换

Shell 方式(单文件)

bash
# m4a 文件转为 16bit, 单声道, 采样率为 48kHz
for i in *.m4a; do ffmpeg -i "$i" -acodec pcm_s16le -ac 1 -ar 48000 "${i%}.wav"; done

# 参数说明
# -acodec pcm_s16le: 16bit
# -ac 1: 单声道
# -ar 48000: 48kHz

Python 方式(批量)

python
import os
from pathlib import Path
from pydub import AudioSegment


def convert_to_wav(src_path, dst_path, audio_format):
    """使用 pydub 转换音频为 16k 单声道 wav"""
    sound = AudioSegment.from_file(src_path, format=audio_format)
    sound = sound.set_frame_rate(16000).set_channels(1)
    sound.export(dst_path, format="wav")


def cmd_convert_to_wav(src_path, dst_path):
    """使用 ffmpeg 转换音频"""
    call = f'ffmpeg -y -i "{src_path}" -ar 16000 -ac 1 -f wav "{dst_path}"'
    os.system(call)


def batch_convert(directory, filter_suffix=None, convert_suffix=None):
    """批量转换音频文件"""
    filter_suffix = filter_suffix or []
    convert_suffix = convert_suffix or ['.m4a', '.mp3', '.wav']
    directory = Path(directory)

    for file in directory.iterdir():
        if not file.is_file():
            continue
        suffix = file.suffix.lower()
        if suffix in filter_suffix or suffix not in convert_suffix:
            continue
        wav_path = file.with_suffix('.wav')
        print(f"正在处理: {file}")
        try:
            convert_to_wav(str(file), str(wav_path), audio_format=suffix.lstrip('.'))
        except Exception as e:
            print(f"pydub转换失败: {e},尝试ffmpeg...")
            cmd_convert_to_wav(str(file), str(wav_path))


if __name__ == "__main__":
    _dir = r"音频目录路径"
    batch_convert(_dir)

音频时长统计

获取单个音频时长

python
from pydub.utils import mediainfo


def get_audio_duration(file_path):
    """获取音频时长(秒)"""
    info = mediainfo(file_path)
    return float(info["duration"])

批量统计文件夹音频时长

python
import os
from pydub.utils import mediainfo


def get_audio_duration(file_path):
    info = mediainfo(file_path)
    return float(info['duration'])


def count_folder_duration(path, file_types=None):
    """递归统计文件夹下所有音频时长"""
    file_types = file_types or ["wav", "mp3"]
    total_duration = 0

    for root, dirs, files in os.walk(path):
        for file in files:
            if file.split(".")[-1].lower() in file_types:
                file_path = os.path.join(root, file)
                duration = get_audio_duration(file_path)
                print(f"{file_path}: {duration:.2f}秒")
                total_duration += duration

    return total_duration


if __name__ == "__main__":
    path = r"音频目录路径"
    total = count_folder_duration(path, ["wav", "mp3", "m4a"])
    print(f"总时长: {total:.2f}秒")
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.7.1