0
Help us understand the problem. What are the problem?

posted at

updated at

Google Assitant SDKで自分のPCをGoogleアシスタントにしよう

はじめに

この記事は、Aizu Advent Calander2021の19日目の記事です。
大遅刻です。

本編ここから

こんにちは。PythonParrotです。
ラズパイをGoogleアシスタントにしようとして、まずは自分のPCでやってみたのでその話です。
あと「OK, Google」で起動できるようにしたのでその話も。

やったこと

以下のサイトの通りにやった。

今回はPCだったのでイヤホンとマイクがあればOKだった

躓いたところ

OAuth2.0認証するところ

https://developers.google.com/assistant/sdk/guides/service/python/embed/install-sample
ここのセクションでOAuth認証が必要なのだが、なぜか403で拒否されてしまう(自分のプロジェクトなのに・・・)
OAuth同意画面のテストユーザーに自分を追加するとうまくいく。/

OK, Googleする対応

さて、以下のページにもある通り、GoogleアシスタントSDKには「Hands-free activation」すなわち「OK Google」で起動する機能が存在しない。(deprecatedなGoogle Assistant Libraryにはあるのに・・・)
ということで、Porcupineというワードエンジンを使ってこの機能を実装してみた。

コード

# add for Hotword detectation
import pvporcupine
from pvrecorder import PvRecorder
## 中略 ##
# Porcupineのアクセスキーを引数で指定できるようにする
@click.option('--access_key', default='', help='Access Key')
def main(api_endpoint, credentials, project_id,
         device_model_id, device_id, device_config,
         lang, display, verbose,
         audio_sample_rate, audio_sample_width,
         audio_iter_size, audio_block_size, audio_flush_size,
         grpc_deadline, once, access_key, *args, **kwargs):
### 中略 ###
    handle = pvporcupine.create(access_key=access_key, keywords=['ok google', 'hey google'])
    while True:
        ## ここで起動ワードを指定する
        recorder = PvRecorder(device_index=-1, frame_length=handle.frame_length)
        recorder.start()
        result = -1
        while result < 0:
            pcm = recorder.read()
            ## ここのresultが0以上なら指定したワードを聞き取ったことになる
            result = handle.process(pcm)
        recorder.stop()
        recorder.delete()
        audio_sink = audio_source = (
            audio_helpers.SoundDeviceStream(
                sample_rate=audio_sample_rate,
                sample_width=audio_sample_width,
                block_size=audio_block_size,
                flush_size=audio_flush_size
            )
        )
        # Create conversation stream with the given audio source and sink.
        conversation_stream = audio_helpers.ConversationStream(
            source=audio_source,
            sink=audio_sink,
            iter_size=audio_iter_size,
            sample_width=audio_sample_width,
        )
        with SampleAssistant(lang, device_model_id, device_id,
                             conversation_stream, display,
                             grpc_channel, grpc_deadline,
                             device_handler) as assistant:
            assistant.assist()

全ソースコードはこちらを参照。
https://github.com/rf-castle/google-assistant-sdk-hotwordDetect-sample/blob/master/src/talk_hotword.py

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?