Speech | 分割单个/批量音频python实现语音处理代码

文摘   2024-11-06 13:24   印度尼西亚  
👆点击上方名片关注哟👆


简介

本文介绍了如何利用 Python 脚本处理音频数据。所有代码都可以通过修改文件路径和输出路径直接运行,涵盖了按时间切割语句停顿切割以及批量处理音频的多种方法。适用于需要高效处理大批量音频数据的场景。

1. 所需环境

本文基于 Linux 环境,并需安装以下依赖:

  • pydubpip3 install pydub

  • ffmpegapt install ffmpeg


数据为一个 3 分 50 秒的 WAV 文件!!

2. 按时间切割单个音频

脚本代码:split_wav_time.py

from pydub import AudioSegmentfrom 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 AudioSegmentfrom 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 AudioSegmentfrom pydub.utils import make_chunksimport 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 AudioSegmentimport 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 AudioSegmentfrom pydub.silence import split_on_silenceimport 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 waveimport 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,获取更多最新内容。

AI Pulse
\x26quot;AI Pulse - AI脉动\x26quot;,探索AI技术前沿,深入解析算法精髓,分享行业应用案例,洞察智能科技未来。欢迎关注,与我们共赴AI学习之旅。
 最新文章