・Pythonを使って簡単かつ無料で感情分析してみたい人
・音声ファイルをPythonでどうやって扱うのかを知りたい方
など
なにを隠そう私はアニメ大好きアラサーです。(突然どうした)
そんなアニメの醍醐味の一つは声優さんの演技だと思っております。
「こんにちは」ってセリフ1つでも声優さんの演技一つでキャラクターの感情が微妙に変わってくるものです。
そんな音声をAIで分析して感情を分析したいと思い、調べてみると
Empathというwebサービスがまさに声の感情分析ができて、さらにPythonで分析できると!!
しかも月250回までは無料との情報が!!
これはやってみるしかない!!と思い
実際にやってみたので記事として書かせていただきました。
Empathによる感情分析
EmpathはWeb API化されていて、ユーザー登録をすると利用することができます。
下記のようなサービスらしいです。
Empathは、音声等の物理的な特徴量から気分の状態を独自のアルゴリズムで判定するプログラムです。
https://webempath.net/lp-jpn/
数万人の音声データベースを元に喜怒哀楽や気分の浮き沈みを判定します。
開発者の方々に簡単にご利用頂けるように、Web API化いたしました。
Empathで解析できる感情は次の通りです。
- calm (平常)
- anger (怒り)
- joy(喜び)
- sorrow (悲しみ)
- energy (元気度)
これらのパラメータが0~50で出力されます。
今回のお題
今回少し大変だったのが、お題となる音声を探すことでした(笑)
調べてみたら、この「あみたろの声素材工房」さんの音声が使ってもよさそうでしたので
今回はこの音声を使って、分析をさせてもらいました。
今回は「さようなら!(明るく)」と「さようなら(涙をこらえて)」を題材に
分析していきたいと思います。
Pythonによる音声分析
音声ファイルの準備
さっそくコードの紹介といきたい所ですが、、、
あみたろの声素材工房の音声をダウンロードをしても
そのままでは、使えないです。
以下がそのルールになります。
本APIは、次のような音声データを解析対象とする。
Empath WebAPI 仕様
・PCM WAVE形式、16bitであること。
・データサイズが1.9MB以下であること。
・フォーマットがPCM_FLOAT、PCM_SIGNED、PCM_UNSIGNED 䛾いずれかであること。
・録音時間が5.0秒未満であること。
・サンプリング周波数が11025Hzであること。
・チャンネル数が1(モノラル)であること。
このルールにのっとったwavファイルへの変換が必要なのですが
これもPythonでやっちゃいましょう。
ライブラリは
「librosa」と「pysoundfile」を使います。
ここはpipで簡単にインストールしちゃいましょう。
pip install librosa
pip install pysoundfile
以下のコードでwavファイルを変換しましょう。
import librosa
import soundfile as sf
y, sr = librosa.core.load('sayonara_01.wav', sr=11025, mono=True) # 22050Hz、モノラルで読み込み
sf.write("new_sayonara_01.wav", y, sr, subtype="PCM_16") #1
y, sr = librosa.core.load('sayonara_02.wav', sr=11025, mono=True) # 22050Hz、モノラルで読み込み
sf.write("new_sayonara_02.wav", y, sr, subtype="PCM_16") #1
sayonara_01.wav(明るいさよなら)とsayonara_02.wav(涙をこらえて)は
あみたろ素材さんからダウンロードしたファイル名になります。
このコードを実行してできるnew_sayonara_01.wavとnew_sayonara_02.wavがEmpathで分析出来るファイルになります。
感情分析
では感情分析を実行しましょう。
まずはEmpathで登録が完了するとAPI Keyを設定できるため
これを使いましょう。
API Keyが発行されたら、あとはコードを実行しましょう。
import time
import requests
url = 'https://api.webempath.net/v2/analyzeWav'
#ここはご自分のKeyを入力ください
apikey = 'XXXXXXXXXXXXXXXX'
payload = {'apikey': apikey}
wav = 'new_sayonara_01.wav' # 「明るく」
data = open(wav, 'rb')
file = {'wav': data}
res = requests.post(url, params=payload, files=file)
print(res.json())
time.sleep(1)
wav = 'new_sayonara_02.wav' # 「涙をこらえて」
data = open(wav, 'rb')
file = {'wav': data}
res = requests.post(url, params=payload, files=file)
print(res.json())
こちら結果としては
①明るい「さよなら」
{‘error’: 0, ‘calm’: 0, ‘anger’: 0, ‘joy’: 50, ‘sorrow’: 0, ‘energy’: 50}
②涙をこらえた「さよなら」
{‘error’: 0, ‘calm’: 25, ‘anger’: 0, ‘joy’: 22, ‘sorrow’: 2, ‘energy’: 20}
とでてきます。
やってみて思ったのですが
②の涙をこらえたは「さよなら」は今思えばかなり複雑ですよね。
シチュエーションによって、涙の意味も変わる。。。
かなり面白い結果になったのではないでしょうか!!!
おわりに
ここまで読んでいただきありがとうございました。
もしかしたらこれを読んで下さっている方は
ご自身がお持ちの動画ファイルだったりから音声を取り出したいという方も
いらっしゃるかもしれません。
そんな方は以下のページも参考になると思いますので、是非読んでみてください。
私の趣味なのですが、このコードを使って
アニメの動画から声データを抽出して、Pythonで音声分析しております。
こんな変態で大変恐縮ですが
色々とPythonを使って遊んでいくので、時々このブログに遊びに来ていただければ幸いです。