腱鞘炎の前に。M5Stackで音声入力するPC生活

腱鞘炎の前に M5Stackで音声入力
この記事は約13分で読めます。
スポンサーリンク

最近パソコンの前でやっていることの、かなりの割合が AI エージェントの操作です。

pi agent に作業を頼み、返ってきた結果に注文をつけ、また次の指示を出す。この繰り返しが中心になって、キーボードを打つ時間がこれまで以上に増えました。

それに比例して、指の疲労も増えてきました。このままでは腱鞘炎になりそうだと思ったのが、この話の始まりです。

なぜ作ったのか

きっかけは指の疲れです。

最近買った M5Stack のデバイスがあったので、これで音声入力してエージェントを操作できないかと考えました。

狙いは 2 つです。

  • キーボードを打つ回数を減らして、指を休める
  • 声で指示を出すことで、入力そのものを速くする

M5を使ってMacに音声入力する

準備した環境

役割マシン
エージェントの実行Ubuntu
操作する側MacBook Air M5

エージェントは Ubuntu 側で動かし、手元の MacBook から操作します。音声入力のデバイスは MacBook に挿します。

できること

M5 を押して入力したい内容を喋ると、自動的に Mac のアクティブウインドウに入力されます。

エージェントの画面を開いていれば、その指示欄に文字が入ります。Slack でもブラウザでもエディタでも、前面にあるアプリの入力欄に入る仕組みです。

なぜ M5 を挟むのか

最初は「Mac のマイクを使えばいいのでは」と思いました。わざわざ M5 を経由する必要はないように見えます。

それでもこの構成にしたのは、2 つの理由があります。

  • Mac に追加のショートカットキーを設定したくなかった。他のツールとキーがバッティングするのを考えるのが面倒でした
  • キーボードから離れて操作したかった

物理ボタンを押すだけなら、キーボードに手を戻す必要がありません。ショートカットの割り当てを管理する手間もありません。結果として、M5 を挟む構成を試すことにしました。

使ったのは M5Stack CoreS3 SE です。画面タッチ・マイク・スピーカー・Wi-Fi が 1 枚に載っていて、USB Type-C でファームを書き込めます。押す・喋る・表示するがこれ 1 台で完結します。

構成

(M5Stack CoreS3 SE)                            (MacBook Air M5)
 押して喋る
   ↓ (A) Wi-Fi / WSS
 Soniox リアルタイムSTT (stt-rt-v5)
   ↓ 認識した日本語
   ↓ (B) USB CDC シリアル "TEXT ..." 行 ──→ Mac 側の常駐アプリ
                                          └ 前面アプリの入力欄に文字を入れる

通信の経路は 2 本だけです。

経路プロトコル用途
(A)WSS (443)音声を Soniox に送り、認識結果を受け取る
(B)USB CDC認識結果を 1 行のテキストで Mac に渡す

M5 は外向きに接続するだけで、サーバーは立てません。Ubuntu は音声認識に関与しません。

開発したツール

M5 側と Mac 側の 2 つを作りました。

M5 側(ファームウェア)

画面を押している間だけ録音し、Soniox に音声を流して、認識結果をシリアルに 1 行で出力します。

TEXT こんにちは、今日の作業を開始します。
KEY ENTER

Mac 側(常駐アプリ)

シリアルの行を読んで、前面アプリの入力欄に文字を入れます。TEXT は文字の挿入、KEY ENTER は確定です。

USB キーボードとして振る舞わせる方法も試しましたが、HID はキーのスキャンコードしか送れず日本語が出せません。そこでシリアル(USB CDC)にしました。UTF-8 をそのまま流せるので、日本語も絵文字も扱えます。

音声認識方法

音声認識は Soniox のリアルタイム API を使っています。選んだ理由は 3 つです。

  • 日本語の認識が非常に良い
  • コストが低い
  • API なので、M5 のような性能が高くないデバイスでも扱える

3 つ目は効きました。M5 は ESP32-S3 なので、ローカルで音声認識モデルを動かすのは現実的ではありません。認識をクラウドに任せれば、M5 は音声を送るだけで済みます。

料金

リアルタイム API は 1 時間あたり 0.12 ドルです。内訳は次のとおりです。

課金対象単価1 時間あたりの量金額
入力音声$2 / 100万トークン30,000 トークン$0.06
出力テキスト$4 / 100万トークン15,000 トークン$0.06
合計——$0.12

1 回の録音は数秒なので、実測では 3 秒で $0.00005 でした。1 ドル 160 円で換算すると次のようになります。

使い方金額
1 回(3 秒)0.05 円
1 日 50 回、30 日約 68 円
1 時間つなぎっぱなし19 円

月に使っても数百円の範囲です。個人が使う量なら、金額を気にする場面はほぼありません。

なお、接続しただけでは課金されません。実測で 90 秒保持しても課金レコードは 0 件でした。押したまま離した場合も料金はかかりません。

Soniox への接続方法

WebSocket でつなぎ、最初に設定を 1 回送ります。

URL  : wss://stt-rt.soniox.com/transcribe-websocket
PORT : 443
AUTH : Authorization: Bearer <APIキー>
{
  "model": "stt-rt-v5",
  "audio_format": "pcm_s16le",
  "sample_rate": 16000,
  "num_channels": 1,
  "language_hints": ["ja"],
  "enable_endpoint_detection": false
}

この JSON を送ったあと、16kHz モノラルの音声を 100ms ずつ流すだけです。WAV のヘッダも作りません。

録音を終えるときは、空のテキストフレームを送ります。

ws->send("")   ← ストリーム終了の合図
  → サーバーが "finished": true を返す(実測 約300ms)

実際に試してみた

M5Stack CoreS3 SE の実行画面。青いタイル3つが「話す」、黄色のタイルが「Enter」

画面は 4 分割です。青いタイルを押して喋ると、Mac 側に文字が入力されます。 黄色のタイルを押すと Enter が押されます。

  • 青(3 つ): 押している間だけ録音し、離すと入力される
  • 黄(1 つ): 確定(Enter)

青いタイルを 3 つにしたのは、M5 を凝視しなくても気楽に入力できるようにするためです。 画面のどこを押しても話し始められます。今では無意識に押せるようになりました。

簡単な作業なら、もうキーボードを打たなくても済みます。 エージェントへの指示も、返事への注文も、喋ってから黄色を押すだけで完結します。

まだ 2 日しか使っていませんが、めちゃめちゃ便利です。指を使う時間が明確に減りました。

自動送信しないのも気に入っています。認識ミスがあっても、入力欄に置かれるだけなので、目で確認してから確定できます。誤ったまま Enter が飛んで、意図しない指示が実行される心配がありません。

まとめ

  • エージェント操作が増えてキーボードを打つ時間が増え、腱鞘炎の手前まで来ていた
  • M5Stack で音声入力し、Mac の入力欄に文字を入れるデバイスを作った
  • 構成は M5 → Soniox → USB CDC → Mac。通信は Wi-Fi と USB の 2 本だけ
  • 日本語が要るので USB HID ではなく USB CDC。文字列をそのまま送れる
  • 音声認識は Soniox。日本語の精度が良く、コストも低い。API なので M5 単体で扱える
  • 料金は 1 回 0.05 円、月に使っても数百円。接続と待機は無料
  • 青を押して喋り、黄色で確定。簡単な作業ならキーボードは不要になった

コメント

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