#はじめに
2021年もアドベントカレンダーの季節が来ました。昨年は参加しませんでしたので、2年ぶりです。
今年は、5Gやドローン界隈で人気がある陸上特殊無線技士の資格に挑戦しました。四半世紀前に取得した4アマは、ラミネート加工の従事者免許証でしたが、いまは立派なんですね。
さて、今回はGoogle Home MiniでSiriへ呼びかけてみます。
Google Home Miniに「Hey Siri, いまの天気は?」と発話させ、
Siriが「いまは曇っていて、気温は14度です」などと回答することを期待します。
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.100 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」としました。
#!/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が天気を答えてくれれば大成功です。
こんな感じで答えてくれました。
#おわりに
今回は、Google Home MiniとMacを使って発話し、iPhoneのSiriと会話できるかやってみました。
残念なことに、Google Home Miniは、マイクとして使うことはできないようで、双方向の会話まではできませんでした。
機会があればまたお読みください。