はじめに
本記事は、「音声認識技術の実践:スペクトル解析」で説明しなかったデジタル音声の処理について補足説明したものをまとめた記事になります。
<今回の記事の内容>
- リファレンス一覧
実践記事で使用したライブラリのリファレンスを載せておきます - 音声データについて
前回の記事の中で音声データをどのように作成・編集したかを説明します - デジタル音声についての説明
サンプリングなどのデジタル音声に関する言葉の説明 - Pythonのフーリエ変換(おまけ)
フーリエ変換技術について調べたことを説明します
リファレンス一覧
プログラムの解説については、Python初心者でもわかるように別記事に作成いたします。
英語ですが、関数について解説されているページを参照にすれば問題なくソースコードを理解できるという人は、下のページを参考にしてみてください。
- Numpyリファレンス:Numpyの説明や、関数についての解説などが載っています。
- Scipyリファレンス:これはScipyのものです。
- Matplotlibリファレンス:matplotlibは様々な作図ができるので、いろいろ試してみたいですね。
音声データについて
スペクトル解析記事で利用した「こんばんわ」と発話する音声データは、Audacityというフリーソフトを利用して作成しました。使い方について説明します。
※waveデータであればスペクトル解析記事で作成したプログラムは実行できます。
つまり、これから説明する方法が絶対ではないです
スマートフォンで録音した声をPCに移動させ、拡張子を変換するという処理をしても良いでしょう。
音声データの作成(ボイスメモをmp3に変換するために参照するサイト https://www.technoveins.co.jp/t/products/wifi-soundmodule/wsd001aj/VoiceMemo.htm
(Waveファイルでなくても、適切なプログラムによって実行できる方は解説必要ないですね。) ただし、録音する音声はなるべく短いほうが良いです(できれば10秒以内)。時間が長いほど処理に時間が掛かります。
録音・編集ソフト
- 音声録音・編集フリーソフト「Audacity」について
「本格的に自分の音声を録音して解析してみたいけど、どうしたら良いかわからない!」 という人の為に紹介します。
Audacityは音声録音、編集、出力のできるフリーソフトです。wavファイルなどの読み書きも可能です。(mp3も利用可能。詳しくは窓の杜より)
https://forest.watch.impress.co.jp/library/software/audacity/
かなり様々なエフェクトを掛けられたり、機能が豊富です。
では、録音からwaveファイルの保存までの手順を説明します。
手順1 音声の録音
これがAudacityのウィンドウ画面です。左上の大きいボタン(左から一時停止、録音音声の再生、録音の停止、巻き戻し、早送り、録音開始ボタン)で音声の録音に関する操作が出来ます。
必要部分だけを切り出すことが出来るので、音声は長めに録音しました。
(何度か「こんばんわ」を繰り返しました)
手順2 録音音声の切り出し
必要部分だけを切り出します。
① 音声データをマウスのドラックで選択することが出来ます。必要な部分をドラッグで選択します。
(波形の白っぽくなっている範囲が選択した範囲です)
② トリミング(切り出し)機能です。このボタンを押すと選択した部分が切り出されます。
切り出した結果が下の画像です。
手順3 録音音声の編集
このままでも保存できますが、念のため正規化を行いました。
正規化は、音声波形のレベル(音量)を調整する機能です。
音声波形を見るグラフの左側にあるメモリ(-1.0から1.0)のレベルに合わせて音声波形を少し大きくします。
一番上のタブ[エフェクト]を押すと非常に多くの選択肢が出てきます。[正規化]を選びます。
デフォルトで-1.0dBになっていますね。このままOKを押します。
振幅の最大部分が1.0まで拡張された形になりました。
手順4 編集した音声をwaveに出力する
Audacityは保存ボタンを押すと、録音した音声や編集データをAudacityソフトのみが読み込める「作業データ」のようなものとして保存します。
従って、waveファイルにするためには[ファイル]タブより[Export]を選択します。
今回のPythonプログラムはwaveファイルを用いる予定だったので、[Export as WAV]を選択します。
これで音声の編集作業は終了です!保存先や保存名をわかりやすいものにしてくださいね。
最後は保存場所のおすすめです。
なるべく音声認識作業を行うワークスペースに置いたほうが扱いやすいと思います。
そこで、ワークスペース内のプロジェクト[VoiceRecognition]に音声を入れておく用のフォルダを作成しました。
作業環境が見やすくなりましたね。
音声データの性質を調べる(おまけ)
この音声データはどんな性質か調べてみましょう(おまけのようなものです)。
音声データといっても保有している情報は差異があります。
例えば「ステレオ」か「モノラル」か。ステレオは音声がスピーカーから出力される時、音声がより立体的に聞こえるように左右で若干違う情報が記録されています。つまり、音声に関する情報が2種類あります。一方モノラルは1つだけです。
この後で音声ファイルを使うPythonプログラムで、ステレオ音声をモノラルに変更する設定を行っています。
音の次元を下げたほうが処理が簡単だからです。
ここでは、音声ファイルがステレオかモノラルかを調べてみます。
''' waveファイルのデータをチェックするためのプログラム ''' import wave wavefile = wave.open(r"音声データの置いてあるパス/音声ファイル名.wav", "r") #waveファイルを開く channels = wavefile.getnchannels() #チャンネルチェック framerate = wavefile.getframerate() #サンプリング周波数チェック frame = wavefile.getnframes() #フレームの総数 wavefile.close()#ファイルを閉じる print("channel = ", channels) print("1:モノラル, 2:ステレオ") print("framerate = ", framerate) print("frame = ", frame)
ところで、waveファイルを開くためのコード
wavefile=wave.open(r...
とある部分の初めの[r]は、WindowsでPythonプログラムによる音声ファイルが開けない可能性があるため入力してあります。
Macの場合は特に必要ないようです。
スペクトル解析で使用した音声を入力すると以下の結果が得られました。
channelが2なのでこの音声データはステレオですね。実際にスペクトル解析実験の際は音声データをモノラルに変更する簡単なプログラムを使用しています。
また、このフレームレートは音楽業界みたいですね。これについては下で少し詳しく説明します。
デジタル音声についての説明
音声に関する言葉の説明です。
- サンプリングレート・・・一秒間に何回測定しているか
サンプリング
サンプリング(標本化)について説明します。
現実世界では波形は連続したデータです。
しかし、分析をしたい時に連続データというのはとても扱いにくいのです。
昔、線は点の集まりであると教わったことはありますか。連続データ(線)は無限の離散データ(点)の集合です。これを全て分析するのは不可能です。
サンプリングは、「入力された連続データをある短い時間間隔で分割し、1つ1つの区間の最大値を離散データとして記録する」技術です。簡単に言うと連続データを分析可能な離散データに変換する処理です。
サンプリング処理は、分割する区間を短くしすぎると連続データのように、情報量が増えすぎて処理に膨大な時間が掛かってしまいます。しかし、分割をする区間があまりに長いと、図のように正確な値が取れなくなります。従って短すぎず長すぎないサンプリングの数が求められます(これがサンプリングレートになります)。丁度良いサンプリング数については、サンプリング定理というルールがあるため、比較的簡単に求めることが出来ます。
ただし、人間が音声として発音できる周波数は肉体的に高が知れています。また、人間が聞き取れる周波数も同じように限界があります。つまり、サンプリングレートには状況に合わせた定番の数があります。音楽なら多めにサンプルし、電話なら会話が目的なので音楽処理より少なかったりします。
Pythonのフーリエ変換(おまけ)
Pythonで実際に音声認識プログラムを作る際、調べてみたことをまとめました。
フーリエ変換という技術について
フーリエ変換は、音声認識技術では音声波形の特徴を捉えるために使われます。音声認識においては特徴抽出の一部というイメージでした。実装など技術的な部分を調べてみると面白かったので一例を載せます。
「どの周波数が一番強く現れるか」という変換技術は音声だけでなく、画像にも用いることが出来ます。ノイズの多い画像を画質向上させる主要な技術として利用されています。
個人的に面白いと感じたのは、地形を把握するためのレーダーに使用されている点です。
音声だけでなく、対象の空間(画像や対象との距離)の特徴も調べることが出来る技術だったんですね。
numpyとscipyの違いは?
ところで、Pythonでフーリエ変換を実行するモジュールはnumpyとscipyの2種類のライブラリにありました。numpyライブラリには「fft」、scipyライブラリには「fftpack」というモジュール名でした。
numpyとscipyは、実行できる処理の結果がどちらも似ています(ぱっと見ほとんど同じです)。
今回「スペクトル解析 1.2 簡単な例でフーリエ変換を試す」で構築した簡単な波形に用いるフーリエ変換プログラムでは違いがわかりません。
フーリエ変換を実験している他の記事でも、numpy、scipyどちらも利用しています(比率としてはnumpyを利用していることが多い印象でした)。
調べた結果、フーリエ変換に限らず
「scipyのほうがnumpyよりも速くて多機能」ということでした。
そもそも、scipyはnumpyの処理をベースに、さらに高速化・効率化を目指したライブラリとして作られたようです。そのため、numpyで出来る処理はscipyでもほとんど実行できる上にnumpyよりも機能が増えています(実際の計算方法も効率化のため異なっているようです)。
つまり、フーリエ変換においても、入力するデータ数が増える(処理が複雑になる)ほど、scipyのほうがより速く結果を出力できるということです。ただし、今回のような簡単な処理であればどちらでも結果に差はないということでした。
まとめ
今回は、スペクトル解析の周辺の技術について補足としての説明を追加しました。
個人的な感想ですが、理論の学習だけでなく実践として技術に触れることで新たな発見ができたと感じています。
技術的な面白い部分を共有出来たらうれしいです。
参照したページ
https://numpy.org/doc/stable/
https://docs.scipy.org/doc/scipy/reference/#
https://matplotlib.org/#