Faster Whisperを使ったSTTサーバ「Speaches」を試す
元々はFaster Whisper専用のSTTサーバだったのが、TTSがついたりしていろいろ変わったという感じっっぽい。Dockerで動かせそうなので試してみる。
GitHubレポジトリ
[注]
このプロジェクトは以前faster-whisper-server
という名前でした。
プロジェクトが単なる文字起こし以上の機能をサポートするように進化したため、faster-whisper-server
という名前を変更することにしました。Speaches
speaches
は、OpenAI API 互換のサーバーであり、ストリーミング文字起こし、翻訳、音声生成をサポートします。Speech-to-Text には faster-whisper を使用し、Text-to-Speech には piper および Kokoro を使用しています。本プロジェクトは、TTS/STT モデル向けの Ollama を目指しています。Hugging Face Space で試すことができます。
インストール手順や使用方法については、ドキュメントをご覧ください:speaches.ai
特徴:
- GPU および CPU をサポート
- Docker Compose / Docker によるデプロイ可能
- 高度に設定可能
- OpenAI API 互換。OpenAI の API と互換性があるすべてのツールや SDK が
speaches
でも使用可能- ストリーミングサポート(文字起こしは SSE を通じて送信され、音声全体の文字起こしが完了する前に結果を受け取ることが可能)
- ライブ文字起こしのサポート(音声を WebSocket 経由でリアルタイムに送信可能)
- 動的なモデルのロード / アンロード
リクエストで使用したいモデルを指定するだけで自動的にロードされ、一定時間の非アクティブ状態が続くとアンロードされるkokoro
(TTS Arena でランキング 1 位)およびpiper
モデルを使用した Text-to-Speech- 近日公開: 音声生成(chat completions エンドポイント) | OpenAI ドキュメント
- テキストの音声要約を生成(テキスト入力 → 音声出力)
- 録音データの感情分析(音声入力 → テキスト出力)
- モデルを介した非同期の音声対話(音声入力 → 音声出力)
- 近日公開: リアルタイム API | OpenAI ドキュメント
バグを見つけた場合や質問、機能提案がある場合は、issue を作成してください。
ドキュメントはこちら
インストール
docker composeでやってみる。ローカルのMacで。
作業ディレクトリ作成
mkdir speaches && cd speaches
後で使うのでPython仮想環境を作成しておく。自分はmiseを使った。
mise use python@3.12
cat << 'EOS' >> mise.toml
[env]
_.python.venv = { path = ".venv", create = true }
EOS
MacなのでCPUで。docker composeのファイルをダウンロード。
curl --silent --remote-name https://raw.githubusercontent.com/speaches-ai/speaches/master/compose.yaml
curl --silent --remote-name https://raw.githubusercontent.com/speaches-ai/speaches/master/compose.cpu.yaml
export COMPOSE_FILE=compose.cpu.yaml
docker compose up -d
とりま ドキュメントのUsage/Capabilitiesを見ていく。
STT
ドキュメントの順番とは前後するが、なにはともあれSTTから。
サンプル音声として、自分が開催した勉強会のYouTube動画から冒頭5分程度の音声を抜き出したmp3ファイルを与えてみる。
ffprobe sample.mp3
Input #0, mp3, from 'sample.mp3':
Metadata:
encoder : Lavf61.7.100
Duration: 00:04:28.80, start: 0.023021, bitrate: 128 kb/s
Stream #0:0: Audio: mp3 (mp3float), 48000 Hz, stereo, fltp, 128 kb/s
Metadata:
encoder : Lavc61.19
TTS
time curl http://localhost:8000/v1/audio/transcriptions -F "file=@sample.mp3" | jq -r .
{
"text": "はい、じゃあ始めます。ちょっとまだ来られてない方もいらっしゃるんですけど、ボイスランチでP始めます。皆さん、日曜日にお集まりいただきましてありがとうございます。今日は久しぶりにですね、オフラインということで、今日はですね、スペシャルなゲストをお二人来ていただいておりますということで、今日ちょっとトピックにもありますけれども、ボイスローの使用であるレデンリームさんと、あとセルスフォースのカムセジョブダルデザインのディレクターである グレック・ベネスさんに来ていただいてまーす。ということで、日本に来ていただいてありがとうございました。今日はちょっとこのお二人にまた後でいろいろと聞こうというコーナーがありますので、そこでまたいろいろと聞きたいと思います。今日のアジェンダなんですけども、ちょっと時間過ぎちゃいましたが、まず最初にボイスランチJPについてというところと、あと改造のところですね、少しご説明させていただいて、1つ目のセッションで、まず私の方から、ボイスローの2022年の新機能とかですね、その辺の話を少しさせていただいて、その後、2つ目のセッションで、グレデンさんとグレスさんにいろいろカンバセジョブダルデザインについて、何でも聞こうぜみたいなところを予定しております。その後、15時から15時で一旦終了という形でさせていただいて、一応ボイスランチJP確か記念撮影は必須ですよね。なので、それだけさせていただいて、その後、ちょっと1時間ぐらい簡単にお菓子と飲み物を用意してますので、今進会というのをさせていただこうと思っています。で、ボイスランチJPについてですけども、ボイスランチはボイスユアイとかの性関連ですね、そういった技術に実際に携わっている人、もしくは興味がある人、そっちのためのグローバルなコミュニティという形になっていて、ボイスランチの日本リージョンという形がボイスランチJPになっています。で、加工もずっとやってますけど、オンラインをフラインでいろんな音声のデナインだったり、技術だったりというところで情報とかを共有して、みんなで業界盛り上げていこうということでやっております。で、今日のハッシュタグですね、ボイスランチJPでいろいろと自由に付き合わせてください。で、あと会場ですね、今回グラニカ様のご声で利用させていただいてます。ありがとうございます。で、ぜひこちらもシェアをお願いしたいですと、で、今日と配信のところもいろいろとやっていただいてます。非常に感謝しております。で、ちょっと今ごめんなさい。今、コロナで会場に来られる方とかもあまりいらないということでされてないんですけれども、通常はなんかこうでIOT機器のガジェットとかを展示されているようなので、そういったものがあるとき、今度ですね、また体験してみていただければなと思っています。というところで、あとすいません、トイレがこちら。で、あとサバコスワゼルカとはこちらのところになってますので、よろしくお願いします。はい、ということで最初の挨拶はこれで。じゃあまず私の方のセッションからさせていただきます。というところで、ボイスローアップデート2022というところで、今年の新規のエジティスコーティをお話しします。事故紹介です。清水と申します。工部でインフラのエンジニアをやってますので、普段はクバネテストとかエダベストとかテラホンとかをいじってまして、最近ちょっとフリーランスになります。で、ちょっと調べてみたらボイスローを一番最初に始めたのが2019年の朝もぐらいなんで、だいたい4年弱くらいですね。いろいろと触ってまして。あと、音声関連のコミュニティーのところでは、ボイスランチJP、今回以外にAjag、Amazon、AleXa、Japan User Groupとか、あとボイスローの日本語ユーザーグループということでVFJUGというのをやっています。はい、日本語コミュニティーの方はフェイストリックの方でやってますので、ご視聴よろしければ見ていただければなと思います。あと2年ぐらい前に、技術書店の方で、ここにスタッフで来ていただいて、皆さんと一緒に同人室クローゼということで作ったんですけれども、もうこれ2年ぐらいだって中身がだいぶ古くなってしまっているので、既に売り終了しております。今日、ちょっと持ってきたかったんですけど、それは忘れてしまいました。はい、なんでこういうこともやっています。"
}
real 1m15.958s
user 0m0.015s
sys 0m0.033s
ログ見てるとSystran/faster-whisper-small
が使用されていた。
ではOpenAI互換だということでOpenAI SDKでやってみる。
pip install openai
pip freeze | grep -i openai
openai==1.61.0
from openai import OpenAI
client = OpenAI(
api_key="dummy",
base_url="http://localhost:8000/v1",
)
audio_file = open("sample.mp3", "rb")
transcript = client.audio.transcriptions.create(
model="Systran/faster-whisper-small",
file=audio_file
)
print(transcript.text)
python tts_openai_sdk.py
はい、じゃあ始めます。ちょっとまだ来られてない方もいらっしゃるんですけど、ボイスランチでP始めます。皆さん、日曜日にお集まりいただきましてありがとうございます。今日は久しぶりにですね、オフラインということで、今日はですね、スペシャルなゲストをお二人来ていただいておりますということで、今日ちょっとトピックにもありますけれども、ボイスローの使用であるレデンリームさんと、あとセルスフォースのカムセジョブダルデザインのディレクターである グレック・ベネスさんに来ていただいてまーす。ということで、日本に来ていただいてありがとうございました。今日はちょっとこのお二人にまた後でいろいろと聞こうというコーナーがありますので、そこでまたいろいろと聞きたいと思います。今日のアジェンダなんですけども、ちょっと時間過ぎちゃいましたが、まず最初にボイスランチJPについてというところと、あと改造のところですね、少しご説明させていただいて、1つ目のセッションで、まず私の方から、ボイスローの2022年の新機能とかですね、その辺の話を少しさせていただいて、その後、2つ目のセッションで、グレデンさんとグレスさんにいろいろカンバセジョブダルデザインについて、何でも聞こうぜみたいなところを予定しております。その後、15時から15時で一旦終了という形でさせていただいて、一応ボイスランチJP確か記念撮影は必須ですよね。なので、それだけさせていただいて、その後、ちょっと1時間ぐらい簡単にお菓子と飲み物を用意してますので、今進会というのをさせていただこうと思っています。で、ボイスランチJPについてですけども、ボイスランチはボイスユアイとかの性関連ですね、そういった技術に実際に携わっている人、もしくは興味がある人、そっちのためのグローバルなコミュニティという形になっていて、ボイスランチの日本リージョンという形がボイスランチJPになっています。で、加工もずっとやってますけど、オンラインをフラインでいろんな音声のデナインだったり、技術だったりというところで情報とかを共有して、みんなで業界盛り上げていこうということでやっております。で、今日のハッシュタグですね、ボイスランチJPでいろいろと自由に付き合わせてください。で、あと会場ですね、今回グラニカ様のご声で利用させていただいてます。ありがとうございます。で、ぜひこちらもシェアをお願いしたいですと、で、今日と配信のところもいろいろとやっていただいてます。非常に感謝しております。で、ちょっと今ごめんなさい。今、コロナで会場に来られる方とかもあまりいらないということでされてないんですけれども、通常はなんかこうでIOT機器のガジェットとかを展示されているようなので、そういったものがあるとき、今度ですね、また体験してみていただければなと思っています。というところで、あとすいません、トイレがこちら。で、あとサバコスワゼルカとはこちらのところになってますので、よろしくお願いします。はい、ということで最初の挨拶はこれで。じゃあまず私の方のセッションからさせていただきます。というところで、ボイスローアップデート2022というところで、今年の新規のエジティスコーティをお話しします。事故紹介です。清水と申します。工部でインフラのエンジニアをやってますので、普段はクバネテストとかエダベストとかテラホンとかをいじってまして、最近ちょっとフリーランスになります。で、ちょっと調べてみたらボイスローを一番最初に始めたのが2019年の朝もぐらいなんで、だいたい4年弱くらいですね。いろいろと触ってまして。あと、音声関連のコミュニティーのところでは、ボイスランチJP、今回以外にAjag、Amazon、AleXa、Japan User Groupとか、あとボイスローの日本語ユーザーグループということでVFJUGというのをやっています。はい、日本語コミュニティーの方はフェイストリックの方でやってますので、ご視聴よろしければ見ていただければなと思います。あと2年ぐらい前に、技術書店の方で、ここにスタッフで来ていただいて、皆さんと一緒に同人室クローゼということで作ったんですけれども、もうこれ2年ぐらいだって中身がだいぶ古くなってしまっているので、既に売り終了しております。今日、ちょっと持ってきたかったんですけど、それは忘れてしまいました。はい、なんでこういうこともやっています。
モデル名は以下のように取得できる。自分は日本語に対応したモデルだけを抽出した。
curl localhost:8000/v1/models | jq -r '.data[] | select(.language | index("ja")) | .id'
Systran/faster-whisper-base
Systran/faster-whisper-large-v2
Systran/faster-whisper-large-v3
Systran/faster-whisper-small
Systran/faster-whisper-tiny
Systran/faster-whisper-medium
deepdml/faster-whisper-large-v3-turbo-ct2
guillaumekln/faster-whisper-large-v2
guillaumekln/faster-whisper-base
guillaumekln/faster-whisper-medium
Systran/faster-whisper-large-v1
guillaumekln/faster-whisper-small
guillaumekln/faster-whisper-tiny
kotoba-tech/kotoba-whisper-v2.0-faster
mort666/faster-whisper-large-v2-th
aTrain-core/faster-whisper-large-v3
guillaumekln/faster-whisper-large-v1
jkawamoto/whisper-tiny-ct2
aTrain-core/faster-whisper-large-v3-turbo
kotoba-tech/kotoba-whisper-v1.0-faster
flyingleafe/faster-whisper-large-v3
aTrain-core/faster-distil-whisper-large-v2
Infomaniak-AI/faster-whisper-large-v3-turbo
JhonVanced/faster-whisper-large-v3-ja
arc-r/faster-whisper-large-v2-mix-jp
JhonVanced/whisper-large-v3-japanese-4k-steps-ct2
jootanehorror/faster-whisper-large-v3-turbo-ct2
kotoba-tech/kotoba-whisper-bilingual-v1.0-faster
Zoont/faster-whisper-large-v3-turbo-int8-ct2
ilyakam/faster-whisper-large-v3-turbo
JhonVanced/sin2piusc-whisper-large-v2-10k-ct2-int8_float32
jvh/whisper-large-v3-quant-ct2
avans06/faster-whisper-large-v3
jvh/whisper-medium-quant-ct2
JhonVanced/sin2piusc-whisper-large-v2-10k-ct2
srd4/faster-whisper-large-v2
srd4/faster-whisper-medium
arc-r/faster-whisper-large-v2-jp
arminhaberl/faster-whisper-tiny
arminhaberl/faster-whisper-large-v2
jvh/whisper-large-v2-quant-ct2
ubunto/audio
arminhaberl/faster-whisper-large-v1
firelily/quick-listing
jkawamoto/whisper-large-v3-ct2
bababababooey/faster-whisper-large-v3
Ruben9999/whp
gongting/faster-whisper-large-v2
arminhaberl/faster-whisper-medium
arminhaberl/faster-whisper-base
trungkienbkhn/faster-whisper-large-v3
lukas-jkl/faster-whisper-large-v3-turbo
arminhaberl/faster-whisper-small
lorneluo/whisper-small-ct2-int8
BBLL3456/faster-whisper-large-V3
JhonVanced/faster-whisper-large-v3
lukas-jkl/faster-whisper-v3
deepsync/whisper-large-v2-custom-hi
JhonVanced/faster-whisper-large-v2
jvh/whisper-base-quant-ct2
Conner/docuvet-large-whisper
lorneluo/faster-whisper-large-v2
good-tape/faster-whisper-large-v3
mukowaty/faster-whisper-int8
srivatsavdamaraju/api
httpxだとこう
import httpx
with open('sample.mp3', 'rb') as f:
files = {'file': ('sample.mp3', f)}
data = {'model': 'Systran/faster-whisper-tiny'}
with httpx.Client() as client:
response = client.post(
'http://localhost:8000/v1/audio/transcriptions',
files=files,
data=data,
timeout=60.0
)
print(response.text)
CPUだと流石に遅いので、GPU(RTX4090)で動かしてみた。
ドキュメントに記載のdocker-composeのファイルだとGPUを全然使ってくれないので、普通にdockerコマンドで立ち上げた。
docker run \
--rm \
--detach \
--publish 8000:8000 \
--name speaches \
--volume hf-hub-cache:/home/ubuntu/.cache/huggingface/hub \
--gpus=all \
ghcr.io/speaches-ai/speaches:latest-cuda
time curl http://localhost:8000/v1/audio/transcriptions -F "file=@sample.mp3" > /dev/null
初回はモデルのダウンロードがあるので2回目以降の結果。ログを見てるとSystran/faster-whisper-large-v3
っぽい。やっぱ速いね。
real 0m11.185s
user 0m0.005s
sys 0m0.017s
それはそれとして、モデル名を指定しない場合のデフォルトがどれなのかからないなー、と思ってコード見てたら、コード的にはSystran/faster-whisper-small
っぽい。
んだけども、使用するDockerfileもしくはdocker composeファイルで書き換えてるんだな。
あと一定時間立つとモデルがアンロードされる
2025-02-04 11:35:33,120:INFO:speaches.model_manager:unload:58:Model Systran/faster-whisper-tiny unloaded
2025-02-04 11:36:00,906:INFO:speaches.model_manager:unload:58:Model Systran/faster-whisper-large-v3 unloaded
この設定っぽい
TTS
speachesはkokoroとpiperに対応しているのだが、
- kokoroは以前の古いバージョンのファイルを取得している、つまり日本語に対応していない(日本語対応はv1.0からと自分は認識している)
- piperが、というか、piperが使用している音素変換ライブラリであるpiper-phonemizeがどうやらARMに対応していないのでApple Siliconだと動かなさそう。
ということでどうもこのままでは使えなさそう。
kokoroを使う場合の手順は結構生々しくファイルを持ってきているだけっぽくて、また、kokoro v1.0のONNX版を公開してくれているレポジトリがあるので、そこから持ってきてなんとかできないかなと思ったのだけど、どうやら古いバージョンに絡んでハードコードされてるので色々直さないと無理そう・・・
リアルタイム文字起こし(WebSockets使用)
WebSocketsを使用したリアルタイム文字起こしにも対応している。ただドキュメントにもあまり詳しくは載っていない。
これを使うらしい。
WebSocket用のコマンドラインクライアントで、ws://用のnetcat(またはcurl)のような、高度なsocatのような機能を備えています。
マイクで取得したオーディオをパイプでwebsocatからspeachesに流すという感じっぽい。
MacだとHomebrewでインストールできる。あわせてpvもいれてパイプを流れるデータの量を調節できるようにしておく。
brew install websocat pv
マイクのデバイス番号を取得する。以下はMacの場合。LinuxやWindowsの場合はまたやり方が異なるみたい。
ffmpeg -f avfoundation -list_devices true -i ""
[AVFoundation indev @ 0x144605390] AVFoundation audio devices:
[AVFoundation indev @ 0x144605390] [0] XXXXX
[AVFoundation indev @ 0x144605390] [1] XXXXX
[AVFoundation indev @ 0x134f047b0] [2]XXXXX
[AVFoundation indev @ 0x144605390] [3] XXXXX
[AVFoundation indev @ 0x144605390] [4] XXXXX
[AVFoundation indev @ 0x144605390] [5] XXXXX
自分の場合は上記のスピーカーフォンをマイクとして使う。 -i ":n"
みたいな感じで番号を指定すればよいみたいなのだが、
ffmpeg -loglevel quiet -f avfoundation -i ":0" -ac 1 -ar 16000 -f s16le - | pv -qL 32000 | websocat --binary --no-close ws://localhost:8000/v1/audio/transcriptions?language=ja
- ずっと喋っていないと切断されてしまう。
- ずっと喋っていてもある程度すると切断されてしまう。
って感じで、できることはできるんだけど、実用には程遠い感だった。
ざっと試してみた感じだと、バッチ処理用APIにはいいけど、というところ。まあモデルのロード時間も都度都度だと無視できないようなケースもあるかなとは思うので、そういう意味ではAPIに鳴っていることは意味がある。
ただ、TTSは現時点では正直おまけで日本語も使えないし、リアルタイム文字起こしもまともに動くって感じには遠いかなぁ。
リアルタイム文字起こしは以前ためした以下はきちんと動作していたと思う。ただCLIでの利用にはなる。
リアルタイム文字起こしの結果がストリームで返ってくるようなWhisperサーバが欲しい・・・
Hello. Please note that I made ilyakam/faster-whisper-large-v3-turbo
private. Consider using mobiuslabsgmbh/faster-whisper-large-v3-turbo
instead. I did not test it.
こんにちは。ilyakam/faster-whisper-large-v3-turbo
を非公開にしました。代わりに mobiuslabsgmbh/faster-whisper-large-v3-turbo
の使用を検討してください。テストはしていません。
Thank you! will try'