简介
本文介绍了如何利用 Python 脚本处理音频数据。所有代码都可以通过修改文件路径和输出路径直接运行,涵盖了按时间切割、语句停顿切割以及批量处理音频的多种方法。适用于需要高效处理大批量音频数据的场景。
1. 所需环境
本文基于 Linux 环境,并需安装以下依赖:
pydub:
pip3 install pydub
ffmpeg:
apt install ffmpeg
数据为一个 3 分 50 秒的 WAV 文件!!
2. 按时间切割单个音频
脚本代码:split_wav_time.py
from pydub import AudioSegment
from pydub.utils import make_chunks
audio = AudioSegment.from_file("his_one/1.wav", "wav")
size = 60000 # 每 60 秒切割一块
chunks = make_chunks(audio, size) # 切割为 60 秒一段
for i, chunk in enumerate(chunks):
chunk_name = f"new-{i}.wav"
print(chunk_name)
chunk.export(chunk_name, format="wav")
运行命令:
python split_wav_time.py
3. 按语句停顿切割单个音频
脚本代码
from pydub import AudioSegment
from pydub.silence import split_on_silence
sound = AudioSegment.from_mp3("his_one/1.wav")
chunks = split_on_silence(
sound,
min_silence_len=430, # 沉默时间至少 430ms
silence_thresh=-45, # 低于 -45 dBFS 视为沉默
keep_silence=400 # 每段开头保留 400ms 沉默
)
# 丢弃小于 2 秒或大于 10 秒的片段
chunks = [chunk for chunk in chunks if 2000 <= len(chunk) <= 10000]
for i, chunk in enumerate(chunks):
chunk.export(f"cutwav_{i}.wav", format="wav")
4.批量切割文件夹中的音频
4.1 按固定秒数切割(WAV 格式)
from pydub import AudioSegment
from pydub.utils import make_chunks
import os
for each in os.listdir("/workspace/tts/PolyLangVITS/history"):
if each.endswith(".wav"):
audio = AudioSegment.from_file(f"/workspace/tts/PolyLangVITS/history/{each}")
chunks = make_chunks(audio, 15000) # 每 15 秒切割
for i, chunk in enumerate(chunks):
chunk_name = f"{each.split('.')[0]}-{i}.wav"
chunk.export(f"/workspace/tts/PolyLangVITS/preprodata/his_out/{chunk_name}", format="wav")
4.2 按固定秒数切割(MP3 格式)
from pydub import AudioSegment
import os
for each in os.listdir("D:/纯音乐"):
if each.endswith(".mp3"):
audio = AudioSegment.from_file(f"D:/纯音乐/{each}")
chunks = make_chunks(audio, 15000) # 每 15 秒切割
for i, chunk in enumerate(chunks):
chunk_name = f"{each.split('.')[0]}-{i}.mp3"
chunk.export(f"D:/纯音乐分解/{chunk_name}", format="mp3")
4.3 按语句停顿切割(WAV 格式)
from pydub import AudioSegment
from pydub.silence import split_on_silence
import os
for each in os.listdir("/workspace/tts/PolyLangVITS/history"):
if each.endswith(".wav"):
audio = AudioSegment.from_file(f"/workspace/tts/PolyLangVITS/history/{each}")
chunks = split_on_silence(
audio,
min_silence_len=430,
silence_thresh=-45,
keep_silence=400
)
chunks = [chunk for chunk in chunks if 1000 <= len(chunk) <= 10000]
for i, chunk in enumerate(chunks):
chunk.export(f"/workspace/tts/PolyLangVITS/preprodata/his_out/{each.split('.')[0]}-{i}.wav", format="wav")
5. 扩展
5.1.批量将 PCM 文件转换为 WAV
import wave
import os
for filename in os.listdir("data/"):
with open(f"data/{filename}", 'rb') as pcmfile:
pcmdata = pcmfile.read()
with wave.open(f"data/{filename[:-3]}.wav", 'wb') as wavfile:
wavfile.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
wavfile.writeframes(pcmdata)
5.2.使用 Linux 查询文件数量
统计当前文件夹中所有
.wav
文件数量:
ls -l | grep "wav" | wc -l
5.3.WAV 文件格式详解
WAV 是 Microsoft 的 RIFF 规范子集,用于存储音频文件,包含以下结构:
RIFF WAVE Chunk:描述文件类型
Format Chunk:存储音频格式信息
Data Chunk:存储音频数据
音频文件参数简介:
采样率:每秒采样次数,如 44100Hz
采样值:记录声音振幅,取决于位深(bit depth)
8bit:256 个振幅等级
16bit:65536 个等级(CD 标准)
32bit:超高精度
WAV 文件可以是单声道或立体声,双声道数据会分为左右声道记录。
想要了解更多内容,可在小程序搜索🔍AI Pulse,获取更多最新内容。