無用な争い回避システム
チームIKARI
大越 豊
松田 和雄
濱田 圭
浜口忠彦
AITCシニア技術勉強会
無用な争いとは
• 相手の怒りに巻き込まれて、自分も怒りが芽生えるのはよくあ
ること。
• 怒りが怒りを呼んでさらにヒートアップする。
• 事前に相手の怒りを察知すれば、何か対応できるのではない
か?
• 事前に対策をして無用な争いを回避したい!!
システム概要
Wi-Fi
Internet
BLE
Raspberry Pi Zero W
Raspberry Pi 3
ESP32-WROOM-32
音声認識
音声解析
解析出力
音声入力部分
音声入力部分
Wi-Fi
Raspberry Pi Zero W
Raspberry Pi 3
音声認識
• USBマイクの入力を
Raspberry Piに取り込み。
• 取り込んだ音声をRaspberry
PiでWAVファイル化。
• 保存したWAVファイルを解析
用Raspberry PiにHTTP Post。
• 簡単そう?音声解析
音声だけを取り出すにはどうすれば?
?
音のどこを切り取ればよいか?
ノイズを解析してしまう?
ソフトウェア構成
Mic
Julius Sox Curl
Python
Script
音声データ
制御
HTTP Post
Juliusを使う(1)
• Julius は,音声認識システムの開発・研究のためのオープン
ソースの高性能な汎用大語彙連続音声認識エンジンです.
• http://julius.osdn.jp/index.php
• 音声認識して言語の認識ができたら、その音声を入力すればい
い。
Juliusを使う(2)
• Juliusはモジュールモードで動
作させTCP/IPで操作する。
• Juliusの-record dirオプション
で音声が出力される。
• Pythonスクリプトで認識処理
の終了を検知して、音声取り
込み。
• </RECOGOUT>のタイミング
で保存された音声を取り込む
→SoXで処理。
<STARTPROC/>
<INPUT STATUS="LISTEN" TIME="994675053"/>
<INPUT STATUS="STARTREC" TIME="994675055"/>
<STARTRECOG/>
<INPUT STATUS="ENDREC" TIME="994675059"/>
<GMM RESULT="adult" CMSCORE="1.000000"/>
<ENDRECOG/>
<INPUTPARAM FRAMES="382" MSEC="3820"/>
<RECOGOUT>
<SHYPO RANK="1" SCORE="-6888.637695" GRAM="0">
<WHYPO WORD="silB" CLASSID="39" PHONE="silB" CM="1.000"/>
<WHYPO WORD="上着" CLASSID="0" PHONE="u w a g i" CM="1.000"/>
<WHYPO WORD="を" CLASSID="35" PHONE="o" CM="1.000"/>
<WHYPO WORD="白" CLASSID="2" PHONE="sh i r o" CM="0.988"/>
<WHYPO WORD="に" CLASSID="37" PHONE="n i" CM="1.000"/>
<WHYPO WORD="して" CLASSID="27" PHONE="sh i t e" CM="1.000"/>
<WHYPO WORD="下さい" CLASSID="28" PHONE="k u d a s a i" CM="1.000"/>
<WHYPO WORD="silE" CLASSID="40" PHONE="silE" CM="1.000"/>
</SHYPO>
</RECOGOUT>
.
SoXを使う
• SoX is a cross-platform (Windows, Linux, MacOS X, etc.)
command line utility that can convert various formats of
computer audio files in to other formats.
• http://sox.sourceforge.net/
感情判定部分
感情判定部分
• What is Empath?
https://webempath.net/lp-jpn/
音声等の物理的な特徴量から気分の状態を独自のアルゴリズムで判定するプログラム
Webページでお試し音声解析ができるだけではなく、APIも提供されています。なんと!300回までは無料なんです!!
• Why use Empath?
「感情を何で判定するか?」は色々なアイディアが出ました。結論から言うと、音声で判断する、という事で「Empath」のAPI
を使用することにしました。
• 顔
怒っている人は顔がこわばっています。顔で判定するのはどうだろう?というアイディアはすぐに出ました。
しかし、「怒っている(かもしれない)人の前に行きたくない。眼の前で撮影なんてしたら怒りが爆発する可能性があ
る。」という難題があり、保留。(番外編にMicrosoftのFace APIのお話があります。)
• 振動
怒っている人は動きが荒い。振動で判定するのはどうだろう?というアイディアも出ました。
しかし、これも「人が特定できない…人だけではなく、洗濯機や人ではない物の振動を除去するのが難しい。」という難
題があり、保留。
• 音声
ここで音声の登場です。怒っている人は口調が荒い。
これも人を特定できない、という弱点はあったのですが、「怒り爆発寸前の人がいると周りは黙るだろう。」と楽観的に
考えて採用しました。
感情判定部分
• How to use Empath API
• 言語:Python(2.7)
感情の判定にはAI様のお力を借りることが多く、AI関連と親和性の高いPythonでEmpath APIを使用する事にしました。
(私が一番得意なのはC言語なんですが…)
Pythonの主流はバージョン3系に以降してきていますが、サンプルを有効活用したいため、バージョン2.7を採用しまし
た。
• Webサーバー
マイクがついたRaspberry Pi Zeroから音声ファイルをhttpでPOSTしてもらいます。そのため、Webサーバーを立ち上げ
る必要がありました。WebサーバーはPythonを使うという事でDjangoを使ってみました。
• 感情判定
Empathからは「calm/angry/joy/sorrow/energy」の5要素が数値(0〜50)で返ってきます。energyは感情というよりも元
気かどうかなため、 「calm/angry/joy/sorrow」の4要素中で一番数値が高いものを現在の感情と判定します。
感情判定部分
• How to show emotions
判定した感情をLED側(ESP32)にBLEで渡します。 BLEへの書き込みはgatttoolコマンドを使用しました。(手抜きですみま
せん。)
Empathからの返却値は0〜50、それに対してLED点灯に使う値は0〜0xFFFFFF(RGBを各色1バイトずつ)。
そのため、以下の計算結果をLED側に送信します。
• 平常と判定(calmの値が最も高い) → 送信するデータ:0xFFFFFF
• 平常以外
R:(angryの数値 + energyの数値/2)*(255/50)
G:(joyの数値 + energyの数値/2)*(255/50)
B:(sorrowの数値 + energyの数値/2)*(255/50)
→送信するデータ:R<<16 + G<<8 + B
※energyの数値を計算式に入れたのは、energyの数値が高いという事はその感情の度合いが強い、と考えたため。
• ソースコード
たいしたものではないですが、「https://github.com/matsudakz/ikari」に置いてあります。
• 苦労した点
感情判定部分だけで単体テストをするのに苦労しました。Empath APIで使用できる音声ファイルは要求が高く(PCM Wave
形式で16bit/フォーマットがPCM_FLOAT or PCM_SIGNED or PCM_UNSIGNED/録音時間が5.0秒未満であること/サンプリ
ング周波数11025Hz/チャネル数が1)、何度も失敗しました。
サンプリングの周波数でエラー、チャネル数でエラー、録音時間でエラー、録音内容でエラー…何度も変なファイルを送りつ
け、Empathさん本当にすみません。(エラーはAPIの使用回数にカウントされないため、本当に良心的です。)
LED表示部分
感情(怒り度合)表示
容易に怒りの度合いが分かる LEDの点灯で表現
LEDをどう取り付けるか 頭の角のような感じ
で
ではこれで
➢スイッチでオン/オフ
➢単色
Empathの判定結果をRaspberry PiからESP32へBLE送信
判定結果に合わせてESP32でLED点灯制御
電池
スイッ
チ
LED 左 LED 右
LED 右
電池
LED 左
トランジス
タ
GPIO
(PWM)
PWMで輝度をコントロール
でも単色でいまいち
じゃぁ、フルカラーに変更しよう(発表まで2か月しかないが)
マイコン内蔵RGB
OST4ML5B32A
回路は簡単になったけど
制御プログラムが難しくなっ
てしまいました。
スミマセン。
Raspberry PiのGPIOで制
御
GPIO制御でRGB調
整
表情判定部分
怒メータ:99%
Microsoft FaceAPI
顔画像をポスト 表情をレスポンス
番外編 画像解析によるアプローチ 怒メータ:100%
怒メータ:1%
Python+OpenCV
USBcamera
Pi camera
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
response = requests.post(face_api_url,
params=params,
data=data,
headers=headers)
様々な表情での怒メータ値(フリー画像を使って)

