回数制限のない音声入力 vtype は、9 月 19 日に空のリポジトリを作り、24 日にデスクトップ版を npm に出しました。認識は Chrome に最初から入っている Web Speech API を借りているので、API キーもアカウントも要りません。元は自作ダッシュボード many-ai-cli の入力欄にあったマイクボタンで、その認識部分を共通コアとして切り出し、Chrome 拡張とデスクトップ版の 2 つの出口を付けました。その中身を、コード付きで分解した記事です。
認識は Chrome 内蔵の Web Speech API を借りる。書いたのは、その手前と後ろです。
many-ai-cli の音声入力から「認識」の部分だけを切り出して、vtype-core という部品にしました。tsconfig から DOM を外してあり、画面には 1 ピクセルも描きません。Chrome 拡張、デスクトップ版、many-ai-cli 自身の 3 つが、同じ認識のコードを使います。
入口(声)と認識は同じで、文字をどこへどう入れるかだけが違います。
拡張では、認識をページの中ではなく、拡張自身の offscreen document で回します。サイトごとにマイクの許可を聞かれないようにするためで、許可はインストール直後の 1 回だけです。
content script は音声の API に一度も触りません。
デスクトップ版は、最初は拡張とつなぐ作りでしたが、同じ日に作り直しました。今は Rust の常駐本体が 127.0.0.1 で認識ページを配り、専用プロフィールの Chrome を画面の外で開いて、そこで認識した確定の文字を前面のアプリへ打ち込みます。認識ページは、拡張の offscreen のコードをそのまま使っています。
常駐本体と Chrome のやり取りは PC の外に出ません。外へ出るのは、Chrome が送る声だけです。
Qiita 版には、止めるたびに認識のインスタンスを作り直す理由、2 つのエンジンにマイクを同時に持たせない排他、無音 3 回で終わるセッションとサイクルの管理、React の欄にネイティブの setter で入れる方法と IME の変換待ち、サイトのボタンを自動でよけるマイクの置き方、127.0.0.1 のサーバーの守り方、OS ごとの打ち込み方までを、実際のコードの抜粋と一緒に書いています。
vtype の紹介と、デスクトップ版を Microsoft Store に出すまでの話は 前回の note 記事 に、機能の一覧とスクリーンショットは 作品ページ にまとめてあります。