Watson音声認識をオフライン実行する（IBM Watson Libraries for Embed）

もうお馴染みの音声認識（Speech To Text、以下STT）である[IBM Watson Speech To Text](https://www.ibm.com/jp-ja/cloud/watson-speech-to-text)はSaaSといって、クラウドサービスに音声データをアップロードして文字起こしをするものです。一方、今回ご紹介するのはネット接続なしで使えるもので、パソコンで完結することもできます。これは[IBM Watson Libraries for Embed](https://www.ibm.com/products/watson-speech-embed-libraries)（以下Embed）という名前の新製品で、その名の通り、アプリに埋め込めば音声データや文字に変換されたデータはネットで通信されないことになるので、より秘匿性の高いところや、ネットワーク接続ができない、あるいはしたくないところでも使えますね。
なお、SaaSだと使った量に応じて課金されますが、Embedの方は使った量には関係がなく、一定額のサブスクリプションライセンスの契約[^1]という形になります。
[^1]: パートナー企業がEmbedを使って埋め込んだ製品を販売することを意図したライセンスということで、現時点では一般ユーザー向けではないようです。
# お試し
まずはお試しということで、自分で用意した環境にインストールしてみました。できるなら自分のパソコンに入れてオールインワンにしてみたかったのですが、SSDの空きが10GB以上必要だったり、メモリーにも余力がなかったので、別途Linuxの仮想サーバーを１つ立ててそこにインストールしていきます。仮想サーバーは4コア、16GBメモリーにRHELを入れました。
## サンプルアプリ
こちらの[リンク](https://github.com/ibm-build-lab/Watson-Speech/tree/main/STTApplication)にあるサンプルアプリとチュートリアルの手順通りに作業します。一見わかりにくいのですが、STT Client ApplicationとあるフロントエンドのWebアプリのセットアップと、文中の[tutorialリンク](https://github.com/ibm-build-lab/Watson-Speech/tree/main/single-container-stt)でSTTが動作するバックエンドのDockerコンテナーのセットアップの２本立てになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745658/af97a7d1-c6cf-d0e7-02da-9417ab961712.png)
STTのコンテナーのセットアップ途中に、Step1の前に環境変数`IBM_ENTITLEMENT_KEY`をexportしておく必要があるのですが、これは192文字くらいのライセンス情報です。180日有効な試用ライセンスが[こちら](https://www.ibm.com/account/reg/us-en/subscribe?formid=urx-51754)から申請できますので、予め取得しておいてください。
また、図にあるようにLinuxサーバー側は8080と1080のポートを開けておきます。
## 実行
ではChromeブラウザを使ってWebアプリにアクセスします。Upload Your Audioというタブがあるので、そちらに移ります。
![fig1a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745658/c0a8a9ee-d6bd-c52a-cc0a-5bf3847317f9.png)
ここで「ファイルを選択」で音声ファイルをアップロードするのですが、処理できるのはwav形式のみです。Windowsの場合、「サウンドレコーダー」という標準アプリがあるので、これでマイクから録音しますがフォーマットはm4a形式になるので、適当なコンバーターツールでwav形式に変換します。今回は`こちらはテストの録音です`と録音しました。
さて、結果は・・・
![fig2a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745658/714d6579-8da4-0a9c-892e-04366b0b6a51.png)
`what is our distant look on this`
いざわてぃすとんのろっこんじす　→　こちらはてすとのろくおんです

そ・・空耳ｗ　笑ってしまいましたが、デフォルトの英語として文字起こししちゃったんですね。つまり、STTコンテナーのセットアップ時に、日本語の音声認識モデルを選択しておく必要がありました。修正する箇所は以下の３つのファイルです。
* `~/Watson-Speech/single-container-stt/Dockerfile`
* `~/Watson-Speech/single-container-stt/chuck_var/env_config.json`
* `~/Watson-Speech/single-container-stt/chuck_var/sessionPools.yaml`
日本語のモデルは[こちら](https://www.ibm.com/docs/en/watson-libraries?topic=home-models-catalog)にある通り、en-usの代わりにja-jpが付くものです。STTコンテナーをビルドし直してから再起動しますと、今度はちゃんと日本語で文字起こしされました。
![fig3a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745658/c06b66b2-3ea1-4788-faa2-1535e119d5d9.png)
では次に、Streaming Audioのタブの方に行ってみましょう。
![fig4a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745658/721806db-565b-df8d-ed09-d88918a55836.png)
Start Recordingボタンを押してみても、何も変化がありません・・・本来はChromeブラウザからマイク入力が有効になるはずなのですが。
調べてみると、暗号化されていない通信のWebサイトでは、Chromeブラウザがマイクを有効にさせてくれないためでした。これを強引に有効にするには、アドレスバーで
`chrome://flags/#unsafely-treat-insecure-origin-as-secure`
と入れるとInsecure origins treated as secureという欄になるので、いまアクセスしようとしているURLを指定してEnabledにしてください。
すると、音声入力ができるようになりまして、こんな風にリアルタイムで文字起こしをしている様子が見られます。
![fig5a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745658/529eb5e7-1244-6dc8-6cf9-402163a1565a.png)
以上です。