WORKS 作ったもの

「Hey Computer!」でChatGPTが起動する端末を12,000円のジャンクタブレットで作った

開発AI活用ガジェット

先日、12,000円で購入した ARROWS Tab Q7311

今回はこのWindowsタブレットを、

「Hey Computer」と呼びかけるだけでChatGPTと音声で会話できる端末

にしてみました。

完成形だけ見ると、

「声を認識してChatGPTを開くだけでしょ?」

という感じなのですが、実際にやってみるとなかなか大変でした。

というか、最初に考えていた構成から最終的にはかなり変わっています。

そもそも、なぜこんなものを作ろうと思ったのか。

きっかけは子どもでした。

きっかけは、車の中で使ったChatGPT Live

先日、家族で車に乗ってパルワールドのカードゲームを買いに行きました。

その帰り道に、車の中でChatGPT Liveを試してみたんです。

これが小学2年生の子どもにかなりウケました。

普通に話しかければ答えてくれるし、その回答についてさらに質問することもできます。

子どもからすると、

「なんでも答えてくれる相手が車の中にいる」

みたいな感じだったのかもしれません。

最近ちょうど、小学2年生になったこともあって質問の内容も少しずつ難しくなってきました。

例えば、

「空ってなんで青いん?」

みたいな質問。

昔なら親が頑張って説明するところですが、こちらも毎回答えを知っているわけではありません。

知っていたとしても、小学2年生に分かるように説明するのはまた別の難しさがあります。

こういう質問ってChatGPTとかなり相性が良いんですよね。

しかもLiveなら文字を入力する必要もありません。

疑問に思ったことを、そのまま声で聞けばいい。

車の中で楽しそうにChatGPTと話している子どもを見て、

「これ、家でも簡単に使えるようにできないかな?」

と思ったのが始まりでした。

最近Alexaに子どもがイライラしている

うちにはAlexaもあります。

子どもも以前から普通に使っているのですが、最近ちょっと不満が増えてきました。

というのも……

Alexaがまあまあ言うことを聞いてくれない。

例えば子どもが、

「○○の音楽かけて」

と言っているのに、

なぜかAlexaが、

「あっち向いてホイを始めます」

みたいなことを言い出す。

いや、音楽をかけろと言っている。

最近は子どもも、

「違うって!」

とAlexaにイライラしています。

もちろんAlexaは、

  • 音楽を流す
  • タイマーをセットする
  • 家電を操作する

みたいな用途なら便利です。

ただ、

「質問する → 答えてもらう → その答えについてまた聞く」

みたいな会話になると、ChatGPT Liveとはかなり違います。

子どもの質問も少しずつ高度になってきたことだし、

Alexaとは別に、ChatGPTと気軽に話せる端末を家に置いたら面白いんじゃないか。

そんなことを考え始めました。

ちょうどイオシスの30周年セールがあった

そんなタイミングで、イオシスの30周年セールがありました。

そこで見つけたのが、

ARROWS Tab Q7311。

Windows 11が動くタブレットで、価格は12,000円。

しかもジャンク扱いです。

普通にタブレットが欲しいだけなら、家にはiPadやAndroid端末もあります。

でも今回はWindowsが動くというのが重要でした。

ChatGPT端末としてうまくいかなかったとしても、

  • Windowsアプリの検証機
  • 自作プログラムの実機テスト
  • 常時起動させる端末
  • 色々な実験用PC

として使えます。

12,000円なら、遊ぶにはちょうどいい。

ということで購入。

そして、

「こいつを家のChatGPT端末にしよう」

という計画が始まりました。

理想はAlexaみたいに呼びかけるだけ

やりたいことはシンプルです。

最初に考えていたのは、

「ねえチャッピー」

と呼びかけると、

  1. タブレットが声を認識
  2. ポンっと音が鳴る
  3. ChatGPTが起動
  4. ChatGPTの音声会話が自動で始まる
  5. そのまま会話できる
  6. 会話終了後、再び待受状態に戻る

