対話システムに使える(かもしれない)音声情報処理入門

  • 30
    いいね
  • 0
    コメント

はじめに

この記事はTech-Circle Hands on Advent Calendar 2016の19日目の記事です。
Tech-Circleさんは機械学習やAI技術などにフォーカスしておられるということで、私から何か有用な情報を提供できないかと思い、今回は「対話システムに使える(かも知れない)音声情報処理」について書こうと思います。

対話システムと音声情報処理

対話システム(SiriやCortanan、Watsonなど)と音声情報との関係は多くの方が密接であると直感的に想像できると思います。
しかし一般的に実装される対話システムのほとんどはテキストベースであり、テキストフォームに発話を入力し、対話システムが応答をテキストとして返す。もしくは音声認識はするが結局処理の対象は言語情報であるなどの形が多いと思われます。

世の中にはメラビアンの法則と言うものが存在し、人との感情的なコミュニケーションの中で言語情報、聴覚情報、視覚情報の伝わる割合は下記のようになっていると示されています。

  • 言語情報:7%
  • 聴覚情報:38%
  • 視覚情報:55%

つまり現状の対話システムで扱っているテキスト情報(言語情報)は全体の7%程度でしかないということです。
あくまで感情的なコミュニケーションの話なのでタスク遂行を目的としているのであれば言語情報の重要性はもっと高まるでしょう。
しかし今対話システム界隈で流行になっているような「雑談対話」を行うには味気ない対話ではなく、感情的なコミュニケーションを欠かすことはできません。

ではどうするればよいかというと、残りの93%を占める、聴覚情報と視覚情報を利用すれば良いのです。

人間のコミュニケーションの例で考えてみましょう。
例えば元気のなさそうな友人に、「元気?」と聞くと、「元気だよ」と返してくれたとします。
テキスト情報では「元気だよ」という情報しか得ることはできませんが、もしかしたらその人は心配をかけないように「元気だよ」といっているのであって、本当は元気ではないのかもしれません。

我々人間は、「元気だよ」という発話の中から、声のトーンや、相手の表情など、様々な情報を複合して応答を判断しているのです。
このような処理は対話システムでも例外ではなく、感情的な対話を行うにはこれらの情報を活かす他ありません。

このような言語情報だけではなく、様々な情報を扱う対話システムのことをマルチモーダル対話システムと呼びます。

今回はマルチモーダル対話システムの中でも、音声情報にフォーカスし、どのようにして処理すれば良いのかを考えていきましょう。

声の大きさを調べる

ここから少し手を動かします。
今回はMacの上で行いたいと思います。

まず音声データの波形を表示したり、切り取ったりできる波形エディタ、audacityをインストールしましょう。

Audacityを立ち上げると以下のような画面になります。
まずは自分の声を録音してみましょう。
赤いボタンを押して録音開始し、黄色いボタンで録音停止します。

1.png

以下は私が録音した「こんにちは」という声です。(地声)

2.png

緑色のボタンで聞くことができます。
他にも波形の縮尺なども操作できますが、だいたい直感的に操作できると思います。

さて、ここからどのような情報が読み取れるでしょうか。当たり前ですが横軸が時間軸であり、時間軸に沿って波形が記述されています。
もう一ついうと、大きな声が入っているところは波形の振幅(縦軸)が大きくなっています。
ここらへんは中学の理科で習ったので大丈夫だと思います。

波形を横軸にものすごく拡大してみましょう。
拡大すると、音声データは波形であることがよくわかります。

3.png

では音声波形データはどのようにデータとして記録されているのでしょうか。
音声波形はマイクを通して、データとして記録されます。

簡単に言うと、32bit PCMの場合、32bitの範囲で記録された音のデータが横軸に大量に並んでいます。

1秒間に録音で記録する数はサンプリング周波数と呼ばれ、今回の場合は44100hz、1秒間に44100個の32bitデータを記録しています。(16bit PCMが一般的?)

それらを横軸に並べることで晴れて波形として見ることができます。

5.png

先程の波形に縮尺を戻します。。
音の大きさは振幅の大きさなので、音の大きさを調べたいときは、振幅の大きさを見ればいいことになります。
振幅は先程述べた通り、32bitのデータとして記録されているので、信号データを2乗し(波形はマイナスにも行くため)、平均値を取ることでだいたいの音の大きさを出すことができます。

