自分で録音した音声信号や、データセットなどを用いて機械学習や深層学習によって処理を行う需要は多いと思います。
音声を使ったものには話者認識や音声認識、音声生成、音声変換などの様々なアプリケーションがあります。
その際、音声信号をそのまま用いてもなかなか良い結果は得られません。
今回の記事では音声信号の前処理としてVAD(:Voice activity detection, 音声区間検出)とウィナーフィルタを紹介します。
VADで無音の区間を除去して、ウィナーフィルタによってノイズを除去します。
音声は日本声優統計学会というところからお借りしました。
https://voice-statistics.github.io/
藤東知夏さんがテキストを読み上げている10秒ほどのデータ(fujitou_normal_002.wav)を使用しました。
librosa.effects.trimで音声区間を抽出
音声データの先頭と末尾に入る無音区間を除去します。librosa.effects.trimを用います。
閾値を定める引数のtop_dbの値は、デフォルトで60になっていますが用いるデータに合わせて調整すると良いです。
1 2 3 4 |
import librosa if __name__ == "__main__": wave, fs = wav_read(path_to_wavfile) wave_trimmed, index = librosa.effects.trim(wave, top_db=25) |
これを用いて前後の空白を除去すると以下のようになります。
前後の無音区間がカットできています。
scipy.signal.wienerでノイズ除去
ウィナーフィルタを用いてノイズを除去します。scipy.signal.wienerを用います。
音声と雑音の相関が無いという前提で、本来の音声信号と推定した音声信号の平均二乗誤差(mean-square-error)を最小にするような線形フィルターを形成し、雑音を含んだ入力信号から元の音声信号を得る。(音声強調 – Wikipedia)
1 2 3 4 5 |
import scipy.signal if __name__ == "__main__": wave, fs = wav_read(path_to_wavfile) wave_trimmed, index = librosa.effects.trim(wave, top_db=25) wave_filtered = scipy.signal.wiener(wave_trimmed) |
一行で簡単に書けますね。
STFTした結果をプロットします。(参考:pythonで時間周波数解析~STFT~)
これで明瞭な信号を得ることができました。
このように前処理をしたデータを用いて機械学習に用いるような特徴抽出を行っていきます。
特徴抽出についてまとめたページがあるので、良かったら見てみてください。
pythonで音響信号の特徴抽出方法まとめ
コメント