音频处理
音频格式转换
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: 48kHzPython 方式(批量)
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}秒")