2.png

声の高さを調べる

一般的に女性は声が高く、男性は声が低いです。また、元気のない人は声の高さ(トーン)が低く、元気のいい人は声の高さが高いです。

そのような声の高さはどのようにして波形から判断できるでしょうか。

中学理科では音の高さは「周波数の大きさ」として習います。
高い音は波形の振動回数が多く、低い音は波形の振動回数が少ないです。

しかしそれは音さなどのクリアな音を出せる音源の話であり、人間の声などの場合、もっと複雑な処理が必要となります。

先程の拡大波形を見ると、音さで見るような波形よりも遥かにぎざぎざで振動回数ってどうやって数えるんだよ状態になります。

3.png

なぜなら人間の声は喉の中で音源として発生し、口の中を通り、声として放射されるまでの間にさまざまな周波数の音が合わさった合成波形だからです。

合成波形の場合、単純に音の高さを調べるときに振動回数を数えるというわけにはいかず、「様々な高さの音がいろんな大きさで合成されている」と考える必要があります。

ではどのようにして声の高さを分析するのかというと、合成されている様々な高さの音について、「どの高さの音がどれぐらいの大きさで合成されているか」という分析をします。これを周波数分析と言います。

周波数分析をする一般的な方法として、フーリエ変換があります。
フーリエ変換をすることによって、

横軸:時間 , 縦軸:振幅

のデータから

横軸:周波数 , 縦軸:パワー

のデータを得ることができます。
このような横軸に周波数、縦軸にパワーが表されたデータを周波数スペクトルと呼びます。

では実際にスペクトルを表示してみましょう。

波形の一部を選択し、[解析]>[スペクトラムの表示]を押します。

6.png

このような波形が表示されると思います。
これがスペクトルと呼ばれるもので、横軸に周波数をとり、周波数ごとにどれだけのパワーがあるかを表示しています。

7.png

スペクトルを見てみると、いくつかの山があることが確認できます。
この山となっている周波数をフォルマント周波数と呼び、その声を特徴づける重要な周波数となります。

この中で一番周波数が低い山(一番縦軸で高い山)を基本周波数(F0)と呼びます。

音声波形で一般的に「声の高さ」と言うのはこの「基本周波数」として表されます。

8.png

つまり、声の高さを分析するためには波形データから単純に得ることは難しく、フーリエ変換などで周波数スペクトルを作成した後、基本周波数の推定をしないと声の高さを得ることはできません。(たいへんめんどくさい)

音声情報処理をするためのツール

さて、たかが「声の高さ」を知るだけでもそれだけめんどくさいことをしなければいけないのが音声情報処理の世界なのですが、自然言語処理の分野でもword2vecなど様々なツールが揃っているように、音声情報処理にもそれ用のツールが存在します。

SoX

Sound eXchangeというツールです。
こちらはAudacityで行うような波形編集をコマンドラインから行えるツールで、無音区間を切り取ったり、サンプリング周波数を変えたり音の大きさを変えたりノイズカットしたりなど、分析前の前処理に便利です。

インストールは

brew install sox

使い方は今更聞けない目的別soxの使い方というすごくわかりやすい記事にまとまっていますが複雑なことをやるためには公式ドキュメントの日本語訳を見るのがよいかと思います。

今回は先程録音した音声から無音区間を削除してみましょう。

Audacityで[ファイル]>[オーディオの書き出し]からWavファイルに録音したデータを書き出します。

ダウンロードしたsoxバイナリをTerminalから実行できるようにいろいろして(alias登録など)以下のコマンドを実行してください。

./sox sample.wav sample_vad.wav vad reverse vad reverse

上のコマンドはsample.wavのデータに対し、vad(先頭から無音区間を削除) reverse(音声波形を逆向きに変換) vad(先頭から無音区間削除)し、再度reverseしたものをsample_vad.wavとして出力するというコマンドになります。
つまり、両側から無音区間を削除します。

sample_vad.wavをAudacityで見てみると、下図のように無音区間が削除されていることがわかります。

9.png

openSMILE

