メールの文面や、Slack 等に投稿、返信する内容を音声入力で簡単に作るツールみたいなの、例えば Willow Voice のようなアプリケーション、使ってみたいんだけどプラットフォーム(Willow Voice だと MacOS のみとか)が限定されてたり、課金してまで使うかなみたいのがあったんですが、(精度とか機能とかの差は置いておいて)一度どんな感じになるのかを体感してみようということで OpenAI の API プラットフォームを使ってローカル環境で動かせる音声 → テキストのリアルタイム変換ツールを作ってみました。

使用した OpenAI API は以下の 2 つ。
- GPT-4o mini Realtime (
gpt-4o-mini-realtime-preview) - GPT-4o mini Transcribe (
gpt-4o-mini-transcribe)
gpt-4o-mini-realtime-preview の正式リリース版 (かつ性能向上版) として gpt-realtime が、gpt-4o-mini-transcribe の上位版として、GPT-4o Transcribe がありますが、どちらもオーバースペックだと思いますしコストも高いので、なるべくコストがかからない方向で選択しています。
なお、単純に音声データをテキスト変換してもらうだけなら gpt-4o-mini-transcribe のみで可能ですけども、今回はリアルタイムに音声を変換したいので、gpt-4o-mini-realtime-preview を使用しています。
WebRTC でリアルタイムに音声を送るため Realtime セッション(gpt-4o-mini-realtime-preview)を使いつつ、そのセッション設定で gpt-4o-mini-transcribe を指定してリアルタイムに変換されたテキストを取得(AI からの会話レスポンスは全部無視!)するという建て付け。
基本的な処理の流れとしては以下の通り。
- ユーザー音声 → ブラウザが
navigator.mediaDevices.getUserMediaでマイク入力を取得、RTCPeerConnectionにストリームを送信 RTCPeerConnection→/api/realtime-tokenで受け取ったclient_secretを使用して、gpt-4o-mini-realtime-previewへ WebRTC 接続を確立session.update→dataChannelで送信した設定に基づき、リアルタイムセッション内部でgpt-4o-mini-transcribeが音声をテキスト変換- テキスト変換結果が
dataChannelで返るので、その内容を画面に反映
[User Mic]
│
▼ getUserMedia()
[Browser Audio Track]──┐
│ │ addTrack()
▼ ▼
[RTCPeerConnection] ──► gpt-4o-mini-realtime-preview
▲ ▲ │ (handles WebRTC session)
│ │ │
│ └─ session.update ├─► gpt-4o-mini-transcribe (ASR)
│ │
dataChannel ◄────────────┘ transcription events
│
▼
[UI live text]
使い方はリポジトリの README.md を読んでもらえれば簡単です。
実際に使ってみていますが、音声入力って楽ですね。ただ、文章を考えながらしゃべると途中で止まったり、言い直しが発生したりしがちなので精度はちょっと下がるかな。ある程度頭の中で文面を作ってから話し始めないといけないかも。とりあえず草案を作るって用途ならそこまで気にしなくてもいいですが。
ただし、リアルタイム、音声→テキスト変換の API はそこそこコストが高いので、あんまり調子に乗ってガンガン使ってると予算を速攻で使い切る可能性があるので注意してください。私はしばらく使ってみようかなと思っています。
とはいえ、最近は、BlabbyAI Speech to Text みたいに、拡張機能で Web サイトに AI による音声入力機能を追加するような便利ツールも出てきているのでおとなしくそういうのを使った方が早いような気もしますが。