RPAと音声認識AI(SpeechToText)を利用して、ハンズフリーを実現してみる

お疲れ様です。渡部です。GWはみなさんいかがでしたか。
コロナによる企業の減収を目の当たりにすると、「2027年の壁」とか言う前に【今】にでも企業が外的要因に左右されない強い経営基盤・IT基盤を作るべきだと思い、居ても立っても居られなくなります。もっと各企業と課題に向き合い、課題や未来を考え、アイデアをトライしていきたいと思います。

そういう思いもあり、今日は2019年9月19日に開催されたBlue Prism World Tokyoでデモ展示した「Blue Prism×音声認識AI」の技術的内容について説明します。

Blue Prism World Tokyo
https://www.blueprism.com/japan/events/blue-prism-world-tokyo/

また、6/23にはオンラインでのBlue Prism Worldがあるようなので、ぜひ参加したいと思います。
Blue Prism World Virtual 2020 – Building a Digital Workforce for Every Enterprise
https://www.blueprism.com/resources/blog/blue-prism-world-virtual-2020-building-a-digital-workforce-for-every-enterprise/

Blue Prism×音声認識AIとは

RPAとAIの組み合わせを常に意識しながら仕事しているのですが、やはりRPA×AIというとAI-OCRばかりで、正直あんまり面白くない。
で音声認識AIを組み合わせた例ができないかということで作ったのがこのデモです。

デモ概要

想定シチュエーション:自動車整備工場での車両点検業務

<業務概要>

エンジンやミッション、電気系統、ステアリング(操縦機器)など、あらゆる装置を点検し作業シートに整備が必要な箇所を記入する。

車下や工具部品を使用する点検作業は両手が塞がれるため、作業効率を上げたい

摩耗や破損部分があれば、交換・修理を行い車の安全性と快適性を保つ。

点検箇所の漏れは許されない

<ポイント>

  • 音声認識AIが読み上げる点検箇所を作業者は点検し、交換・修理の可否を判定(発音)
  • Blue Prismが判定内容を作業シート(Excelデータ)に入力

デモ動画

映っているのは私本人です。なんとなく恥ずかしい(*_*;
撮影前にボンネット中をきれいに掃除するのが大変でした。
ボンネットのエンジン部分横に私のスマフォがあるのが分かりますでしょうか。

技術的なところ

システム全体図は以下のとおりです。

音声認識AIと音声発声

人(点検担当者)の声はGoogleの「Speech-to-Text API」を使って認識しています。

Cloud Speech-to-Text
https://cloud.google.com/speech-to-text

ただハンズフリーの実現のためにはAPIの「ストリーミング認識」という方法を使う必要があります。
これは文節を自動的に認識する必要があるためで、ストリーミング認識の場合は発声内容から文節を自答的に区切って、文節単位で確定結果を提示してくれるためです。


ストリーミング認識(gRPC のみ)では gRPC 双方向ストリームで提供された音声データの認識を行います。ストリーミング リクエストは、マイクからのライブ音声のキャプチャなどのリアルタイムの認識を目的として設計されています。ストリーミング認識では、音声をキャプチャしながら暫定的な結果を生成して、結果を表示できます。たとえば、ユーザーがまだ話している間に結果を表示できます。


BluePrismというかどのRPAでもストリーミング認識で使うgRPC 双方向ストリームを行うのは難しいので、今回はAndroidアプリから直接APIに接続するようにしています。
(というか当初はPCのマイクで直接BluePrismから音声認識できる(API接続させる)ことを目論んだのですが、gRPCをコードステージだけで実現する難しさ+私の技量不足により断念しました。)

また音声発声はAndroidの機能にあるTextToSpeechをそのまま利用しています。
https://developer.android.com/reference/android/speech/tts/TextToSpeech

Queueサーバ

Queue(キュー)サーバは以下の2つの役割を実現しています。

  • Androidアプリで「Speech-to-Text API」で認識した文節のBluePrismに渡すために保管
  • BluePrismがExcelから読み取った指示内容をAndroidアプリに渡すための一時保管

なぜQueueサーバーが必要かと言うと、BluePrismはTCP/IPで外部から直接データを受け取れる仕組みが無いため、中継機器が必要なためです。

Androidアプリ

1から作るのは時間が無かったので、こちらのアプリをベースに作っていますwww
https://github.com/GoogleCloudPlatform/android-docs-samples

カスタマイズ内容としては以下のとおりです。
・背景画像の設定
・Speech-to-Textの追加
・Queueサーバとの接続機能(OkHttpClient)
・デモを実現するためのロジックの追加

ロジック部分のコードの一部を参考までに張り付けておきます。

public void onSpeechRecognized(final String text, final boolean isFinal) {
    if (isFinal) {
        mVoiceRecorder.dismiss();
    }
    if (mText != null && !TextUtils.isEmpty(text)) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (isFinal) {
                    mText.setText(null);
                    mAdapter.addResult(text);
                    mRecyclerView.smoothScrollToPosition(0);

                    stopVoiceRecorder();
                    mStatus.setText("送信中...");

                    new MyAsyncTask() {
                        @Override
                        protected String doInBackground(Void... params) {
                            String res = "";
                            try {

                                res = httprun("https://rpa.bigtreetc.com/BluePrismBridge/setvoice.php?text=" + text);
                                Log.e("RESPONSE", res);
                                int speechStatus = textToSpeech.speak(res, TextToSpeech.QUEUE_FLUSH, null, "messageID");
                                setTtsListener();
                                if (speechStatus == TextToSpeech.ERROR) {
                                    Log.e("TTS", "Error in converting Text to Speech!");
                                }

                            } catch(IOException e) {
                                e.printStackTrace();
                            }
                            return res;
                        }

                        @Override
                        protected void onPostExecute(String result) {
                            if (result != null) {
                                if (result.length() > 5) {
                                    mStatus.setText(result);
                                }
                            }
                        }
                    }.execute();

                } else {
                    mText.setText(text);
                }
            }
        });
    }
}

まとめ

開発に関しては、まとめると実は大したことはしていないのですが、一番大変だったのは10年ぶりぐらいのAndroidアプリの開発だっため、新しいAndroidStudioの使い方に慣れたり、Javaを思い出したりするのが大変でした(正直忘れてました。その後インフラエンジニア中心だったし・・・)。
ただ、ちゃんと開発期間があれば、本業務で使えるだけのレベルにできると手ごたえを感じられたのは良かったです。
RPAとAI、そしていろんな関連技術を含めて、もっと面白いことができるといいなー。それがDXに繋がればいいなーと。

(おまけ)手の使えない障害者向けのPC操作

実はAmazonのアレクサとの接続も検証してて、残骸動画があったので張り付けておきます。
手の使えない障害者向けにPC操作を音声認識AIとRPAで代行することをトライしていたのですが、もっと業務寄りのデモがいいかなと思い、途中でやめてしまったものです。

もっと知りたい方はこちら

ページトップ