音声データから感情を認識するために、どのようなパラメータを使えばいいかという研究タスクのために作られた(らしい)、様々な音声データの特徴量を出力してくれるツールです。
先程述べていた音量や、基本周波数も一発で出力してくれます。
公式サイト

WindowsとLinux向けにバイナリを提供してくれているのですぐに使うことができます。(ソースからのコンパイルはめんどくさい)
が、Macにはバイナリを提供していなかったのでソースからコンパイルします。

openSMILEをダウンロードしてください

ビルドに必要なパッケージのインストール

brew install automake
brew install libtool

ビルド

./buildStandAlone.sh

これでSMILExtractというバイナリができます。

openSMILEではどういう特徴量を出力するかという設定をコンフィグファイルで行います。
configフォルダの中に入っているファイルがコンフィグファイルになります。
この中から好きなものを選びますが今回はIS09_emotion.confを選択します。

以下のコマンドで音響特徴量を出力します。

./SMILExtract -C config/IS09_emotion.conf -I sample_vad.wav -O sample_vad.arff

sample_vad.arffというファイルができるので中身を見てみます。
大量の特徴量が書き込まれていると思います。

11.png

このarffというフォーマットはcsvの拡張のようなフォーマットで、attributeという属性にデータの名前や型が型が書いてあり、@data以下にその対応しているデータが出ます。

attributeを見てみると、[pcm_RMSenergy_sma_amean]という属性がありますが、これが音量の平均値となります。
また、[F0_sma_amean]という属性が基本周波数の平均値となります。
openSMILEでは平均値のみではなく、最大値や最小値、またはデルタ(変化量)なども出力してくれます。

IS09でどのような特徴データが出力されるかはこちらの論文が非常にわかりやすいです。

音声情報を機械学習する

さて、先程までで、音声データから、様々な特徴量という数値データを得ることができました。
数値データさえ得ることができたなら、あとは他の分野のデータ処理と同じように、機械学習をすることもできます。

先程、openSMILEではarffというフォーマットでデータを出力しましたが、このarffはwekaという機械学習ツールで使われているデータ・フォーマットであり、wekaならばopenSMILEで出力された結果をそのまま取り込むことができ、簡単に機械学習することができます。

wekaをダウンロードしてください。
wekaはjava製のツールなので、JREが必要になります。

wekaを起動するとWeka GUI Chooserというものが表示されるので[Explorer]をクリックします。
12.png

Explorerから[Open file...]をクリックして、先程作ったsample_vad.arffを選択します。

左下にあるAttribute一覧から[F0_sma_amean]を選択すると、右側にMinimumやMaximumが表示されます。
今回はデータが1つしかないので68.145のみとなっています。
これで、基本周波数が68.145という数値で表されていることがわかります。(68Hzなのか68kHzなのか、単位は何かは調査不足でわかりませんが、おそらく他の音声データと比べたときに、数値に差が現れるでしょう)

13.png

Wekaは大変便利なツールで、[Classify]タブでは機械学習アルゴリズムを選択してモデル学習、評価まで全部行ってくれます。
[Selected Attributes]では大量の特徴データからどの特徴データが関連が強いかなどから特徴データを絞ることもできます。
また、[Visualize]ではある特徴量に対し、どの特徴量がどういう相関をもっているかなども表示してくれて、至れりつくせりです。

今回は音声を1つしか録音していないのでデータが1つしかなく、機械学習はできませんが、大量の音声を録音したとき、wekaを使って音声の機械学習を行うことができるでしょう。

おわりに

今回は音声情報を録音から機械学習(の準備)まで解説しました。
もうお気づきの通り、音声情報処理は自然言語処理に比べ、データを得るために人の声を録音しなければならない、処理するデータが大きい、特徴抽出が難しいなどの点において非常にめんどくさい部分が多いです。

また、いつでもクリアなデータを録音できるとは限らず、マイクとの距離やマイクの種類、他の雑音などに影響を受けやすく、対話システムに導入しにくい情報となっています。

しかし、実際に人間は相手の声のトーンや発話の速さなどを聞き取って、応答するアクションを変えているため、対話システムに活用することができればその対話システムはよりユーザー満足度の高いものとなるでしょう。

ではTech-Circle Advent Clendar2016 19日目の記事はこれで終わりです。明日はrina0521さんです!