#・解決したいこと
参考サイトを元にwavファイルを音声波形として認識して、一定の振幅を下回り、
尚且つ一定時間を超える部分(=無音部分)をカットしていく作業を自動化しようと考えています。
条件を満たした部分がをどうやって参考サイトのブルーの透明な棒グラフのような形で反映されるのか分からず途方に暮れています。
下記に自分で実行した手順を記載しますのでポイントなど参考意見を伺えますと幸いです。
#・音声ファイルの読み込み
Python
1import soundfile as sf 2import numpy as np 3import matplotlib.pyplot as plt 4import os 5 6path = os.listdir('.') 7path.sort(reverse=True) 8 9src_file = os.path.abspath(os.path.join('./','audio.wav')) 10src_file 11 12data, samplerate = sf.read(src_file) 13 14t = np.arange(0, len(data))/samplerate 15 16plt.figure(figsize=(18, 6)) 17plt.plot(t, data) 18plt.show()
#・振幅が0.03を超えない部分を抽出
Python
1thres = 0.03 2amp = np.abs(data) 3b = amp > thres 4 5plt.figure(figsize=(18, 6)) 6plt.plot(t, b) 7plt.plot(t, amp) 8plt.show() 9 10
条件式がでTrueとFalseがそれぞれ1と0に対応?
#・問題部分:反映のさせ方が不明な部分
Python
1 2min_silence_duration = 0.5 3silences = [] 4prev = 0 5entered = 0 6 7for i, v in enumerate(b): 8 if np.array(prev == 1).all() & np.array(v == 0).all(): # enter silence 9 entered = i 10 if np.array(prev == 0).all() & np.array(v == 1).all(): # exit silence 11 duration = (i - entered) / samplerate 12 if duration > min_silence_duration: 13 silences.append({"from": entered, "to": i, "suffix": "cut"}) 14 entered = 0 15 prev = v 16if entered > 0 & entered < len(b): 17 silences.append({"from": entered, "to": len(b), "suffix": "cut"}) 18 19#silencesの中身 20 21# [{'from': 62277, 'to': 103719, 'suffix': 'cut'}, 22# {'from': 122913, 'to': 158973, 'suffix': 'cut'}, 23# {'from': 168893, 'to': 279411, 'suffix': 'cut'}, 24# {'from': 323663, 'to': 393915, 'suffix': 'cut'}, 25# {'from': 411662, 'to': 466864, 'suffix': 'cut'}, 26# {'from': 496069, 'to': 554312, 'suffix': 'cut'}, 27# {'from': 723233, 'to': 793695, 'suffix': 'cut'}, 28# {'from': 814843, 'to': 852034, 'suffix': 'cut'}, 29# {'from': 907374, 'to': 941952, 'suffix': 'cut'}] 30
この0.5秒の沈黙を上回った部分をカットして、リストのsilencesに追加していった後に、
参考サイトの参考画像のようなグラフに変化させるにはどのようにしたらいいでしょうか?
よろしくお願いしいます。
回答1件
あなたの回答
tips
プレビュー