最近はRubyでパソコンのマイクを触ろうとしている

なんか秋ぐらいから謎の熱が出てずっとwhisper.cppのRubyバインディングを書いていたけど、一応目標としていたところまでは到達した。つまり、インストールできない状態だったのをできるようにして、それから、オーディオデータをMemoryViewとして受け取ることができるようにした。細かいことではまだやりたいことあるけど、大きな物としてはWindows対応と、CUDAとかOpenVINOとかのGPUを動かせる為の対応1。これは実機を持っていないので中々難しい。VPSで時間単位課金で使えるやつを探すのがいいんだろう。

で、これをやったからこそなのだけど、今ではRubyからパソコンのマイクを触る為のコードを書きたくなって、やり始めた。whisper.cppの本家では、streamと言って、マイクからの入力を文字にするというコマンドも作られているのだけど、これをRubyでやりたいわけだ。これをやるにはそもそものstreamのラッパーを拡張として書くやり方もあって、Rubyバインディングを書いてきたことで今の僕ならそれもできると思う。でも、Rubyでのマイク入力の取り方を検索してみたら無くて、それならコミュニティ貢献も兼ねてRubyでマイクを触れるようにしようと思った次第。

ちょっと検索したところ、マイクに触るのは二つのやり方がありそう。streamでも使っているSDLという、ゲーム製作なんかで使われているらしいマルチメディアライブラリーを使うことと、GStreamerというこれもマルチメディアフレームワークを使うこと2

SDLは、Ruby/SDL2というgemが既にある。ただ、マイクの所は実装されていないのでパッチを送ることになる。調べてみたところ、今の僕の知識でできそう。また、SDLの最新バージョンは3らしくて、この3に対応したgemはまだ存在しなさそうで、それを作ってもいい。

GStreamerは、Cの他に、GObjectというCでオブジェクト指向プログラミングをする為のフレームワークも覚える必要がある。幸いGStreamerのRubyバインディングは存在していて、実は既にマイクの音声をRubyで触ることができる。後はMemoryView関連の所を追加すればいいだけだ。が、その為にGObjectとGStreamerの全体像(SDLよりも大きい)を掴まないといけないのでSDLよりは心理的なハードルが高い。

けど、GStreamerのRubyバインディングを作っているのがkouさんだしなということと、LGPLなのでちょっとでもフリーソフトウェアが広まるといいなとGStreamerにMemoryView対応を入れることにした

これができるとRabbitと組み合わせてプレゼンテーションのリアルタイム書き起こしとか翻訳(Whisperは翻訳機能もある)できたりするのかな、そしたらkouさんやMatzさんがRuby Kaigiとかで使ってくれるかも、みたいなことを妄想したりしている(その為にもLinux CUDA対応をしたい)。

調べているとGStreamer自体にも、ビデオやオーディオを入力に、ニューラルネットワークに渡すプラグインも作られているみたいで、そのプラグインのRubyバインディングを作る方が筋がいい気もしているが、趣味だし、興味があるのでGStreamerのMemoryView対応を選んでいる。GStreamerの後はSDLもできればRubyでマイクを触る選択肢が増える。MemoryView対応ライブラリーが増えることで活性化して、機械学習方面にも波及してくれるといいなという気持ちもある。

というところで割と忙しくて一週間ぐらい触れない期間とかもあったけど、年末年始で形になるといいなあ。

1

あとRubyGems.orgにリリースされていないという問題も残っているけど……gemオーナーの対応待ち。

2

勿論、各プラットフォームとかマイクのデバイスドライバーを触るコードを書くという自明な方法もあるけど、やりたくないし、やり方も分からない……。