というもの。

子どもが使うことを考えると、

画面をタップして、ChatGPTを開いて、Voiceボタンを押して……

では面倒です。

それなら普通のタブレットとあまり変わりません。

目標は、

「ねえチャッピー!」

だけ。

Windowsで常駐する小さなアプリを作り、名前は ChappyWake としました。

普段はタスクトレイに常駐してマイクを監視し、呼びかけを検出したらChatGPTを起動する仕組みです。

最初は、

「このくらいなら割と簡単にできるんじゃない?」

と思っていました。

全然そんなことはありませんでした。

最初の問題。「ねえチャッピー」をどう認識する?

まず必要なのが、呼びかけを検出する仕組みです。

最初に候補になったのが Porcupine

ウェイクワード検出専用なので良さそうなのですが、

  • AccessKeyが必要
  • カスタムモデルが必要
  • 日本語用モデルの準備も必要

など、少し面倒。

今回の理想は、

ARROWS Tabでバッチを1個実行したら使える

くらいの気軽さです。

できればアカウントを増やしたり、キーを取得したりもしたくありません。

そこで、無料でローカル動作する Vosk を使うことにしました。

音声認識モデルもセットアップ時に自動で取得するようにして、

できるだけ初期設定を減らす

方向にしました。

ところが、そのVoskで音声認識する以前に問題が発生します。

そもそもARROWS Tabのマイクが取れない

最初はマイクの録音部分にPvRecorderという仕組みを使っていました。

ところがARROWS Tabで動かしてみると、

PvRecorderRuntimeException

が約3秒おきにひたすら出ます。

ではWindows寄りの録音方法にしようということで、NAudioを使って WaveIn へ変更。

今度は、

「Windowsの録音デバイスがありません」

と言われます。

いやいや!ARROWS Tabには普通にマイク付いてるやんけ!

Intel Smart Sound TechnologyやRealtek Audioのドライバーまで確認することになりました。

最終的には、

WaveInではなくWASAPIでWindowsの既定入力デバイスを取得する

方式へ変更。

これでようやく、

ARROWS Tabの内蔵デジタルマイク

をプログラムから取得できるようになりました。

マイクだけでも、

PvRecorder → WaveIn → WASAPI

と3方式目です。

リモートデスクトップの設定も罠だった

ARROWS Tabでの動作確認は、基本的にメインPCからリモートデスクトップで接続してやっていました。

別にARROWS Tabが遠くに置いてあるからではありません。

タブレット本体でキーボード入力したり、長いログを確認したり、エラー内容をコピーして貼り付けたりするのが面倒だからです。

今回の開発では、

修正する

ARROWSで試す

ログを見る

エラー内容をコピーする

また修正する

という作業を何度も繰り返します。

これをタブレット単体でやるのはかなりつらい。

リモートデスクトップなら、普段使っているPCのキーボードとマウスをそのまま使えるし、ログのコピー&ペーストも楽です。

なので、できれば開発中はずっとリモートデスクトップにつないだままテストしたい。

ところがマイク周りを調べていると、Windowsから見えているオーディオデバイスが、

「リモート オーディオ」

だけになっていました。

最初は、

「RDPで接続している間はARROWS本体のマイクを使えないのか?」

と思ったのですが、これはリモートデスクトップ側の設定で解決できました。

リモートデスクトップ接続の、

「ローカル リソース」→「リモート オーディオ」→「設定」

を開いて、

  • リモート オーディオ再生:「リモート コンピューターで再生する」
  • リモート オーディオ録音:「録音しない」

に変更。

この状態で接続すると、

リモートデスクトップにつないだまま、ARROWS Tab側の内蔵マイクを使ってテストできるようになりました。

これでかなり楽になりました。

メインPCからARROWSを操作しながら、

「Hey Computer!」

とARROWS本体に話しかける。

