基于python3下wav文件的批量分割
發(fā)布日期:2022/8/24 13:43:24 瀏覽量:
基于python3下wav文件的批量分割
import os
import wave
import contextlib
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
from pydub import AudioSegment
def wav_infos(wav_path):
’’’
獲取音頻信息
:param wav_path: 音頻路徑
:return: [1, 2, 8000, 51158, ’NONE’, ’not compressed’]
對(duì)應(yīng)關(guān)系:聲道,采樣寬度,幀速率,幀數(shù),唯一標(biāo)識(shí),無損
’’’
with wave.open(wav_path, "rb") as f:
f = wave.open(wav_path)
return list(f.getparams())
def read_wav(wav_path):
’’’
讀取音頻文件內(nèi)容:只能讀取單聲道的音頻文件, 這個(gè)比較耗時(shí)
:param wav_path: 音頻路徑
:return: 音頻內(nèi)容
’’’
with wave.open(wav_path, "rb") as f:
# 讀取格式信息
# 一次性返回所有的WAV文件的格式信息,它返回的是一個(gè)組元(tuple):聲道數(shù), 量化位數(shù)(byte單位), 采
# 樣頻率, 采樣點(diǎn)數(shù), 壓縮類型, 壓縮類型的描述。wave模塊只支持非壓縮的數(shù)據(jù),因此可以忽略最后兩個(gè)信息
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
# 讀取聲音數(shù)據(jù),傳遞一個(gè)參數(shù)指定需要讀取的長(zhǎng)度(以取樣點(diǎn)為單位)
str_data = f.readframes(nframes)
return str_data
def get_wav_time(wav_path):
’’’
獲取音頻文件是時(shí)長(zhǎng)
:param wav_path: 音頻路徑
:return: 音頻時(shí)長(zhǎng) (單位秒)
’’’
with contextlib.closing(wave.open(wav_path, ’r’)) as f:
frames = f.getnframes()
rate = f.getframerate()
duration = frames / float(rate)
return duration
def get_ms_part_wav(main_wav_path, start_time, end_time, part_wav_path):
’’’
音頻切片,獲取部分音頻 單位是毫秒級(jí)別
:param main_wav_path: 原音頻文件路徑
:param start_time: 截取的開始時(shí)間
:param end_time: 截取的結(jié)束時(shí)間
:param part_wav_path: 截取后的音頻路徑
:return:
’’’
start_time = int(start_time)
end_time = int(end_time)
sound = AudioSegment.from_mp3(main_wav_path)
word = sound[start_time:end_time]
word.export(part_wav_path, format="wav")
def get_second_part_wav(main_wav_path, start_time, end_time, part_wav_path):
’’’
音頻切片,獲取部分音頻 單位是秒級(jí)別
:param main_wav_path: 原音頻文件路徑
:param start_time: 截取的開始時(shí)間
:param end_time: 截取的結(jié)束時(shí)間
:param part_wav_path: 截取后的音頻路徑
:return:
’’’
start_time = int(start_time) * 1000
end_time = int(end_time) * 1000
sound = AudioSegment.from_mp3(main_wav_path)
word = sound[start_time:end_time]
word.export(part_wav_path, format="wav")
def get_minute_part_wav(main_wav_path, start_time, end_time, part_wav_path):
’’’
音頻切片,獲取部分音頻 分鐘:秒數(shù) 時(shí)間樣式:"12:35"
:param main_wav_path: 原音頻文件路徑
:param start_time: 截取的開始時(shí)間
:param end_time: 截取的結(jié)束時(shí)間
:param part_wav_path: 截取后的音頻路徑
:return:
’’’
start_time = (int(start_time.split(’:’)[0])*60+int(start_time.split(’:’)[1]))*1000
end_time = (int(end_time.split(’:’)[0])*60+int(end_time.split(’:’)[1]))*1000
sound = AudioSegment.from_mp3(main_wav_path)
word = sound[start_time:end_time]
word.export(part_wav_path, format="wav")
def wav_to_pcm(wav_path, pcm_path):
’’’
wav文件轉(zhuǎn)為pcm文件
:param wav_path:wav文件路徑
:param pcm_path:要存儲(chǔ)的pcm文件路徑
:return: 返回結(jié)果
’’’
f = open(wav_path, "rb")
f.seek(0)
f.read(44)
data = np.fromfile(f, dtype=np.int16)
data.tofile(pcm_path)
def pcm_to_wav(pcm_path, wav_path):
’’’
pcm文件轉(zhuǎn)為wav文件
:param pcm_path: pcm文件路徑
:param wav_path: wav文件路徑
:return:
’’’
f = open(pcm_path,’rb’)
str_data = f.read()
wave_out=wave.open(wav_path,’wb’)
wave_out.setnchannels(1)
wave_out.setsampwidth(2)
wave_out.setframerate(8000)
wave_out.writeframes(str_data)
# 音頻對(duì)應(yīng)的波形圖
def wav_waveform(wave_path):
’’’
音頻對(duì)應(yīng)的波形圖
:param wave_path: 音頻路徑
:return:
’’’
file = wave.open(wave_path)
# print(’---------聲音信息------------’)
# for item in enumerate(WAVE.getparams()):
# print(item)
a = file.getparams().nframes # 幀總數(shù)
f = file.getparams().framerate # 采樣頻率
sample_time = 1 / f # 采樣點(diǎn)的時(shí)間間隔
time = a / f # 聲音信號(hào)的長(zhǎng)度
sample_frequency, audio_sequence = wavfile.read(wave_path)
# print(audio_sequence) # 聲音信號(hào)每一幀的“大小”
x_seq = np.arange(0, time, sample_time)
plt.plot(x_seq, audio_sequence, ’blue’)
plt.xlabel("time (s)")
plt.show()
if __name__ == ’__main__’:
path = r’C:/123/’ # 原音頻目錄
path_segment = r’C:/234/’ # 切割后的音頻目錄
print(’開始切割音頻!’)
time_segment = 100 # 切割后短音頻的時(shí)長(zhǎng)
for root, dir, files in os.walk(path):
for i in range(len(files)):
audio = root + files[i]
time_all = int(get_wav_time(audio) * 1000) # 轉(zhuǎn)換成毫秒
start_time = 0 # 從第0ms開始切割
index = 1 # 切割后的序號(hào)名,從序號(hào)1開始命令
while start_time <= time_all - time_segment:
# print(str(i)+ ’: ’ + str(index))
end_time = start_time + time_segment
aduio_segment = path_segment + files[i][:-4] + ’_’ + str(index) + ’.wav’
get_ms_part_wav(audio, start_time, end_time, aduio_segment)
start_time += time_segment
index += 1
# 接下來這兩行是為了將最終能夠不足time_segment時(shí)長(zhǎng)的音頻剪下來
aduio_segment = path_segment + files[i][:-4] + ’_’ + str(index) + ’.wav’
get_ms_part_wav(audio, start_time, time_all, aduio_segment)
print(’音頻切割完成!’)
馬上咨詢: 如果您有業(yè)務(wù)方面的問題或者需求,歡迎您咨詢!我們帶來的不僅僅是技術(shù),還有行業(yè)經(jīng)驗(yàn)積累。
QQ: 39764417/308460098 Phone: 13 9800 1 9844 / 135 6887 9550 聯(lián)系人:石先生/雷先生