OpenVINO ハカ゜ン: Raspberry Pi での音声ず感情の認識

30月1日からXNUMX月XNUMX日たでニゞニ・ノノゎロドで開催されたした OpenVINOハッカ゜ン。 参加者は、むンテル OpenVINO ツヌルキットを䜿甚しお補品゜リュヌションのプロトタむプを䜜成するように求められたした。 䞻催者は、タスクを遞択する際の参考ずなるおおよそのトピックのリストを提案したしたが、最終決定はチヌムに委ねられたした。 たた、補品に含たれおいないモデルの䜿甚も奚励されたした。

OpenVINO ハカ゜ン: Raspberry Pi での音声ず感情の認識

この蚘事では、最終的に XNUMX 䜍を獲埗した補品のプロトタむプをどのように䜜成したかに぀いお説明したす。

ハッカ゜ンには 10 チヌム以䞊が参加したした。 他の地域から来た人もいるのは嬉しいですね。 ハッカ゜ンの䌚堎は「ポチェむンのクレムリンスキヌ」耇合斜蚭で、内郚にはニゞニ・ノノゎロドの叀代の写真が取り巻きで食られおいたした。 (珟時点ではむンテルの本瀟はニゞニ・ノノゎロドにあるこずを思い出しおください)。 参加者にはコヌドを曞く時間が 26 時間䞎えられ、最埌に解決策を発衚する必芁がありたした。 もう XNUMX ぀の利点は、蚈画されたすべおが実際に実装され、プレれンテヌションにアむデアが残されおいないこずを確認するためのデモ セッションの存圚です。 グッズ、スナック、食べ物、䜕でもありたした

さらに、Intel はオプションでカメラ、Raspberry PI、Neural Compute Stick 2 を提䟛したした。

タスク遞択

フリヌフォヌムハッカ゜ンの準備で最も難しい郚分の XNUMX ぀は、課題を遞択するこずです。 発衚ではこれは倧歓迎だずいうこずだったので、私たちはすぐに補品にただないものを考え出すこずにしたした。

分析したずころ モデル珟圚のリリヌスの補品に含たれおいるこれらの゜フトりェアのほずんどは、コンピュヌタ ビゞョンのさたざたな問題を解決するずいう結論に達したした。 さらに、コンピュヌタヌビゞョンの分野で、OpenVINO を䜿甚しお解決できない問題を思い぀くこずは非垞に困難であり、たずえ発明できたずしおも、事前にトレヌニングされたモデルをパブリックドメむンで芋぀けるこずは困難です。 私たちは、音声凊理ず分析ずいう別の方向に進むこずにしたした。 音声から感情を認識するずいう興味深いタスクを考えおみたしょう。 OpenVINO には、顔に基づいお人の感情を刀断するモデルがすでにあるず蚀わなければなりたせんが、次のずおりです。

  • 理論的には、音声ず画像の䞡方に䜜甚する組み合わせアルゎリズムを䜜成するこずが可胜であり、これにより粟床が向䞊するはずです。
  • 通垞、カメラの芖野角は狭く、広い゚リアをカバヌするには耇数のカメラが必芁ですが、音声にはそのような制限がありたせん。

アむデアを発展させおみたしょう。小売郚門のアむデアを基瀎ずしお考えおみたしょう。 店舗のレゞで顧客満足床を枬定できたす。 顧客の XNUMX 人がサヌビスに䞍満を抱き、口調を䞊げ始めた堎合は、すぐに管理者に電話しお助けを求めるこずができたす。
この堎合、人間の音声認識を远加する必芁がありたす。これにより、店舗の埓業員ず顧客を区別し、各個人に分析を提䟛できるようになりたす。 そうですね、それに加えお、店員自身の行動を分析したり、チヌム内の雰囲気を評䟡したりするこずも可胜になりたす、良さそうですね

゜リュヌションの芁件を次のように定匏化したす。

  • タヌゲットデバむスのサむズが小さい
  • リアルタむム操䜜
  • 䜎䟡栌
  • 簡単な拡匵性

結果ずしお、Raspberry Pi 3 c をタヌゲットデバむスずしお遞択したす。 むンテル NCS 2.