反応しなければ、そのままログを開いてコピー。

また修正して更新。

という流れで試せます。

ログにも、

「マイク配列(デジタルマイク向けIntel Smart Sound Technology)」

が出るようになり、ようやくマイク周りは解決しました。

……と思ったら、次はもっと根本的な問題です。

「ねえチャッピー」が全然「ねえチャッピー」と認識されない。

マイクが使えるようになったので、いよいよVoskに、

「ねえチャッピー」

を聞き取らせます。

ところが結果は、

[unk]

要するに、

「何言ってるか分かりません」

です。うんこじゃないよ

では、実際には何と認識しているのか。

音声認識結果を全部ログへ出すようにしてみました。

そして、

「ねえチャッピー」

「ねえチャッピー」

「ねえチャッピー」

と何度も言ってみます。

結果は、

えーっと
えーと じゃあ
えーと ねー じゃあ
えっと ねー
じゃあ
じゃあ 日
ん ねぇ

……。

チャッピー、どこ行った。

「ねえチャッピー」が毎回違う日本語に化けています。

では、

「えーと」

とか、

「じゃあ」

もウェイクワード扱いにすればいいのか。

もちろんそんなことをすると、普段の家族の会話でChatGPTが起動しまくります。

これはダメです。

そこで発想を変えました。

日本語をやめます。

「Hey Computer」にしたらあっさり認識した

別案として、

「特定の人の声を録音して、それをウェイクワードとして覚えさせる」

という方法も考えました。

ただ、今回使うのは自分だけではありません。

子どもや家族みんなが使う予定です。

人ごとに声を登録するのも面倒。

そこで次に試したのが、

「Hey Computer」

でした。

Voskの英語小型モデルを使います。

試してみると……

Vosk heard: hey computer
Wake word detected by Vosk: Hey Computer

きた。

あれだけ苦労したのに、英語にしたらあっさり認識しました。

「Hey」だけ、

「Computer」だけ、

では反応しないようにもしています。

もともとの「ねえチャッピー」とは変わってしまいましたが、

「Hey Computer!」

もこれはこれで、ちょっとSFっぽくて良い。

家族の誰が呼びかけても認識できます。

これでいよいよChatGPTを起動します。

ここでかなり完成に近づいた気がしました。

気がしただけでした。

「Hey Computer」には反応した。でもChatGPTが起動しない

実機で、

Vosk heard: hey computer
Wake word detected by Vosk: Hey Computer
Playing notification sound

まで出るようになりました。

ウェイクワード認識は成功。

音も鳴ります。

次はChatGPT Windowsアプリを起動して、Voiceを開始します。

ところが最初は、

ChatGPTアプリが起動するのに時間がかかりすぎてタイムアウト。

起動待ち時間を10秒から30秒へ変更しました。

次に出たのが、

FileNotFoundException

Voiceボタンを自動操作するために使っていたUI Automation周りのファイルが、実行用ファイルにうまく含まれていませんでした。

そこを直すと、今度は、

TypeInitializationException

別の初期化エラー。

一つ直すと、また次が出てきます。

それでも修正を続けて、

ついに、

Voice button clicked by UI Automation: Start new voice chat
Voice start result: UiAutomationInvoked

というログが出ました。

実際に、

「Hey Computer!」

と言うと、

ChatGPT Windowsアプリが開いて、

Voiceが始まりました。

おお、かなり良い。

ようやく期待していた動きになりました。

2回目を起動したら、なぜかVoiceを終了させる

ところが一度Voiceを終了して、もう一度、

「Hey Computer!」

と言ってみると、今度はうまくいきません。

ログを確認すると、

Voice button clicked by UI Automation: 音声チャット終了

……。

開始するつもりで、終了ボタン押してる。

原因は単純で、

Voice開始ボタンを探す際に、

「音声」

というかなり広い文字列で検索していたため、

「音声チャット終了」

まで開始ボタンとして認識していました。