2018年12月15日 AITCシニア成果発表会 無用な争い回避システム

  • 1.
  • 2.
    無用な争いとは • 相手の怒りに巻き込まれて、自分も怒りが芽生えるのはよくあ ること。 • 怒りが怒りを呼んでさらにヒートアップする。 •事前に相手の怒りを察知すれば、何か対応できるのではない か? • 事前に対策をして無用な争いを回避したい!!
  • 3.
    システム概要 Wi-Fi Internet BLE Raspberry Pi ZeroW Raspberry Pi 3 ESP32-WROOM-32 音声認識 音声解析 解析出力
  • 4.
  • 5.
    音声入力部分 Wi-Fi Raspberry Pi ZeroW Raspberry Pi 3 音声認識 • USBマイクの入力を Raspberry Piに取り込み。 • 取り込んだ音声をRaspberry PiでWAVファイル化。 • 保存したWAVファイルを解析 用Raspberry PiにHTTP Post。 • 簡単そう?音声解析
  • 6.
  • 7.
  • 8.
    Juliusを使う(1) • Julius は,音声認識システムの開発・研究のためのオープン ソースの高性能な汎用大語彙連続音声認識エンジンです. •http://julius.osdn.jp/index.php • 音声認識して言語の認識ができたら、その音声を入力すればい い。
  • 9.
    Juliusを使う(2) • Juliusはモジュールモードで動 作させTCP/IPで操作する。 • Juliusの-recorddirオプション で音声が出力される。 • Pythonスクリプトで認識処理 の終了を検知して、音声取り 込み。 • </RECOGOUT>のタイミング で保存された音声を取り込む →SoXで処理。 <STARTPROC/> <INPUT STATUS="LISTEN" TIME="994675053"/> <INPUT STATUS="STARTREC" TIME="994675055"/> <STARTRECOG/> <INPUT STATUS="ENDREC" TIME="994675059"/> <GMM RESULT="adult" CMSCORE="1.000000"/> <ENDRECOG/> <INPUTPARAM FRAMES="382" MSEC="3820"/> <RECOGOUT> <SHYPO RANK="1" SCORE="-6888.637695" GRAM="0"> <WHYPO WORD="silB" CLASSID="39" PHONE="silB" CM="1.000"/> <WHYPO WORD="上着" CLASSID="0" PHONE="u w a g i" CM="1.000"/> <WHYPO WORD="を" CLASSID="35" PHONE="o" CM="1.000"/> <WHYPO WORD="白" CLASSID="2" PHONE="sh i r o" CM="0.988"/> <WHYPO WORD="に" CLASSID="37" PHONE="n i" CM="1.000"/> <WHYPO WORD="して" CLASSID="27" PHONE="sh i t e" CM="1.000"/> <WHYPO WORD="下さい" CLASSID="28" PHONE="k u d a s a i" CM="1.000"/> <WHYPO WORD="silE" CLASSID="40" PHONE="silE" CM="1.000"/> </SHYPO> </RECOGOUT> .
  • 10.
    SoXを使う • SoX isa cross-platform (Windows, Linux, MacOS X, etc.) command line utility that can convert various formats of computer audio files in to other formats. • http://sox.sourceforge.net/
  • 11.
  • 12.
    感情判定部分 • What isEmpath? https://webempath.net/lp-jpn/ 音声等の物理的な特徴量から気分の状態を独自のアルゴリズムで判定するプログラム Webページでお試し音声解析ができるだけではなく、APIも提供されています。なんと!300回までは無料なんです!! • Why use Empath? 「感情を何で判定するか?」は色々なアイディアが出ました。結論から言うと、音声で判断する、という事で「Empath」のAPI を使用することにしました。 • 顔 怒っている人は顔がこわばっています。顔で判定するのはどうだろう?というアイディアはすぐに出ました。 しかし、「怒っている(かもしれない)人の前に行きたくない。眼の前で撮影なんてしたら怒りが爆発する可能性があ る。」という難題があり、保留。(番外編にMicrosoftのFace APIのお話があります。) • 振動 怒っている人は動きが荒い。振動で判定するのはどうだろう?というアイディアも出ました。 しかし、これも「人が特定できない…人だけではなく、洗濯機や人ではない物の振動を除去するのが難しい。」という難 題があり、保留。 • 音声 ここで音声の登場です。怒っている人は口調が荒い。 これも人を特定できない、という弱点はあったのですが、「怒り爆発寸前の人がいると周りは黙るだろう。」と楽観的に 考えて採用しました。
  • 13.
    感情判定部分 • How touse Empath API • 言語:Python(2.7) 感情の判定にはAI様のお力を借りることが多く、AI関連と親和性の高いPythonでEmpath APIを使用する事にしました。 (私が一番得意なのはC言語なんですが…) Pythonの主流はバージョン3系に以降してきていますが、サンプルを有効活用したいため、バージョン2.7を採用しまし た。 • Webサーバー マイクがついたRaspberry Pi Zeroから音声ファイルをhttpでPOSTしてもらいます。そのため、Webサーバーを立ち上げ る必要がありました。WebサーバーはPythonを使うという事でDjangoを使ってみました。 • 感情判定 Empathからは「calm/angry/joy/sorrow/energy」の5要素が数値(0〜50)で返ってきます。energyは感情というよりも元 気かどうかなため、 「calm/angry/joy/sorrow」の4要素中で一番数値が高いものを現在の感情と判定します。
  • 14.
    感情判定部分 • How toshow emotions 判定した感情をLED側(ESP32)にBLEで渡します。 BLEへの書き込みはgatttoolコマンドを使用しました。(手抜きですみま せん。) Empathからの返却値は0〜50、それに対してLED点灯に使う値は0〜0xFFFFFF(RGBを各色1バイトずつ)。 そのため、以下の計算結果をLED側に送信します。 • 平常と判定(calmの値が最も高い) → 送信するデータ:0xFFFFFF • 平常以外 R:(angryの数値 + energyの数値/2)*(255/50) G:(joyの数値 + energyの数値/2)*(255/50) B:(sorrowの数値 + energyの数値/2)*(255/50) →送信するデータ:R<<16 + G<<8 + B ※energyの数値を計算式に入れたのは、energyの数値が高いという事はその感情の度合いが強い、と考えたため。 • ソースコード たいしたものではないですが、「https://github.com/matsudakz/ikari」に置いてあります。 • 苦労した点 感情判定部分だけで単体テストをするのに苦労しました。Empath APIで使用できる音声ファイルは要求が高く(PCM Wave 形式で16bit/フォーマットがPCM_FLOAT or PCM_SIGNED or PCM_UNSIGNED/録音時間が5.0秒未満であること/サンプリ ング周波数11025Hz/チャネル数が1)、何度も失敗しました。 サンプリングの周波数でエラー、チャネル数でエラー、録音時間でエラー、録音内容でエラー…何度も変なファイルを送りつ け、Empathさん本当にすみません。(エラーはAPIの使用回数にカウントされないため、本当に良心的です。)
  • 15.
  • 16.
  • 17.
    電池 スイッ チ LED 左 LED右 LED 右 電池 LED 左 トランジス タ GPIO (PWM) PWMで輝度をコントロール でも単色でいまいち じゃぁ、フルカラーに変更しよう(発表まで2か月しかないが) マイコン内蔵RGB OST4ML5B32A 回路は簡単になったけど 制御プログラムが難しくなっ てしまいました。 スミマセン。 Raspberry PiのGPIOで制 御 GPIO制御でRGB調 整
  • 18.
  • 19.
    怒メータ:99% Microsoft FaceAPI 顔画像をポスト 表情をレスポンス 番外編画像解析によるアプローチ 怒メータ:100% 怒メータ:1% Python+OpenCV USBcamera Pi camera cap = cv2.VideoCapture(0) ret, frame = cap.read() response = requests.post(face_api_url, params=params, data=data, headers=headers)
  • 20.