最近パソコンの前でやっていることの、かなりの割合が 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 ENTERMac 側(常駐アプリ)
シリアルの行を読んで、前面アプリの入力欄に文字を入れます。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)実際に試してみた

画面は 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 円、月に使っても数百円。接続と待機は無料
- 青を押して喋り、黄色で確定。簡単な作業ならキーボードは不要になった


コメント