開始用と終了用のボタン名を明確に分けて修正。

さらにもう一つ問題がありました。

ChatGPTと会話中に「Hey Computer」を聞いてはいけない

ChatGPT Voiceを使っている間にもVoskの待受が復活すると、

ChatGPTと話している自分の声をChappyWake側も聞いてしまいます。

会話中に偶然、

「Hey Computer」

に近い言葉が入ったら、また起動処理が走るかもしれません。

そこで、

ChatGPT Voice中はウェイクワード用のマイク監視そのものを停止。

Voice終了を検出したら、

少しクールダウンを入れて、

再びウェイクワード待受へ戻るようにしました。

ここまででかなり期待どおりに動くようになりました。

ただ、

Windowsアプリ版ChatGPTをUI Automationで操作する方法には、どうしても少し不安定さが残ります。

そして最後の最後で、ふと思いました。

「これ、ブラウザ版でよくない?」

ChatGPT Windowsアプリをどうやって安定して操作するか色々考えていて、

突然思いました。

「これ、ブラウザ版ChatGPT使えば良くない?」

ChromeでChatGPTを開くと、普通にVoiceボタンがあります。

Windowsアプリを無理やり操作するより、

Chromeを開く

ChatGPTを表示

Voiceボタンを押す

のほうが明らかに単純です。

しかもログアウト状態でChatGPTを開いてみても、Voiceのアイコン自体は表示されています。

そこで、

「もしかしてログインすら不要なのでは?」

と思って実験してみました。

匿名確認用のChromeプロファイルを新しく作り、

ログインしていない状態でChatGPTへアクセス。

Voiceボタンを押します。

すると、

声を選択する画面

が表示されました。

お?

これはいける?

と思ったのですが……

その先には、

「ログイン」

の表示。

残念ながら、匿名のままVoiceを開始することはできませんでした。

でも初回ログインだけなら全然問題ない

ただ、よく考えたら、

ログインが必要でも何も問題ありません。

ARROWS Tabで最初の一回だけ、

  1. ChromeでChatGPTを開く
  2. ChatGPTへログイン
  3. Voiceを一度起動
  4. 声を選択
  5. マイク利用を許可

まで済ませればいい。

Chromeならその状態を保存してくれます。

毎回ログインする必要はありません。

これなら普段使うときは、

「Hey Computer!」

だけで済みます。

ということで、

Windowsアプリ版をやめて、ブラウザ版ChatGPTを使う方式

へ変更することにしました。

ブラウザ版に変えたら、あっさり完成した

最終版ではChromeを、

chrome.exe --app=https://chatgpt.com/

という形で起動します。

普通のChromeウィンドウではなく、

ChatGPTだけを表示する専用アプリっぽいウィンドウ

になります。

Chromeの通常プロファイルをそのまま使用するので、

  • ChatGPTのログイン状態
  • 選択したVoice
  • マイク許可

などもそのまま引き継げます。

ChatGPTのウィンドウがすでに開いている場合は、新しく起動せず既存ウィンドウを前面に出します。

準備ができたところで、ARROWS Tabに向かって、

「Hey Computer!」

ポン。

Chromeが開く。

ChatGPTが表示される。

Voiceボタンが自動で押される。

そのまま会話開始。

めっちゃ良い。

今まで何だったんだというくらい、すんなり動きました。

思わず、

「最初からこれでやっても良かったね」

となりました。

途中でUSBメモリで更新するのも嫌になった

ちなみに今回、音声周りとは別でもかなり寄り道しています。

開発しているのはメインPC。

動作確認するのはARROWS Tab。

最初は修正版を作るたびに、

USBメモリでARROWSへコピー

していました。

最初の数回は別に良かったんです。

でも、

直す

コピー

試す

エラー

直す

コピー

また試す

を何度も繰り返していると、

「毎回USBメモリでコピーするの、さすがにつらい」

となりました。

そこでGitHubに非公開リポジトリを作成。