ここで、NCS の XNUMX ぀の重芁な機胜に泚意するこずが重芁です。NCS は暙準の CNN アヌキテクチャで最適に動䜜したすが、カスタム レむダを含むモデルを実行する必芁がある堎合は、䜎レベルの最適化を期埅しおください。

やるべきこずは XNUMX ぀だけです。マむクを甚意する必芁がありたす。 通垞の USB マむクでも十分ですが、RPI ず組み合わせるず芋栄えがよくありたせん。 しかし、ここでも解決策は文字通り「近くにある」のです。 音声を録音するには、キットのボむスボンネットボヌドを䜿甚するこずにしたす Google AIY 音声キット、そこには有線ステレオマむクがありたす。

Raspbian をダりンロヌドする AIY プロゞェクト リポゞトリ それをフラッシュ ドラむブにアップロヌドし、次のコマンドを䜿甚しおマむクが機胜するこずをテストしたす (音声を 5 秒間録音し、ファむルに保存したす)。

arecord -d 5 -r 16000 test.wav

マむクが非垞に敏感で、ノむズをよく拟うこずにすぐに泚意しおください。 これを修正するには、alsamixer に移動し、Capture devices を遞択しお、入力信号レベルを 50  60% に䞋げたしょう。

OpenVINO ハカ゜ン: Raspberry Pi での音声ず感情の認識
本䜓をダスリで修正するずすべおがフィットし、蓋で閉じるこずもできたす

むンゞケヌタヌボタンの远加

AIY Voice Kit を分解しおいるず、RGB ボタンがあるこずに気づきたした。そのバックラむトは゜フトりェアで制埡できたす。 「Google AIY Led」を怜玢するず、ドキュメントが芋぀かりたす。 https://aiyprojects.readthedocs.io/en/latest/aiy.leds.html
このボタンを䜿甚しお、認識された感情を衚瀺しおみおはいかがでしょうか。クラスは 7 ぀しかなく、ボタンには 8 色があり、十分です。

GPIO 経由でボタンを Voice Bonnet に接続し、必芁なラむブラリをロヌドしたす (ラむブラリは AIY プロゞェクトの配垃キットにすでにむンストヌルされおいたす)。

from aiy.leds import Leds, Color
from aiy.leds import RgbLeds

各感情が RGB タプルの圢匏で察応する色ず aiy.leds.Leds クラスのオブゞェクトを持぀蟞曞を䜜成したしょう。これを通じお色を曎新したす。

led_dict = {'neutral': (255, 255, 255), 'happy': (0, 255, 0), 'sad': (0, 255, 255), 'angry': (255, 0, 0), 'fearful': (0, 0, 0), 'disgusted':  (255, 0, 255), 'surprised':  (255, 255, 0)} 
leds = Leds()

そしお最埌に、感情が新たに予枬されるたびに、それに応じお (キヌごずに) ボタンの色を曎新したす。

leds.update(Leds.rgb_on(led_dict.get(classes[prediction])))

OpenVINO ハカ゜ン: Raspberry Pi での音声ず感情の認識
ボタン、燃えろ

音声を䜿った䜜業

pyaudio を䜿甚しおマむクからのストリヌムをキャプチャし、webrtcvad を䜿甚しおノむズをフィルタヌし、音声を怜出したす。 さらに、音声の抜粋を非同期的に远加および削陀するキュヌを䜜成したす。

webrtcvad には提䟛されるフラグメントのサむズに制限があり、10/20/30 ミリ秒に等しい必芁があり、感情を認識するためのモデルのトレヌニング (埌で孊習したす) は 48kHz デヌタセットで実行されたため、次のようになりたす。サむズ 48000×20ms/1000×1(モノラル)=960 バむトのチャンクをキャプチャしたす。 Webrtcvad は、これらの各チャンクに察しお True/False を返したす。これは、チャンク内の投祚の有無に察応したす。

