FFmpegを使って動画から画像を切り出す方法や、PythonからFace APIを使う方法など、声データから分析した感情の結果との比較について「音声感情解析」に挑戦してみました。

チャレンジ&ナレッジ最終更新日: 20191106

音声感情解析AIを使って、彼氏のことが大好きな女の子の声から感情を読み取ってみた

  • このエントリーをはてなブックマークに追加

NEXMAG編集部の森です。みなさんは、人と会話しているときに「この人は今どんな気持ちなんだろう…?」と考えたことはありますか。おそらく多くの人が、コミュニケーションを円滑にするために、相手の声色や表情から感情を読み取ろうとした経験があると思います。
実は、その「声から感情を読み取る」という複雑な判断、人間ではなくAIでもできるのだとか!
そこで今回は、『ニューラルネットワークを使ってLINEの相手が「おじさん」か「女の子」か見破ってみた』などの記事でお世話になっているranranさんにサポートしてもらいながら、「音声感情解析」に挑戦してみました!
私のようなノンプログラマーでもできる方法なので、この記事で手順をご紹介していきます!

解析する音声ファイルを用意する

今回解析するのは、以下の4つのシチュエーションで話したセリフです。彼氏のことが大好きだという知人の女の子に、それぞれのセリフを発しているところを動画に撮ってもらいました。

シチュエーションA
彼氏にサプライズでディズニーに連れて行ってもらえることになった
セリフ:「えー明日ディズニー?本当に!いいの?たのしみー!」

シチュエーションB
彼氏に「明日は何時まで予定あるの?」と聞かれた
セリフ:「んー?明日?…えっとね、ちょっと待って…明日は5時までだよ」

シチュエーションC
彼氏に知らない女からLINEが来ているのを見つけた
セリフ:「ねえ、これ誰?このLINEの女誰なの?なんでこんなに仲よさそうなの?」

シチュエーションD
彼氏から、明日のデートに仕事で行けなくなったと伝えられた
セリフ:「そっか…仕事なら…仕方ないよね。わかった。ううん、全然大丈夫…気にしないで…」

動画ファイルから音声だけを抽出する

次に動画ファイルから音声だけを抽出します。

音声の抽出には音声切り出しが可能なソフトウェアを使用します。
(CyberlinkのPower Director、Blackmagic designのDavinci Resolveなどがありますが、その他フリーソフトでも切出し可能なソフトウェアがあります)
今回解析に使用する「Empath」で解析できる音声ファイルの条件に合うよう、下記を確認して設定してください。

「Empath」で解析できる音声ファイル
●PCM WAVE形式、16bitであること。
●データサイズが1.9MB以下であること。
●フォーマットがPCM_FLOAT、PCM_SIGNED、PCM_UNSIGNED のいずれかであること。
●録音時間が5.0秒未満であること。
●サンプリング周波数が11025Hzであること。
●チャンネル数が1(モノラル)であること。

解析に使用するAPI Keyを生成する

音声ファイルの用意ができたら、解析に使用するAPI Keyを生成します。

今回は、音声から感情を解析するのに「Empath」というAIを利用しました。このAIは、声の物理的特徴量を解析することで、言語に依存することなく「平常」「怒り」「喜び」「悲しみ」の4つの感情と、元気度を解析することができます。

以下の手順で操作していきましょう。

①「Empath」のサイトにアクセスし、「product」の欄にある「APIご利用お申し込み」をクリック

“Empath”.Empath Inc.2019.
https://webempath.com/jpn/

②「新規登録」をクリックし、「利用規約」「個人情報取扱い同意書」に同意、メールアドレスとパスワードを登録する。

③認証メールに記載されているURLにとび登録完了!

④再びサイトの「product」欄に戻り「APIご利用お申し込み」をクリック。

⑤「ログイン」をクリックし、登録したメールアドレスとパスワードを入力。

⑥API Key設定をクリック

⑦「追加」をクリックし、タイトルを設定。API Keyの生成完了!

Pythonを使って解析の準備をする

「Empath」のサイト上でAPI Keyを生成できたら、ここからはPythonを使って解析の準備をします。

環境構築の方法については下記の記事を参考にしてください。
“Python Windowsで開発環境の構築”
https://www.pc-koubou.jp/magazine/4188

ちなみに今回は、APIを使用するのに必要なライブラリの対応の都合でpython 2.7.13を使いました。

①Windowsの場合は「コマンドプロンプト」、Macの場合は「ターミナル」を開く。

②pip install poster==0.8.1 と入力し、APIを使用する際に必要なライブラリ「poster」をインストール。

