Google Home MiniがSiriと会話へ？【2021年版】

#はじめに
2021年もアドベントカレンダーの季節が来ました。昨年は参加しませんでしたので、2年ぶりです。
今年は、5Gやドローン界隈で人気がある陸上特殊無線技士の資格に挑戦しました。四半世紀前に取得した４アマは、ラミネート加工の従事者免許証でしたが、いまは立派なんですね。

さて、今回はGoogle Home MiniでSiriへ呼びかけてみます。
Google Home Miniに「Hey Siri, いまの天気は？」と発話させ、
Siriが「いまは曇っていて、気温は１４度です」などと回答することを期待します。
Qiitaも読み物系が人気のようですが、技術メモで投稿します。

#必要な機器
・Google Home Mini（あらかじめ、Macと同じWi-Fiに接続しておきます。）
・MacBook
・iPhone（Siri用）
・Wi-Fiルーター

#必要なソフトウェア環境
・macOS Monterey 12.0.1
・Python 3.9.9
・ffmpeg 4.4.1
・pychromecast

#方針
・Macで音声ファイルを用意する
・Sayコマンドで「Hey Siri, いまの天気は？」とaiffファイルを生成し、ffmpegでmp3ファイルに変換する
・Mac内にWebサーバーを起動し、mp3ファイルを配置する（httpアクセス許可）
・iPhoneでSiriを起動しておく
・pythonスクリプトでGoogle Home miniに発話させる
・SiriがGoogle Homeからの呼びかけに応える

#手順
では、早速やってみましょう。
##音声ファイルの作成
Macのターミナルで、Sayコマンドを使って、Kyokoに発話させて、voice.aiffファイル（ファイル名はなんでもいいです）に保存します。

```
% say -v kyoko "Hey Siri、いまの天気は？" -o voice.aiff
```

Macのターミナルで、Sayコマンドを使って、このファイルを再生してみましょう。

```
% play voice.aiff
```

音声と共にこんな感じで表示されます。

```
% play voice.aiff

voice.aiff:

 File Size: 98.3k     Bit Rate: 368k
  Encoding: Signed PCM    
  Channels: 1 @ 16-bit   
Samplerate: 22050Hz      
Replaygain: off         
  Duration: 00:00:02.14  

In:100%  00:00:02.14 [00:00:00.00] Out:94.2k [      |      ]        Clip:0    
Done.
```
##音声ファイル形式の変換（aiff → mp3）
このaiff形式（リニアPCM、非圧縮）ファイルをGoogle Home miniが再生できるmp3形式（MPEG-1 Audio Layer-3、非可逆圧縮）ファイルに変換します。
ffmpegを使用します。
インストールされていない場合は、home brewであらかじめ入れてください。（すでに使っている場合は省略してください）

```
% brew install ffmpeg
```

ffmpegでaiff形式をmp3形式に変換するコマンドは次のとおりです。

```
% ffmpeg -i voice.aiff voice.mp3
```

これでmp3に変換できました。今回の場合、ファイルサイズは、1/10程度になります。
再生できるか確かめてみましょう。

```
% play voice.mp3

voice.mp3:

 File Size: 9.00k     Bit Rate: 32.8k
  Encoding: MPEG audio    
  Channels: 1 @ 16-bit   
Samplerate: 22050Hz      
Replaygain: off         
  Duration: 00:00:02.19  

In:100%  00:00:02.19 [00:00:00.00] Out:96.8k [      |      ]        Clip:0    
Done.
```

再生できればOKです。

##ローカルWebサーバーの起動
次に、このvoice.mp3ファイルをwebサーバーにアップロードします。
まず、Macに内蔵されたWebサーバーを起動します。

```
% sudo apachectl start
```

このwebサーバーのIPアドレスを調べます。

```
% ifconfig
```

en0:をみると

```
inet 192.168.1.１００ netmask 0xffffff00 broadcast 192.168.1.255
```

のように表示されました。192.168.1.100がIPアドレスです。

ブラウザを起動して、URLに「http://192.168.1.100/」と入力して、「It works!」と表示されれば起動を確認できます。

このwebサーバーのドキュメントルートは、

```
/Library/WebServer/Documents/
```
にあります。
そこでこの下に移動し、サブディレクトリを作成して、voice.mp3ファイルをコピーして配置します。

```
% cd /Library/WebServer/Documents
% sudo mkdir fuga
% cd fuga
$ sudo cp ~/voice.mp3 .
```
（↑voice.mp3のパスが~/voice.mp3だった場合の例）

ブラウザで、「http://192.168.1.100/fuga/voice.mp3」を開きます。
音が再生できれば完了です。

※MacのFirewallをOFFにするか、外部からポート80へアクセスできるように設定変更をしておいてください。

##Google Home Miniでの音声ファイル再生
次に、Google Home Miniでこのvoice.mp3を再生するための作業です。

Macにpychromecastをインストールします。

```
% pip3 install pychromecast --user
```

pythonのプログラムを書きます。
今回、Google Homeの名前は、「Office1」としました。

```python:googlehome.py
#!/usr/bin/python3
# coding:utf-8
import pychromecast
import sys

def main():
    # Google Homeを検索する
    chromecasts, browser = pychromecast.get_listed_chromecasts(friendly_names=[             "office1"])
    # castデバイスが見つからない場合、終了
    if len(chromecasts) == 0:
        print("Google Homeが見つかりません")
        sys.exit(1)

    # 最初に見つかったもの(同名のデバイスが複数あった場合)
    googleHome = chromecasts[0]

    # 発話
    googleHome.wait()
    mc = googleHome.media_controller
    voice_url = "http://192.168.1.100/fuga/voice.mp3"

    # 他の音楽を再生中の場合
    if mc.status.player_is_playing:
        print("音楽再生中。停止します。")
        mc.stop()
        mc.block_until_active(timeout=30)

    # 音声再生
    print("再生中", voice_url)
    mc.play_media(voice_url, "audio/mp3")


if __name__ == "__main__":
    main()
```

このコードを実行します。

```
% python3 googlehome.py
再生中 http://192.168.1.100/fuga/voice.mp3
```

と表示し、Google Home miniから声が流れます。

##Siriは天気を教えてくれるか？
iPhoneでSiriを起動し、
上記のコードを実行して、Google Home Miniが「Hey Siri, いまの天気は？」と発話し、
Siriが天気を答えてくれれば大成功です。

![screen_siri_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413003/50e57015-a98f-8883-0371-d999469819f9.jpeg)

こんな感じで答えてくれました。

#おわりに
今回は、Google Home MiniとMacを使って発話し、iPhoneのSiriと会話できるかやってみました。
残念なことに、Google Home Miniは、マイクとして使うことはできないようで、双方向の会話まではできませんでした。

機会があればまたお読みください。