M5Atom EchoでSpeech to Textやってみた

この記事は[2020.12.05【2020年最後！】IoT縛りの勉強会! IoTLT vol.70](https://iotlt.connpass.com/event/196360/?fbclid=IwAR3c9lUy-HUJ4MsvMn9FQFfiiSOp3hwGkfkZ7Cpx12KYH4t-ldRe-6k1bbE)で登壇した内容の補足的な話です。
スライドは[こちら](https://speakerdeck.com/miura55/2020-dot-12-dot-05-ledbatuzide00suruhua)

ここ最近M5シリーズいろんなものが次から次へとリリースされてもう情報が追いつきません。
その中で僕が密かに興味があるものが「M5Atom Echo」。
いろいろ調べてみるとスマートスピーカーを作れるマイコンらしいです。
なのにググっても出てくるのはスピーカーのことばかり(どんだけスピーカーこだわるんだよ！)。
やっぱり長時間使えないスピーカーなんかの事言うより音声認識をやりたいわけです。
というわけで今回はM5Atom Echoを使ってSpeech to Text(以下、STT)をやる方法を紹介します。

# トークンの取得
M5Atom Echoには専用のSTTライブラリが提供されています。
そのライブラリの裏側ではBaiduのAPIを使っているそうです。
じゃあBaiduのサイトで取得するのかと言うとそういうわけではないようです。

以下のサイトにM5Burnerのダウンロードリンクがあるので、お使いのOSに合わせてダウンロードとインストールします。

https://docs.m5stack.com/#/en/quick_start/atom/atom_echo_quick_start?id=firmwareamptoken

ダウンロードを終えたら`ATOM`オプションを選択して`EchoSTT`をダウンロードします。
その後、`Get Token`をクリックしてアクセストークンを入手します。

![m5burner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/729b4393-be6a-6fb5-6b25-e8d998e56634.png)

# Arduinoで動かす
今回はArduinoを使ってSTTをやってみます。

## ボードマネジャー
まず、ボードマネジャーはM5Stick Cと同じチップをつかっているので、M5Stick Cのボードを選択します。

##ライブラリのインストール
次にM5AtomライブラリとFast LEDライブラリをインストールします。
「スケッチ」→「ライブラリをインクルード」→「ライブラリの管理」を開き、それぞれのライブラリをインストールします。

## サンプルコード

以下のリンクのサンプルコードをすべて任意のディレクトリに保存します。
`const char *WifiSSID = "SSID";`と`const char *WifiPWD = "PASSWORD";`にはお使いのWifiのアクセス情報に書き換えます。
`rest.settoken("YOUR-TOKEN");`には先程M5Burner取得したトークンに書き換えます。

https://github.com/m5stack/M5-ProductExampleCodes/tree/master/Core/Atom/AtomEcho/Arduino/EchoSTT

## 動作確認
官話(中国の公用語)を認識するためのモデルなので、英語の認識はHelloなどの簡単な英単語は認識しますがそれ以外は官話で認識します。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">運いいと英語も認識出来るな。<br>これは何か出来そうだ<a href="https://twitter.com/hashtag/m5atomecho?src=hash&amp;ref_src=twsrc%5Etfw">#m5atomecho</a><a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://t.co/fY7J0dd8rx">pic.twitter.com/fY7J0dd8rx</a></p>&mdash; K.Miura (@k_miura_io) <a href="https://twitter.com/k_miura_io/status/1325419171555942403?ref_src=twsrc%5Etfw">November 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 他の言語に切り替える
先程の官話だと、分かる人なら問題ないですが、日本人だとわからない人が多いと思います。
せめて英語を認識できるようにできないかソースを調べたところ、どうやらヘッダーファイルの変数を指定すれば言語モデルを変更できるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/a59e07c1-c26d-c450-a090-dcc549654c4f.png)
*[BaiduRest.h](https://github.com/m5stack/M5-ProductExampleCodes/blob/master/Core/Atom/AtomEcho/Arduino/EchoSTT/BaiduRest.h)より*

ヘッダーファイルを確認すると、官話、広東語、英語、広東語と英語の両方というモデルを指定できるみたいです。
僕は英語を認識できればそれでいいので、`DEV_PID_ENGLISH`を設定します。
ではこの設定を変更するにはどうすればいいのかというとEchoSTT.inoの136行目の`rest.Pcm2String(microphonedata0, data_offset, DEV_PID_MANDARIN, &SpakeStr) != -1`にある`DEV_PID_MANDARIN`を`DEV_PID_ENGLISH`に変更するだけです。

## 再度動作確認
先程と違って英語をきれいに認識するようになりました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">よし、喋ったことをMatrix LEDで流れるようになった！<br>Arduino久々に触ったけど使い方忘れてるし原因不明のエラーにぶつかって辛みしかない(こんなことしてないでさっさとスライド作らねば<a href="https://twitter.com/hashtag/M5stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5stack</a> <a href="https://twitter.com/hashtag/M5AtomEcho?src=hash&amp;ref_src=twsrc%5Etfw">#M5AtomEcho</a> <a href="https://t.co/k2qGfwyZjM">pic.twitter.com/k2qGfwyZjM</a></p>&mdash; K.Miura (@k_miura_io) <a href="https://twitter.com/k_miura_io/status/1325844714889703424?ref_src=twsrc%5Etfw">November 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# まとめ
今回はM5Atom Echoをつかって音声認識をやってみました。
最初は「英語うまく認識できないけど、動いているからヨシッ」ってなりましたけど、ソース調べると英語を変更にできることがすんなり分かって拍子抜けしましたｗ。
ただ、これは偶然気づいただけでちゃんとドキュメントに書くべきじゃね？とは思いました。(気が向いたらPRだしたい)