さらに、

private GitHub Release

からARROWS側へ実行ファイルを配布できるようにしました。

最終的にはARROWS Tabで、

update.batを実行するだけ

で最新版へ更新できます。

初回だけGitHubへの認証が必要ですが、2回目以降はかなり楽。

メインPCで修正

GitHubへ反映

ARROWSでupdate.bat

すぐテスト

という流れにできました。

もちろん更新機能でも盛大にハマった

これも簡単にはいきません。

例えば、

初回なのに「既存のChappyWake.exeがありません」とエラー。

そりゃ初回だから無い。

修正。

次はGitHub CLIを自動インストールしようとしたら、

wingetの進捗表示をPowerShellがエラー扱い。

修正。

次は、

GitHubにログインしていないので停止。

初回ならブラウザを開いて認証するよう修正。

次は、

GitHubからダウンロードしたexeをWindowsがブロック。

インターネットから取得したファイルのブロックを解除するよう修正。

さらにRelease作成まわりのテスト中には、

Release処理

テスト実行

そのテストからまたRelease処理

またテスト実行

という自己再帰まで発生。

最終的に、

725個の子プロセス

が残りました。

ChatGPTを起動するだけのアプリを作っているはずなのに、なかなか壮大になってきました。

最終的に完成したChappyWake

そんなこんなで完成したChappyWake。

最終的な流れは、

待機中

ARROWS Tabの内蔵マイクを監視

「Hey Computer!」

Vosk英語モデルがローカルで認識

ポンっと音が鳴る

ChromeでChatGPTを起動

Voiceボタンを自動で押す

ChatGPTと会話

Voice中はVoskのマイク監視を停止

Voice終了

少し待って再び「Hey Computer」待受

となりました。

最終バージョンは、

v0.1.9

自動テストは、

103件すべて成功。

ARROWS Tab実機でも動作確認できました。

一番効いたのは「別の方法でよくない?」だった

今回やってみて面白かったのは、

最初に決めた方法を最後まで使ったわけではないことです。

マイクだけでも、

PvRecorder → WaveIn → WASAPI

と変わりました。

ウェイクワードも、

「ねえチャッピー」 → 「Hey Computer」

へ変更。

ChatGPTの起動方式も、

Windowsアプリ → Chrome版

になりました。

最初に考えていた構成から、最終的にはかなり違うものになっています。

動かなければ原因を調べて直す。

それでも面倒なら、方法そのものを変える。

特に今回、一番大きかったのは、

最後にふと思った、

「ブラウザ版でよくない?」

でした。

Windowsアプリ側でかなり苦労していたのに、

ブラウザ版へ変えた途端、かなりすんなり動きました。

こういうのは実際に作って試してみないと分からないものです。

12,000円のジャンクタブレットが家族用AI端末になった

ということで、

ARROWS Tabを常設ChatGPT音声端末にする計画

ひとまず完成です。

始まりは、

車の中でChatGPT Liveを使ったら子どもがめちゃくちゃ楽しそうだったこと。

小学2年生になって、

「空ってなんで青いん?」

みたいな質問も増えてきた。

一方でAlexaには、

「音楽かけて」

と言っているのに、

あっち向いてホイを始められてイライラしている。

だったら、

子どもが思ったことを好きなときに質問できるChatGPTを家に置いてみよう。

そんなところから始まりました。

普通にChatGPTを使うだけならスマホで十分です。

でも部屋に端末を置いておいて、

子どもが、

「Hey Computer! 空ってなんで青いん?」

と聞く。

するとChatGPTが起動して、そのまま会話が始まる。

これは結構面白い。

12,000円で買ったジャンクタブレットが、思っていた以上に未来っぽい端末になりました。

これからしばらく家族で実際に使ってみて、

「常設ChatGPTは子どもの疑問にどこまで使えるのか?」

も試してみようと思います。

コメント

タイトルとURLをコピーしました