前回の記事で、リアル音声処理の下準備として、オーバーラップ+窓関数を実装しました。
今回は、FFTで周波数データに変換した後、音声のキーを変更し、元に戻してみたいと思います。
ピー音の音声処理から始まり、ようやくここまでたどり着きました。十分15年前に味わった挫折のリベンジを果たせたと思っております。
それでは、早速プログラム全体を見てみましょう。
プログラムの流れは、前回記事とほぼ同様ですが、FFT処理と逆FFT処理の間に、キー変更の処理を施しています。
そして、キー変更の関数を定義しています。その部分を解説していきます。
今回実装した周波数変更処理は、Pythonで音声処理(3)で実装した周波数変更処理がベースになっています。
前回からの変更点は、Pythonで音声処理(4)で示した通り、キー変更は周波数の足し算ではなく、掛け算となる点です。
具体的に見ていきましょう。
8行目で、キー変更関数「shift_freq」の定義を開始しています。引数として、FFT後のデータ、キーをいくつ上下させるか(下げる場合はマイナス)、サンプリング周波数、FFT後のデータ数をインプットしています。
10行目で、半音倍数を定義しています。これは、キーが一つ上がる(半音上がる)場合に、周波数が何倍になるかを表しています。
11行目で、キー、サンプリング周波数、ウインドウサイズに応じた実際にシフトさせる幅を決めるための係数(シフト係数)を計算しています。
13行目以降の処理は、Pythonで音声処理(3)のプログラムとほぼ同一ですが、16行目、25行目、36行目、45行目が異なります。Pythonで音声処理(3)では、単純にシフト分を加減算してましたが、今回は、インデックスにシフト係数を乗算したものを加減算しています。
これにより、音声中のどの周波数においても、同一のキー変更が適用されます。
それでは、リアル音声に対して、本プログラムを実行していきましょう。
入力する音声は、前回と同じ「arigato.wav」です。音量にご注意ください。
今回のメイン処理では、キーを「-8」としています。女性の音声であれば、男性の音声に変換されるはずです。
喋り方が女性っぽいので、違和感がありますが、声が低くなったことが確認できます。
続いて、音声のキーを高くしてみます。
音声を探していましたが、ちょうど良いものを見つけました。
筆者がカラオケで録音したあいみょんの「君はロックを聴かない」です。
これは原曲キーからキーを4つ下げて歌っているため、こちらを「+4」にして原曲キーにしてみます。
こちらも音量にご注意ください。
はい。熱唱していますね。笑。
これを今回作成したプログラムで、キーを+4にすると次のようになります。
うーん。少し音質が悪いのが気になりますが、原曲キーになっているかなと思います。
全6回に渡って掲載してきた、Pythonで音声処理は、今回の記事をもって一旦完結とします。
音声処理の次は、やはり画像処理をやってみようと思います。
コメント