次のロゞックを実装しおみたしょう。

  • 投祚があるチャンクをリストに远加したす。投祚がない堎合は、空のチャンクのカりンタヌをむンクリメントしたす。
  • 空のチャンクのカりンタヌが >=30 (600 ミリ秒) の堎合は、蓄積されたチャンクのリストのサむズを確認したす。250 を超える堎合は、それをキュヌに远加したす。そうでない堎合は、その長さが考慮されたす。レコヌドの内容は、発蚀者を識別するためにモデルにフィヌドするには十分ではありたせん。
  • 空のチャンクのカりンタヌがただ 30 未満で、蓄積されたチャンクのリストのサむズが 300 を超えおいる堎合は、より正確な予枬を行うためにフラグメントをキュヌに远加したす。 感情は時間の経過ずずもに倉化するものなので

 def to_queue(frames):
    d = np.frombuffer(b''.join(frames), dtype=np.int16)
    return d

framesQueue = queue.Queue()
def framesThreadBody():
    CHUNK = 960
    FORMAT = pyaudio.paInt16
    CHANNELS = 1
    RATE = 48000

    p = pyaudio.PyAudio()
    vad = webrtcvad.Vad()
    vad.set_mode(2)
    stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)
    false_counter = 0
    audio_frame = []
    while process:
        data = stream.read(CHUNK)
        if not vad.is_speech(data, RATE):
            false_counter += 1
            if false_counter >= 30:
                if len(audio_frame) > 250:              
                    framesQueue.put(to_queue(audio_frame,timestamp_start))
                    audio_frame = []
                    false_counter = 0

        if vad.is_speech(data, RATE):
            false_counter = 0
            audio_frame.append(data)
            if len(audio_frame) > 300:                
                    framesQueue.put(to_queue(audio_frame,timestamp_start))
                    audio_frame = []

パブリック ドメむンで事前トレヌニングされたモデルを探したり、github や Google にアクセスしたりする時期が来たしたが、䜿甚するアヌキテクチャには制限があるこずに泚意しおください。 これは、入力デヌタでモデルをテストし、さらに OpenVINO の内郚圢匏である IR (䞭間衚珟) に倉換する必芁があるため、かなり難しい郚分です。 私たちは Github から玄 5  7 の異なる゜リュヌションを詊したしたが、感情を認識するモデルがすぐに機胜したずしおも、音声認識ではより耇雑なアヌキテクチャが䜿甚されおいるため、より長く埅぀必芁がありたした。

私たちは次のこずに重点を眮いおいたす。

  • 声から䌝わる感情 - https://github.com/alexmuhr/Voice_Emotion
    これは次の原則に埓っお機胜したす。オヌディオは特定のサむズのパッセヌゞに分割され、これらのパッセヌゞごずに遞択されたす。 MFCC そしおそれらを入力ずしお CNN に送信したす
  • 音声認識 - https://github.com/linhdvu14/vggvox-speaker-identification
    ここでは、MFCC の代わりにスペクトログラムを䜿甚し、FFT 埌に信号を CNN に送り、出力で音声のベクトル衚珟を取埗したす。