“poster · PyPI”. Python Software Foundation.2019.
https://pypi.org/project/poster/

③インストールが完了したら、「Empath」のサイト上のメニューの「ドキュメント(https://webempath.net/user/document)」にあるEmpath WebAPI 仕様書 (version 1) から下記のpythonのサンプルコードをコピペする。「APIKEYを入力」の箇所は、先ほど「Empath」のサイトで生成したAPI Key、「wavファイルの名前を入力」の箇所は、解析したいwavファイルの名前に、それぞれ書き換える。

from poster.encode import multipart_encode, MultipartParam
from poster.streaminghttp import register_openers
import urllib2

url="https://api.webempath.net/v2/analyzeWav"
register_openers()
items = []
items.append(MultipartParam('apikey', "APIKEYを入力"))
items.append(MultipartParam.from_file('wav', "wavファイルの名前を入力"))
datagen, headers = multipart_encode(items)
request = urllib2.Request(url, datagen, headers)
response = urllib2.urlopen(request)
if response.getcode() == 200:
    print(response.read())
else:
    print("HTTP status %d" % (response.getcode()))

④あとはAIが解析してくれるのを待つだけ! 「音声の感情分析」と聞くと難しそうですが、この方法なら文字列をコピペするだけなので、とっても簡単です!

解析結果は…?

音声ファイルを解析した結果は、それぞれ以下のようになりました!

シチュエーションAの解析結果

シチュエーション:彼氏にサプライズでディズニーに連れて行ってもらえることになった
セリフ:「えー明日ディズニー?本当に!いいの?たのしみー!」

結果:{"error":0,"calm":21,"anger":0,"joy":25,"sorrow":2,"energy":23}

「喜び」の数値が高くなっているので、嬉しい気持ちが強く声に表れていたのでしょう。「元気度」も高めで、テンションの高さが読み取られているようです。

シチュエーションBの解析結果

シチュエーション:彼氏に「明日は何時まで予定あるの?」と聞かれた
セリフ:「んー?明日?…えっとね、ちょっと待って…明日は5時までだよ」

結果:{"error":0,"calm":0,"anger":9,"joy":24,"sorrow":16,"energy":17}

こちらも「喜び」の数値が高めに出ましたが、Aのシチュエーションに比べると「元気度」は低めです。「悲しみ」も少し含まれているのは、セリフに間があるからでしょうか。

シチュエーションCの解析結果

シチュエーション:彼氏に知らない女からLINEが来ているのを見つけた
セリフ:「ねえ、これ誰?このLINEの女誰なの?なんでこんなに仲よさそうなの?」

結果:{"error":0,"calm":25,"anger":0,"joy":4,"sorrow":20,"energy":0}

声を荒げるのではなく淡々と怒っているからか、意外にも「平常」の数値が高く、「怒り」は0という値が出ています。「悲しみ」の数値が高く、「元気度」も0なことから、浮気を疑っているものの、怒っているのではなく悲しい気持ちになっているのかもしれません。

シチュエーションDの解析結果

シチュエーション:彼氏から、明日のデートに仕事で行けなくなったと伝えられた
セリフ:「そっか…仕事なら…仕方ないよね。わかった。ううん、全然大丈夫…気にしないで…」

結果:{"error":0,"calm":44,"anger":5,"joy":0,"sorrow":0,"energy":5}

「平常」が、かなり高い値となっているため、残念だと思いつつも、相手を気遣って平常を装っているような状態なのでしょう。「怒り」が少し含まれているところに、本心が表れてしまっているようで面白いですね。

“意外な結果”が、文字からは読み取れない本心を表しているかも……?

今回の解析では、シチュエーションからある程度予想できるような結果だけでなく、「怒っているセリフだが悲しみの数値が高い」といったような、少し意外な結果も出ました。

もしかしたら、そのような“意外な結果”が、文字からは読み取れない本心を表している可能性もあるでしょう。

実際に「音声感情解析」をしてみて、セリフを発した本人ですら、解析結果が正解かどうかは断定できないという点が面白いと感じました。本人よりもAIのほうが正確に感情の機微を捉えているとしたら、なんだか不思議ではないですか?

今回ご紹介した「Empath」を使えば、私のようなノンプログラマーでも、シンプルな手順で「音声感情分析」を行うことができます。AIや感情解析に興味のある方は、ぜひ実践してみてください。

ライタープロフィール パソコン工房NEXMAG
[ネクスマグ] 編集部

パソコンでできるこんなことやあんなこと、便利な使い方など、様々なパソコン活用方法が「わかる!」「みつかる!」記事を書いています。

記事を
シェア