基于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’]
對應關(guān)系:聲道,采樣寬度,幀速率,幀數(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)容:只能讀取單聲道的音頻文件, 這個比較耗時
:param wav_path: 音頻路徑
:return: 音頻內(nèi)容
’’’
with wave.open(wav_path, "rb") as f:
# 讀取格式信息
# 一次性返回所有的WAV文件的格式信息,它返回的是一個組元(tuple):聲道數(shù), 量化位數(shù)(byte單位), 采
# 樣頻率, 采樣點數(shù), 壓縮類型, 壓縮類型的描述。wave模塊只支持非壓縮的數(shù)據(jù),因此可以忽略最后兩個信息
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
# 讀取聲音數(shù)據(jù),傳遞一個參數(shù)指定需要讀取的長度(以取樣點為單位)
str_data = f.readframes(nframes)
return str_data
def get_wav_time(wav_path):
’’’
獲取音頻文件是時長
:param wav_path: 音頻路徑
:return: 音頻時長 (單位秒)
’’’
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):
’’’
音頻切片,獲取部分音頻 單位是毫秒級別
:param main_wav_path: 原音頻文件路徑
:param start_time: 截取的開始時間
:param end_time: 截取的結(jié)束時間
: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):
’’’
音頻切片,獲取部分音頻 單位是秒級別
:param main_wav_path: 原音頻文件路徑
:param start_time: 截取的開始時間
:param end_time: 截取的結(jié)束時間
: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ù) 時間樣式:"12:35"
:param main_wav_path: 原音頻文件路徑
:param start_time: 截取的開始時間
:param end_time: 截取的結(jié)束時間
: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:要存儲的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)
# 音頻對應的波形圖
def wav_waveform(wave_path):
’’’
音頻對應的波形圖
: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 # 采樣點的時間間隔
time = a / f # 聲音信號的長度
sample_frequency, audio_sequence = wavfile.read(wave_path)
# print(audio_sequence) # 聲音信號每一幀的“大小”
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 # 切割后短音頻的時長
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 # 切割后的序號名,從序號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時長的音頻剪下來
aduio_segment = path_segment + files[i][:-4] + ’_’ + str(index) + ’.wav’
get_ms_part_wav(audio, start_time, time_all, aduio_segment)
print(’音頻切割完成!’)
馬上咨詢: 如果您有業(yè)務方面的問題或者需求,歡迎您咨詢!我們帶來的不僅僅是技術(shù),還有行業(yè)經(jīng)驗積累。
QQ: 39764417/308460098 Phone: 13 9800 1 9844 / 135 6887 9550 聯(lián)系人:石先生/雷先生