Galene 用の Whister.cpp を使った文字起こしツールの galene-stt を試す

Galène に接続し， Whisper.cpp の Speach To Text で文字起こししたテキストをテキストチャット欄に投稿する galene-stt を少し試してみました．

最近，自分のホストする勉強会などでは Galène というビデオカンファレンスサーバーをセルフホストして利用しています．
これは WebRTC の SFU を利用しているのでサーバーのリソースがとても少なくて済みます．Linux/armv7 やLinux/mips の OpenWRT でも動作して少人数であれば Raspberry Pi 初代くらいのスペックでも十分動作します．
よく利用される Jitsi meet や BigBlueButton などは大量のリソースが必要なのでセルフホストするのはちょっと辛いです．

Galène videoconference server

jech/galene-stt: Speech-to-text support for Galene

省リソースで動作するビデオカンファレンスソフトウェアのGalène – Speaker Deck

https://gitlab.com/matoken/kagolug-2022.06/-/blob/main/slide/Gal%C3%A8ne.adoc

Note

Jitsi Meet では 8×8 がスポンサーしている https://meet.jit.si/ を使ったり，Google Compute Engine などに導入して，ミーティング字だけ起動して費用を抑えるという使い方をしている人も居ます．

Note

今年の LibrePlanet ではビデオサーバーに BigBlueButton に代わり Galène が使われたそうです．

A world where software freedom has a fighting chance and hope exists — Free Software Foundation — Working together for free software

galene-stt の導入

galene-stt は Galene に接続してオーディを Whisper.cpp を使って文字起こしをし，結果を Galene のテキストチャットに投稿するもののようです．サーバーでは利用者がひとり増えるだけなのであまり負荷がかからないのが良さそうです．

Whisper.cpp の導入

galene-stt は Whisper.cpp を使い文字起こしを行うので先ずは Whisper.cpp を導入します．

Whisper.cpp の導入

$ git clone https://github.com/ggerganov/whisper.cpp
$ cd whisper.cpp
$ cmake -Bbuild
$ cd build
$ make -j`nproc`
$ sudo make install
$ cd ..

モデルのダウンロード

$ make base (1)
$ cd ..

モデルのダウンロード．ここでは base をダウンロードしている．マシンスペックなどにより選択する．

galene-stt のビルド

次に galene-stt をビルドします．

$ git clone https://github.com/jech/galene-stt
$ cd galene-stt
$ go build

いくつかエラーが出ました．

エラー1，opus ライブラリが不足していた

opus ライブラリが不足していたので Debian パッケージから導入しました．

