Raspberry piとGoogle Cloudで双方向翻訳機を作る

#始めに
Google Cloud Platform(GCP)について興味を持って、お試しでいくつかpythonスクリプトを作成したのは、実は3年ほど前のことでした。一連のAPIを試すところで、ラズパイ+GCPで双方向翻訳機ができるのではないかと考え、ちょろちょろと「konnyaku」を作成しました。当時はQiita投稿もしていなかったので、作ってそれで終わりでしたが、今になると、同一コンセプトの翻訳機が市場に出回るようになりました。そこで、もう一度動かしてみようとスクリプトを掘り出したのですが、いろいろと手順が変わっているため、もう一度全部見直して翻訳機「konnyaku2」を作成しなおしました。Gitにソース（といっても短いですが）を出したので、立ち上げ方をまとめようと思います。

動画:  https://twitter.com/yoshiki9636/status/1414581818041401358?s=20

#参考記事

[GCPプロジェクトの作成](https://cloud.google.com/resource-manager/docs/creating-managing-projects?hl=ja)

[GCPサービスアカウントの作成と管理](https://cloud.google.com/iam/docs/creating-managing-service-accounts?hl=ja)

[google translateの料金](https://cloud.google.com/translate/pricing?hl=ja)

[google speech-to-textの料金](https://cloud.google.com/speech-to-text/pricing)

#注意事項
GCPのGoogle translateとGoogle Speech-to-textの２つのサービスを使用しております。双方とも月当たりの無料枠を持っており、少し実験するには十分な時間ではあります。しかし、大量に使うと双方とも料金が発生しますので、ご注意ください。無料枠は上記のリンクで確認してください。

#インストラクション

###前提条件
- Raspberry Pi 3 or 4 (2でも行けるかもしれませんが試していません）

- プッシュボタン２個　GPIOにつなげ、スイッチとしてピンをGNDに短絡してくれるもの。筆者は下の写真のようなボタンを自作しました。

- USBマイク　Amazonで1000円弱で購入できます。

- スピーカー　できればハンディなものが良いです。500円ほどで購入

- GCPアカウントの作成　googleアカウントがあれば、すぐに作成可能です。ただし、クレジットカード情報が必要だったと思います。

- Raspberry Pi OSインストール済みのSDカード。容量は問いません。ネットワークに接続し、SSHで接続できるようにしてください。
 
###Google TranslateとGoogle Speechの有効化、クレデンシャルの作成

####1.プロジェクトの作成
ダッシュボード→プロジェクトの選択→新しいプロジェクトの作成　を選択
プロジェクト名は好きな名前が可能です。このプロジェクトで使用する名前は「honyaku-ai」としており、スクリプト等はこれを設定しておりますので、ご自分での変更をお願いいたします。
場所は、「組織なし」を指定仕手いただければ大丈夫です。

プロジェクトを選択してください。

####2.サービスアカウントの作成
次に、サービスアカウントを作成します。
右上の三本線、ナビゲーションメニューから、
ナビゲーションメニュー→IAMと管理→サービスアカウント

画面上部のサービスアカウントを作成、をクリック
次の情報を設定します。
- サービスアカウント名（ここでは'honyaku-ai')
- サービスID（自動で追加）
'作成して続行'で、ロールの選択→何も選択しない
'続行'で、ユーザアクセス許可→何も選択しない
'完了'で作成されます。

#####3. 鍵JSONの作成
作成したサービスアカウントが見えます。
出来上がったサービスアカウント名をクリックします。
サービスアカウントの詳細が見えるので、上部のタブから'キー'を選択します。

'鍵を追加'→'鍵を作成' JSONを選択
JSONファイルがダウンロードされます。
このJSONファイルがクレデンシャルになるので、Raspberry Piに転送してください。
このJSONファイルで、ほかの人が自由にアクセスできてしまうので、gitにアップしてしまうなど、絶対外部に漏らさないでください。

####4. 使用APIの有効化
右上の三本線、ナビゲーションメニューから、
ナビゲーションメニュー→APIとサービス→ライブラリ
以下を検索して有効化

- Cloud Speech-to-Text API
- Cloud Translation API

以上で、Google Cloud側の設定が終わりです。お疲れ様です。

###本体の組み立て
Raspberry Piを中心にスピーカ、マイク、ボタン２個を接続します。スピーカはaudio out端子、USBマイクはUSBポートに接続してください。ボタン２個はGPIO23とGPIO24を使います。ボタン１を14ピン(GND)と16ピン(GPIO23)、ボタン２を18ピン(GPIO24)と20ピン(GND)に接続すれば完了です。SDカードを忘れずに。

###インストール
Raspberry Pi にSSHで接続してください。ここではユーザpiを使用しております。もし他のアカウントを使用するのであれば、スクリプト等のパスをご自分で変更して使用してください。

####1. gitからスクリプトをclone

```
$ git clone https://github.com/yoshiki9636/konnyaku2
$ cd konnyaku2
$ vi bashrc_add
```
bashrc_addの中を変更します。
<Json file path>を先ほどダウンロードしたJSONファイルのパスとファイル名を記載してください。
<Project name>を先ほど作成したプロジェクト名を記載してください。

```
$ source bashrc_add
$ vi auto.sh
```
同じように<Json file path>と<Project name>を記載してください。

####2. audioの確認

まずオーディオの確認をします。

```
$ cat /proc/asound/modules

0 snd_bcm2835
1 snd_usb_audio
```
となっていれば、今回の構成では大丈夫です。snd_usb_audioが見えないと、USBマイク周りでトラブっているので、解決してください。
次に音声の確認です。

```
$ arecord aaa.wav
```
でレコーディングが開始されるので、何かしゃべってCtrl-Cで停止してください。aaa.wavファイルができればOKです。
次に

```
$ aplay aaa.wav
```
で先ほどの録音が再生されればテストは完了です。

####3. google SDKのセットアップ
以下を実行してください。

```
$ export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"
$ echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
$ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ sudo apt update && sudo apt install google-cloud-sdk
```
次にSDKを初期化します。

```
$ gcloud init

Welcome! This command will take you through the configuration of gcloud.

Your current configuration has been set to: [default]

You can skip diagnostics next time by using the following flag:
  gcloud init --skip-diagnostics

Network diagnostic detects and fixes local network connection issues.
Checking network connection...done.
Reachability Check passed.
Network diagnostic passed (1/1 checks passed).

You must log in to continue. Would you like to log in (Y/n)?
```
'Y'を選択します。

```
Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/auth?XXXXXX....

Enter verification code:
```
ブラウザでのgoogleアカウントでログインを促されるので、書かれているURLをブラウザにコピペして、GCPのアカウントを作成したgoogleアカウントでログインします。Verification Codeが返されるので、コンソールに入力します。

```
You are logged in as: [XXXXX@gmail.com].

Pick cloud project to use:
 [1] honyaku-ai
 [2] Create a new project
Please enter numeric choice or text value (must exactly match list
item):
```
ログインされ、先ほど作成したプロジェクト'honyaku-ai'が見えるので、[1]を選択します。

```
Your current project has been set to: [honyaku-ai].

Not setting default zone/region (this feature makes it easier to use
[gcloud compute] by setting an appropriate default value for the
--zone and --region flag).
See https://cloud.google.com/compute/docs/gcloud-compute section on how to set
default compute region and zone manually. If you would like [gcloud init] to be
able to do this for you the next time you run it, make sure the
Compute Engine API is enabled for your project on the
https://console.developers.google.com/apis page.

Created a default .boto configuration file at [/home/pi/.boto]. See this file and
[https://cloud.google.com/storage/docs/gsutil/commands/config] for more
information about configuring Google Cloud Storage.
Your Google Cloud SDK is configured and ready to use!

* Commands that require authentication will use yoshiki.k963@gmail.com by default
* Commands will reference project `honyaku-ai` by default
Run `gcloud help config` to learn how to change individual settings

This gcloud configuration is called [default]. You can create additional configurations if you work with multiple accounts and/or projects.
Run `gcloud topic configurations` to learn more.

Some things to try next:

* Run `gcloud --help` to see the Cloud Platform services you can interact with. And run `gcloud help COMMAND` to get help on any gcloud command.
* Run `gcloud topic --help` to learn about advanced features of the SDK like arg files and output formatting
```
これでSDKのセットアップが完了です。

####4. pythonセットアップ
次にpythonのライブラリを設定します。

```
$ sudo apt install portaudio19-dev
$ sudo pip3 install google-cloud-speech google-cloud-translate pyaudio
```

google cloud translateライブラリをテストします。

```
$ git clone https://github.com/googleapis/python-translate
$ cd python-translate/samples/snippets/ 
$ python3 quickstart.py

Text: Hello, world!
Translation: Привет мир!
```
google cloud speech ライブラリをテストします。

```
$ git clone https://github.com/googleapis/python-speech
$ cd python-speech/samples/snippets
$ python3 quickstart.py

Transcript: how old is the Brooklyn Bridge
```
それぞれの表示が出ればOKです。

####5. スピーチソフトのインストール
Text-to-Speechのソフトとして、日本語にopen-jtalk、英語にfestivalを使用します。
まずopen-jtalkのインストール

```
$ sudo apt install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
```
スクリプトjsay.shを使いテストします。

```
$ ./jsay.sh "こんにちは"
```
スピーカから「こんにちは」と聞こえればOKです。

次にfestivalのインストール

```
$ sudo apt install festival
```
スクリプトfestival.shを使いテストします。

```
$ ./festival.sh 'good morning'
```
スピーカから聞こえればOKです。

####5. いよいよ実機テスト
実機でテストします。

```
$ python3 konnyaku2.py
```

GPIO23のボタンを押したまま、日本語をしゃべり、終わったらボタンを離します。
離したところで録音を切り、音声をgoogle cloudに投げ、戻ったテキストをgoogle translateに投げるという処理をして、最終的にfestivalで翻訳した英語を話します。
次にGPIO24のボタンを押したまま、英語をしゃべり、終わったらボタンを離します。
同じようなパスを通り、最終的にopen-jtalkで翻訳した日本語をしゃべります。

両方のボタンを押すとpythonが終了します。
昨日を試したいのであれば、ここまででOKと思います。

####6. おまけ　自動起動
画面なしのRaspberry Piのみで動作させたい場合の自動起動、自動終了のセットアップです。
まず自動終了を有効化します。

```
$ vi konnyaku2.py
```
最後から4行目のコメントアウトしている行を有効にします。

```
   #os.system("sudo shutdown -h now") # for auto shutdown
```
↓

```
   os.system("sudo shutdown -h now") # for auto shutdown
```
これによって、２つのボタンを同時に押すことでシャットダウンプロセスが起動します。
この状態でpython3 konnyaku2.pyで起動すると、終了時に必ずシャットダウンしてしまうので、注意してください。

次に、auto.shの確認をします。auto.shにGOOGLE_APPLICATION_CREDENTIALSとGOOGLE_CLOUD_PROJECTが設定されていることを確認します。

次にsystemdで使用するkonnyaku2.serviceファイルの確認をします。
WorkingDirectoryとExecStartのパスが正しいことを確認してください。ｌ
以下を実行します。

```
$ sudo cp konnyaku2.service /etc/systemd/system
$ sudo systemctl daemon-reload
$ sudo systemctl start konnyaku2
$ sudo systemctl status konnyaku2
```
これで緑シグナルになっていれば、自動起動はOKです。イネーブルしてください。

```
$ sudo systemctl enable konnyaku2
```

これで、再起動しても自動起動するようになりました。

ネットワークを無線にして、バッテリをつなげればかなりハンディに近くなるので、遊んでみてください。

#最後に
近年、クラウドでのテキスト翻訳もかなり使えるものが出てきて、Speech-to-Textの品質が翻訳機の品質を左右するようになってきていると思います。Googleは翻訳もさることながら、Speech-to-Textの品質が素晴らしいと改めて実感できる工作になったと思います。