15年ほど前、大学で習った音声処理技術をJavaを使って実現しようと思いましたが、難しくて挫折しました。
特に配列周りが複雑になり、諦めた覚えがあります。今回はPythonで音声処理プログラムの作成をリベンジをしたいと思います。
PythonはNumpyというモジュールが大変便利で、配列周りを気にせず音声処理のプログラム作成に専念できます。
とはいえ、難しい技術であることに変わりないので、油断せず基本的なところから少しずつプログラムを作成していきます。
本記事ではまず、正弦波を作成、グラフ化し、音声(ピー音)に変換します。
前準備として、下記コマンドによりPythonにモジュールを追加します。
pip install numpy
pip install wave
pip install matplotlib
NumpyとWave、Matplotlibモジュールを利用します。
それでは早速プログラムを見ていきましょう。
まず最初に、先ほどインストールしたモジュールを読み込みます。
7行目から11行目では、作成するピー音の設定を定義しています。
7行目の振幅は、音の波の大きさを表しています。
8行目のサンプリング周波数は、1秒間に何回、音波の値を取得するかを定義しています。ここでは難しい話はしませんが、大きいほど音質が良くなります。ちなみにCDの音質は44100回/秒です。今回はただのピー音なので、8192回/秒とします。回/秒は「Hz(ヘルツ)」という単位で表されます。
9行目の周波数は、ピー音の音階を表しています。440Hzは「ラ」の音を表します。
10行目の秒は、ピー音の長さを表しています。5秒間のピー音を作成します。
11行目のNは、音波の値の総数です。サンプリング周波数×秒数で計算できます。
12行目は、音声データを格納する空の配列を定義しています。
13行目~16行目のループで、Sin関数を利用し、設定に応じた正弦波のデータを生成し、配列に格納しています。
18行目~21行目は、生成した正弦波のデータのうち、0~100個までのデータをグラフ化し、png画像として保存しています。
保存した画像は以下のようになりました。
23行目から最終行までは、作成した正弦波を音声(Waveファイル)として保存してます。
24行目では、作成した正弦波のデータが-1.0~1.0までの振幅になっているので、Waveファイルのフォーマットに変換するため、-32768から32767の整数値に変換しています。
26行目~32行目までの処理で、実際にWaveファイル(output.wav)として書き込み処理を行っています。
作成したWavファイルはこちらになります。
ピー音というよりプー音ですね。
ひとまず、ここまでは上手くできました。
次回の記事では、FFTという処理を実行して、音声の周波数を見てみます。
コメント