$ go build
# gopkg.in/hraban/opus.v2
# [pkg-config --cflags -- opus opus opus opus opusfile opusfile]
Package opusfile was not found in the pkg-config search path.
Perhaps you should add the directory containing `opusfile.pc'
to the PKG_CONFIG_PATH environment variable
Package 'opusfile', required by 'virtual:world', not found
Package 'opusfile', required by 'virtual:world', not found
$ sudo apt install libopus-dev libopusfile-dev (1)

>Debian パッケージから導入

エラー2，Whisper.cpp のヘッダーファイルが見つからない

Whisper.cpp を build した後システムにインストールしていなかったのでインストールした．

$ go build
# galene-stt
./whisper.go:13:10: fatal error: whisper.h: No such file or directory
13 | #include "whisper.h"
| ^~~~~~~~~~~
compilation terminated.

エラー3．Whosper のライブラリが見つからない

build が終わったので実行すると Whisper.cpp の共有ライブラリが見つからず動きませんでした．

$ ./galene-stt https://127.0.0.1:8443/group/test/
./galene-stt: error while loading shared libraries: libwhisper.so.1: cannot open shared object file: No such file or directory

Whisper.cpp のライブラリは /usr/local/lib に導入されているので LD_LIBRARY_PATH で指定してみると動きました．

アドホックに指定して実行

$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib ./galene-stt https://127.0.0.1:8443/group/test/

毎回指定するのは面倒なのでシステムに設定します． /etc/ld.so.conf にパスを追記して ldconfig コマンドで反映します．

永続化

$ echo '/usr/local/lib' | sudo tee -a /etc/ld.so.conf (1)
/usr/local/lib
$ sudo ldconfig (2)
$ sudo ldconfig -p | grep -i whisper (3)
libwhisper.so.1 (libc6,x86-64) => /usr/local/lib/libwhisper.so.1
libwhisper.so (libc6,x86-64) => /usr/local/lib/libwhisper.so

Whisper.cpp のライブラリの含まれる /usr/local/lib を /etc/ld.so.conf に追記

ldconfig コマンドで /etc/ld.so.cache に反映

Whisper.cpp のライブラリを確認

Galene-stt 動作確認

help はこんな感じです．

$ ./galene-stt --help
Usage: ./galene-stt group [file...]
-debug
enable protocol logging
-discard-silence
discard segments of silence early
-insecure
don't check server certificates
-model filename
whisper model filename (default "models/ggml-small.bin")
-password password
password to use for login
-silence volume
maximum volume required to start a new phrase (default 0.025)
-silence-time seconds
seconds of silence required to start a new phrase (default 0.3)
-username username
username to use for login (default "speech-to-text")

適当な Galene group に接続します．
今回はローカルで起動した Galene の test group に接続しました．

group の url を指定して実行

$ ./galene-stt https://127.0.0.1:8443/group/test/
2024/07/30 20:10:20 Get group status: Get "https://127.0.0.1:8443/group/test/.status.json": tls: failed to verify certificate: x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs

証明書がいわゆるオレオレ証明書なので接続に失敗します．
-insecure オプションを付けて証明書の確認をしないようにします．

もう一つ．規定値のモデルは英語専用の small.bin なので日本語も利用できるかつもう少し精度のいい base モデルを指定します．

$ ./galene-stt -insecure -model models/ggml-base.bin https://127.0.0.1:8443/group/test/

該当グループに speech-to-text が現れます．
この状態でしゃべると文字起こし結果がテキストチャットに投稿されていきます．

ここで問題が発生．
Whisper.cpp の英語への翻訳が有効になっており日本語を文字起こししても英語で結果が投稿されてしまいます．恐らく他の言語でも同じでしょう．これが修正されないと英語以外の環境では辛い感じ．
とりあえず issue に投げました．

動画を共有してその音声を認識させたが英語に翻訳されて投稿された

追記)

08-11 の 622de1914d049ce403d4e51ec0f2df4fa365a42a で -lang と -translate が追加されました．

$ git log -1 622de1914d049ce403d4e51ec0f2df4fa365a42a
commit 622de1914d049ce403d4e51ec0f2df4fa365a42a
Author: Juliusz Chroboczek <jch@irif.fr>
Date: Sun Aug 11 00:33:02 2024 +0200

Add flags -lang and -translate.

Usage 抜粋

-lang language
language of input, or "auto" for autodetection (default "en")
-translate
translate foreign languages

-lang ja を付けることで日本語が日本語として出力されるようになりました :)
しかし， base モデルだといまいちな文字起こし，それ以上のモデルだとcpuが足を引っ張って追いつかない感じです．Whisper.cpp は 4core しか使ってくれないようなのでそれをどうにかするか，NVIDIA GPU を使わないとダメそうです．

いまいちな日本語文字起こし(base model)

環境

$ git remote -v
origin https://github.com/jech/galene-stt (fetch)
origin https://github.com/jech/galene-stt (push)
$ git log -1
commit ae763df9372405a85ed55a52f45f8ea32c74501f (HEAD -> master, origin/master, origin/HEAD)
Author: Juliusz Chroboczek <jch@irif.fr>
Date: Wed Jul 31 18:06:32 2024 +0200

Rename drop-silence to discard-silence.
$ git remote -v
origin https://github.com/ggerganov/whisper.cpp.git (fetch)
origin https://github.com/ggerganov/whisper.cpp.git (push)
$ git log -1
commit 6739eb83c3ca5cf40d24c6fe8442a761a1eb6248 (HEAD -> master, origin/master, origin/HEAD)
Author: Georgi Gerganov <ggerganov@gmail.com>
Date: Sat Jul 27 20:35:04 2024 +0300

whisper : handle empty mel (#2324)
$ dpkg-query -W golang cmake build-essential
build-essential 12.10
cmake 3.30.2-1
golang:amd64 2:1.22~3
$ lsb_release -dr
Description: Debian GNU/Linux trixie/sid
Release: n/a
$ arch
x86_64
$ cpu-info
Packages:
0: Intel Core i7-10510U
Microarchitectures:
4x Sky Lake
Cores:
0: 2 processors (0-1), Intel Sky Lake
1: 2 processors (2-3), Intel Sky Lake
2: 2 processors (4-5), Intel Sky Lake
3: 2 processors (6-7), Intel Sky Lake
Logical processors (System ID):
0 (0): APIC ID 0x00000000
1 (4): APIC ID 0x00000001
2 (1): APIC ID 0x00000002
3 (5): APIC ID 0x00000003
4 (2): APIC ID 0x00000004
5 (6): APIC ID 0x00000005
6 (3): APIC ID 0x00000006
7 (7): APIC ID 0x00000007
$ grep ^MemTotal: /proc/meminfo
MemTotal: 15986772 kB