whispercpp gem
#Whisper
whisper.cppのRubyバインディング。
https://rubygems.org/gems/whispercpp
似た試みとしてwhisper.cpp gemがある。
やりたい
Windows対応
Windowsではインストールできないところまでは確認したが、環境がなくて直せない
静的ライブラリーの拡張子が.lib
extじゃなくてext/Releaseにインストールされる
Rakefile中のmakeはnmakeに
shellescapeはbash用なので通用しない(コマンドパスとかに空白文字がある時)
その他
fullにオーディオファイルのパスを渡してCでそれを読ませる
VAD::Paramsの_msや_sサフィックスの無い属性を追加
単位をミリ秒に揃えていいものか迷う
stream
C++のやつを使ってもいいし、llama_cpp gemと組み合わせてもいい
whisper.cppのダイナミックリンク
homebrew版は古いし、他のパッケージマネージャーではデフォルトでサポートされてないから急がない
自分でそっち側やれという話はあるけど、まあ、まあ・・・・
Context#fullの第二引数(サンプル)として1行n列の二次元配列を受け入れる
GStreamerのMemoryView対応をやってからかな
モデルダウンロード機能拡張
レンジリクエスト機能
Xet対応
content lengthが無い時の対応(対応済み)
Rubyからコールバックを登録すると、CとRubyを行ったり来たりするから遅くなってしまう。高速化したい。
そもそも、GVLを解放しながらCを動かすようにするところから?
RubyのブロックをFiberとか使って別に実行とか?
deconstruct_keys
C++を使っていない箇所を別ファイルに分けたらドキュメンテーションできる?
ドキュメンテーションは別にしても、大きいので分割したい
diarizeの話者をRubyで取りたい
diarizeってステレオ音声だけっぽい。この判定ってどこでやってる? #transcribe? #full?
-> #trunscribe
なのだけれど、現在のRuby実装ではステレオ音声の判定だけして、使ってはいない。つまりdiarizeの設定は意味を持っていない
C++実装でもdiarizeはコアのwhisper.cppの機能ではなくて、examples/mainの機能だった
書き起こしはwhisper.cppでやり、それとは別にステレオ音声を元に話者を識別している
whisper.cppには、ステレオのうち一チャネルのデータだけを渡している
つまり概ね話者が左右に別れて喋っていると看做しているのだな
whisper.cppではtiny_diarizeがtrueじゃないと話者交代を識別しない
これはtdrzが有効なモデルじゃないと使えない
コールバックの実装をもっといい感じにしたい
RB_GC_GUARDが使えるかも
モデルファイルは XDG_CACHE_HOMEに保存しているけど、XDG_DATA_HOMEの方がいい?
Rubyのインスタンス変数を使っている所を構造体のメンバーに
そうしないとSEGVしてしまうのでインスタンス変数にしたのだけど、何故SEGVするのか分かってない
Whisper.log_setとかruby_whisper_callback_containerのメンバーとか
Rubyインタプリタのむずかしいバグを直したと同じ問題なのではないかと思っている。試したい。
関数名の変更
rb_はやめたい。Rubyコア用っぽいから。
接頭辞無しのもやめたい
Rubyに露出するのとしないとの区別どうしようかと思っていたけど、区別せずにruby_whisper_でもいいのかも
WHISPER_APIカバー状況をREADMEに
MemoryView対応
サンプルとしてのアプリケーションも
サンプリング周波数とかファイルフォーマットとかの調整をRuby(拡張)レベルでやる、とか
llama_cpp gemと組み合わせてtalk llama Ruby版とか
SDL 2とかlibsndfileとかlibsoxとかGStreamerとやり取りしたい
プルリクエストした:https://github.com/ggerganov/whisper.cpp/pull/2585
マージされた
モデルのダウンロード機能 (対応済み)
hugging-face gemと連携した方がいいのかしら、inferenceしか実装してなさそうだけど
https://github.com/ggerganov/whisper.cpp/pull/2617
Hugging Faceからモデルをダウンロードするユーテリティ(対応済み)
Model::URIのサブクラスか何かで
https://github.com/ggerganov/whisper.cpp/pull/2617
テストでのモデル読み込みや書き起こしを減らす(対応済み)
fullの実行時にコールバックを登録(対応済み)
RBS(対応済み)
Params#dup (対応済み)
#initialize_copyか
なんか、特に何もしなくても期待通り動いた
本家がCMakeに完全移行したので追従(対応済み)
__APPLE__とかのマクロを参照してる所があってRubyじゃ取れない
gcc のプリプロセッサの定義済みマクロ(Predefined Macros)の確認方法みたいのをextconf.rbの中でやるのかな
https://stackoverflow.com/a/11686134/1753637
whisercpp gemのCMake導入
VAD対応(対応済み)
対応
examples/vad-speech-segmentsをgemに入れない
vad : add download-vad-model scripts by danbev · Pull Request #3149 · ggml-org/whisper.cpp
https://github.com/ggml-org/whisper.cpp/pull/3197
TypedData_Wrap_Struct等を使う(対応済み)
今はData_Wrap_Struct等を使っているが、deprecated警告が出る
https://github.com/ggml-org/whisper.cpp/pull/3197