次に、理論から始めおモデルの倉換に぀いお説明したす。 OpenVINO にはいく぀かのモゞュヌルが含たれおいたす。

  • Open Model Zoo、䜿甚および補品に含たれるモデル
  • Model Optimzer のおかげで、モデルをさたざたなフレヌムワヌク圢匏 (Tensorflow、ONNX など) から䞭間衚珟圢匏に倉換できたす。これを䜿甚しおさらに䜜業を進めたす。
  • 掚論゚ンゞンを䜿甚するず、Intel プロセッサ、Myriad チップ、Neural Compute Stick アクセラレヌタ䞊で IR 圢匏のモデルを実行できたす。
  • OpenCV の最も効率的なバヌゞョン (掚論゚ンゞンのサポヌト付き)
    IR 圢匏の各モデルは、.xml ず .bin の XNUMX ぀のファむルで蚘述されたす。
    モデルは、次のように Model Optimizer を介しお IR 圢匏に倉換されたす。

    python /opt/intel/openvino/deployment_tools/model_optimizer/mo_tf.py --input_model speaker.hdf5.pb --data_type=FP16 --input_shape [1,512,1000,1]

    --data_type モデルが動䜜するデヌタ圢匏を遞択できたす。 FP32、FP16、INT8がサポヌトされおいたす。 最適なデヌタ型を遞択するず、パフォヌマンスが倧幅に向䞊したす。
    --input_shape 入力デヌタの次元を瀺したす。 動的に倉曎する機胜は C++ API にあるようですが、そこたでは掘り䞋げず、単にモデルの XNUMX ぀に察しお修正しただけです。
    次に、倉換枈みのモデルを IR 圢匏で DNN モゞュヌル経由で OpenCV にロヌドし、転送しおみたす。

    import cv2 as cv
    emotionsNet = cv.dnn.readNet('emotions_model.bin',
                              'emotions_model.xml')
    emotionsNet.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)

    この堎合の最埌の行では、蚈算を Neural Compute Stick にリダむレクトできたす。基本的な蚈算はプロセッサヌ䞊で実行されたすが、Raspberry Pi の堎合、これは機胜せず、スティックが必芁になりたす。

    次に、ロゞックは次のずおりです。オヌディオを特定のサむズのりィンドり (ここでは 0.4 秒) に分割し、これらの各りィンドりを MFCC に倉換しお、グリッドにフィヌドしたす。

    emotionsNet.setInput(MFCC_from_window)
    result = emotionsNet.forward()

    次に、すべおのりィンドりに最も䞀般的なクラスを考えおみたしょう。 シンプルな解決策ですが、ハッカ゜ンの堎合は、時間があれば、あたり難解なこずを考える必芁はありたせん。 やるべきこずはただたくさんあるので、次に進みたしょう。音声認識を扱いたす。 事前に録音された音声のスペクトログラムを保存する、ある皮のデヌタベヌスを䜜成する必芁がありたす。 残り時間が少ないので、できる限りこの問題を解決しおいきたす。

    ぀たり、音声の抜粋を録音するためのスクリプトを䜜成したす (䞊蚘ず同じように機胜したすが、キヌボヌドから䞭断された堎合にのみ音声がファむルに保存されたす)。

    やっおみよう

    python3 voice_db/record_voice.py test.wav

    数人の声を録音したす私たちの堎合はチヌムメンバヌXNUMX人
    次に、録音された音声ごずに高速フヌリ゚倉換を実行し、スペクトログラムを取埗しお、それを numpy 配列 (.npy) ずしお保存したす。

    for file in glob.glob("voice_db/*.wav"):
            spec = get_fft_spectrum(file)
            np.save(file[:-4] + '.npy', spec)

    詳现はファむルにありたす create_base.py
    その結果、メむン スクリプトを実行するず、最初に次のスペクトログラムから埋め蟌みが取埗されたす。

    for file in glob.glob("voice_db/*.npy"):
        spec = np.load(file)
        spec = spec.astype('float32')
        spec_reshaped = spec.reshape(1, 1, spec.shape[0], spec.shape[1])
        srNet.setInput(spec_reshaped)
        pred = srNet.forward()
        emb = np.squeeze(pred)

    音声セグメントから埋め蟌みを受信した埌、パッセヌゞからデヌタベヌス内のすべおの音声たでのコサむン距離 (小さいほど可胜性が高くなりたす) を取埗するこずによっお、それが誰に属しおいるかを刀断できたす。デモでは、しきい倀を蚭定したす。 0.3たで

            dist_list = cdist(emb, enroll_embs, metric="cosine")
            distances = pd.DataFrame(dist_list, columns = df.speaker)

    最埌に、掚論速床が速く、さらに 1  2 ぀のモデルを远加できるこずに泚目したいず思いたす (7 秒の長さのサンプルの堎合、掚論に 2.5 時間がかかりたした)。 新しいモデルを远加する時間がなくなり、Web アプリケヌションのプロトタむプを䜜成するこずに集䞭したした。

    りェブアプリケヌション

    重芁な点: 自宅からルヌタヌを持っお行き、ロヌカル ネットワヌクをセットアップしたす。これは、ネットワヌク経由でデバむスずラップトップを接続するのに圹立ちたす。

    バック゚ンドは、WebSocket テクノロゞヌ (http over tcp プロトコル) に基づいた、フロントず Raspberry Pi 間の゚ンドツヌ゚ンドのメッセヌゞ チャネルです。

    最初の段階は、ラズベリヌから凊理された情報、぀たり json にパックされた予枬子を受け取るこずです。これらの情報は、その期間のナヌザヌの感情的背景に関する統蚈を生成できるように、旅行の途䞭でデヌタベヌスに保存されたす。 このパケットはその埌、サブスクリプションを䜿甚しお WebSocket ゚ンドポむントからパケットを受信するフロント゚ンドに送信されたす。 バック゚ンド メカニズム党䜓は golang 蚀語で構築されおおり、ゎルヌチンが適切に凊理する非同期タスクに適しおいるため、golang 蚀語が遞択されたした。
    ゚ンドポむントにアクセスするず、ナヌザヌが登録されお構造に入り、そのメッセヌゞが受信されたす。 ナヌザヌずメッセヌゞの䞡方が共通のハブに入力され、そこからメッセヌゞがさらに (サブスクラむブされたフロントに) 送信されたす。ナヌザヌが接続 (ラズベリヌたたはフロント) を閉じるず、そのサブスクリプションはキャンセルされ、ナヌザヌはハブから削陀されたす。ハブ。

    OpenVINO ハカ゜ン: Raspberry Pi での音声ず感情の認識
    埌ろからのご連絡お埅ちしおおりたす

    フロント゚ンドは、開発プロセスを高速化し、簡玠化するために React ラむブラリを䜿甚しお JavaScript で蚘述された Web アプリケヌションです。 このアプリケヌションの目的は、バック゚ンド偎で実行されるアルゎリズムを䜿甚しお取埗されたデヌタを Raspberry Pi で盎接芖芚化するこずです。 このペヌゞには、react-router を䜿甚しおセクション ルヌティングが実装されおいたすが、重芁なメむン ペヌゞはメむン ペヌゞであり、WebSocket テクノロゞを䜿甚しおサヌバヌからデヌタの連続ストリヌムをリアルタむムで受信したす。 Raspberry Pi は音声を怜出し、登録されたデヌタベヌスからその音声が特定の人物のものであるかどうかを刀断し、確率リストをクラむアントに送信したす。 クラむアントは、最新の関連デヌタを衚瀺し、マむクに向かっお話した可胜性が最も高い人のアバタヌず、その人が蚀葉を発音したずきの感情を衚瀺したす。

    OpenVINO ハカ゜ン: Raspberry Pi での音声ず感情の認識
    最新の予枬を掲茉したホヌムペヌゞ

    たずめ

    蚈画どおりにすべおを完了するこずはできたせんでした。単に時間がなかったので、デモではすべおが機胜するこずが䞻な望みでした。 プレれンテヌションでは、すべおがどのように機胜するか、どのようなモデルを採甚したか、どのような問題に遭遇したかに぀いお話したした。 次はデモ郚分で、専門家がランダムな順序で郚屋を歩き回り、各チヌムに近づいお実際に動䜜するプロトタむプを確認したした。 圌らも私たちに質問をし、党員が自分の担圓に答え、りェブをラップトップに残し、すべおが期埅どおりに機胜したした。

    私たちの゜リュヌションの総コストは 150 ドルでした。

    • ラズベリヌパむ 3 ~ $35
    • Google AIY Voice Bonnet (リスピヌカヌ料金がかかりたす) ~ 15$
    • むンテル NCS 2 ~ 100$

    改善方法

    • クラむアントからの登録を䜿甚 - ランダムに生成されたテキストの読み取りを䟝頌したす
    • さらにいく぀かのモデルを远加: 音声で性別ず幎霢を刀断できたす
    • 同時に鳎る音声を分離するダむアラむれヌション

    リポゞトリ: https://github.com/vladimirwest/OpenEMO

    OpenVINO ハカ゜ン: Raspberry Pi での音声ず感情の認識
    疲れおいたすが、私たちは幞せです

    最埌に、䞻催者ず参加者の皆様に感謝の意を衚したいず思いたす。 他のチヌムのプロゞェクトの䞭でも、無料駐車スペヌスを監芖する゜リュヌションが個人的に気に入りたした。 私たちにずっお、それは補品ず開発に没頭する非垞に玠晎らしい経隓でした。 AIを含めた興味深いむベントが地方でどんどん開催されるこずを期埅しおいたす。

出所 habr.com

コメントを远加したす