Rubyでリアルタイム書き起こしツールを作っている

Parrotというアプリケーション? ライブラリー? を作っている。

プレゼンツールのRabbitに機能を追加するツールで、話していることをリアルタイムで書き起こして、スライドに表示するという物。

Zoomの書き起こし機能とか使えばまあまあいい性能は出るのだけど、Rubyでやりたかった。

whispercpp gemへのコントリビューションをしているうちに、特にMemoryView対応を入れた辺りでこれできるなとは思ったのだけど、肝心の、マイクから取得したオーディオデータをMemoryViewにしてエクスポートするライブラリーが無かった。

本家Whisper.cppにはtalk-llamaと言ってLlama.cppで動かすLLMと音声で会話するサンプルアプリケーションがあって、それはSDL2を使っていた。でもRubyのSDL2バインディングは長いことリリースが無かったので不安で、検索していたらGStreamerがマイクも使えることが分かった。あのkouさんがメンテナーなので安心感もある。というわけでMemoryView対応を追加しようとしたのだけど……時間が掛かった。ニ年ぐらい。僕自身がCに不慣れ、オーディオプログラミングに不慣れな上に、GStreamerがマルチメディアフレームワークなので、自分が欲しいデータ形式以外(動画とか、Whisper.cppが要求する16kHz 32 bit floatモノラル以外の音声とか)のことも考えないといけない(結局殆どを「現在はサポート外」にした)。あとまあ、不慣れな領域なので一度離れると次に着手するのが億劫になったりとか……。

最近会社を辞めて少し時間が出来たのとAIという相談相手ができたことでばばっとプルリクエストにすることができた。

そこができれば後は難しくないので初期実装を作った。

GStreamerでマイクの音を拾い、

whispercppで文字にして、

dRubyを使ってRabbitに投げる

というので動いている。全部Ruby。

今はまだGStreamerのMemoryViewエクスポートと、必要なwhispercpp gemの変更がリリースされていないのでRubyGems.orgには公開していない。その間にコメント用のテーマを作ったり(デフォルトのはちょっと見辛いのだ)している。

あとパラメーターチューニングしておかないと今は残念な精度なのでそこを細々進めていこうと思う。