リアルタイムAI音声チャット、応答速度500ms!
引用元:https://news.ycombinator.com/item?id=43899028
RealtimeVoiceChatは音声AI遅延にうんざりして作ったOSS。
ローカルLLMとリアルタイム会話目的で500ms応答実現。
良いCUDA GPU必要。
動画→https://www.youtube.com/watch?v=HM_IQuuuPX8
コード→https://github.com/KoljaB/RealtimeVoiceChat
すごくクールだね、シェアありがとう!
いくつか質問させて。
・wake wordエンジンについて考えた? 常時聞きっぱなしじゃなく、特定の言葉で起動するやつね。オープンなソリューションだと良さそうなのがないみたいだけど。
・4090とか持ってない人向けに、(プライバシーやサービス料は気にせず)STT/TTSを外部サービスでできるようにする計画はある?
現時点で最高のSpeech-to-Textライブラリを使ってるって言って良いかな?
この分野は動きが速い気がして、前に調べた時はwhisper-cppが一番だって思ってたんだよね。
正直どうかなぁ。
Whisperはctranslate2実装のfaster_whisperが出てから長いことトップだったよね。
今日nvidiaがParakeet TDTをオープンソースにして、オープンASRリーダーボードでいきなり1位になったよ。
これらの最新モデルは強力そうで、これから評価しないとね。
コードで使ってる“Coqui XTTS Lasinya”モデルについて詳しく教えて。
これは何で、どうやって訓練・ファインチューニングされたの?
あなたがHugging Faceにアップロードしたんだと思うけど、モデルカードとかREADMEがないよね。
https://huggingface.co/KoljaB/XTTS_Models
このファイルで参照されてるモデルのことだよ。
https://github.com/KoljaB/RealtimeVoiceChat/blob/main/code/a…
wake wordは一時的だよ。
Star Trekみたいにするには、いつも聞いてる必要があるんだ。
部屋にいる別の人みたいに、会話に注意して、呼びかけられたら反応するイメージかな。
コンテキスト無視のwake wordじゃなく、軽量ローカルLLMで呼びかけを聞き取るべきだと思う。
これ素晴らしいね!
どんなハードウェアで使ってるの、あるいはテストしたことある?
https://yummy-fir-7a4.notion.site/dia
これが最近アツいらしいよ。
今のところ、僕の4090でしかテストしてないんだ。
それ試してみた。
品質は良いんだけど、時々生成に失敗するし、結構遅いんだよね。
あとVRAMが13GBくらい必要だから、音声エージェントとしては個人的に第一候補じゃないかな。
プライバシーとリソースの理由でそれが欲しいな。これを小さいハードウェアデバイスとして持っても,大して遅延は増えないはずだよ。
よし,ちょっとバカな質問なんだけどさ(1)これって多分複数の言語に対応してるんだよね?(2)(1)がそうなら,使わない言語を全部削っちゃえば速くなるの?
うん,この”Lasinya”って声,なんかささやき声みたいでマジで嫌だな。エロい電話サービスみたいに聞こえるんだよ。他の声の選択肢ってあるのかな?
公開されてる coqui のモデルリスト https://github.com/coqui-ai/STT-models/releases に Lasinya って名前すら見当たらないし,他のモデル名のリストも見つからないんだよね。
python モジュールで kokoro を選ぼうとしたんだけど,ログに coqui しか利用できないって出てきたんだ。でもさ,coqui のモデル自体はすごく良い音質だと思うよ,ただ声のタイプが気に入らないだけなんだ。
デフォルトのプロンプトも”彼女”っぽすぎたんだけど,それは簡単に直せたよ。でも声に関しては,このエンジンで他にどんな選択肢があるのか全然わからないんだ。
PS:デフォルトの声の批判,許してね。でもこれの応答性にはマジで感動してる。ホントに速く返事してくれるんだ。これを作ってくれてありがとう!
全部ローカルモデルなの? それともクラウド推論も使ってる? 独自モデルかな?
どのモデルがどこで動いてるの?
cool なツールだね!
うん,あの声が好みが分かれるのは知ってるよ。あれは自分用に学習させたやつだから,公式リリースじゃないんだ。
ここで声を変えられるよ:https://github.com/KoljaB/RealtimeVoiceChat/blob/main/code/a…
アプリコンテナの中にサブフォルダを作って:./models/some_folder_name
使いたい声のファイルをそのフォルダにコピーして:config.json,model.pth,vocab.json それと speakers_xtts.pth (speakers_xtts.pth は Lasinya のをコピーして大丈夫だよ,どの声でも同じだから)
そしたら audio_module.py の specific_model=”Lasinya” って行を specific_model=”some_folder_name” に変えてね。
server.py で TTS_START_ENGINE を ”kokoro” に変更したら動くはずなんだけど,その時どうなるの? ログメッセージを貼ってもらえる?
うん,するよ。Malwareとかbugsとか起こり得るでしょ。
それに,ゲスト全員のために無効にしたくないってこともあるかもしれないしね。
ウェイクワードを使って有料 API をエージェント的に呼び出す,常に聞き耳を立ててる超軽量 LLM エージェントで改造するとか?
いいね! 自分はもう 7900 xtx で openwebui/ollama を使ってるんだけど,STT と TTS の部分はまだ動かないみたいなんだ。
ログ:
2025-05-05 20:53:15,808] [WARNING] [real_accelerator.py:194:get_accelerator] Setting accelerator to CPU. If you have GPU or other accelerator, we were unable to detect it.
Error loading model for checkpoint ./models/Lasinya: This op had not been implemented on CPU backend.
ああ,実際良い質問だよ。
多分無理だと思うな。モデルの重みから何かを簡単に”忘れる”ことはできないし(それだけじゃダメだけど)。単一言語でモデルをめちゃくちゃ再学習/ファインチューニングすることはできるけど,それだけじゃ推論は速くならないんだ。
速度を出すには,パラメータ数を減らして,単一言語だけでゼロからモデルを学習させる必要があるだろうね。それはうまくいくかもしれないけど,音声合成で他の問題を引き起こす可能性もかなり高いんだ。
理想的な世界では,モデルは他の言語で使ってない”空いたパラメータ”全部を,学習した単一言語の合成を良くするためだけに使うんだけどね。ある程度はそうかもしれないけど,AIのパラメータスケーリングってそういう風に正確には動かないんだよ。
ローカルモデル構成はね、VADはWebrtcvadとSileroVAD、音声認識はbase.en whisper、ターン検出はKoljaB/SentenceFinishedClassification、LLMはbartowski/huihui-ai_Mistral-Small-24B-Instruct-2501-abliterated-GGUF:Q4_K_Mで切り替え可、TTSはCoqui XTTSv2でKokoroやOrpheusにも切り替えられるって感じだよ。Orpheusはちょっと遅いんだ。
これすごくいいね!絶対見てみるよ。
fastRTCってHugging Faceの試した?
このシステムとfastRTCとpipecatでどれくらい速度違うか気になってさ。まだ自分で試してないんだ。
open wake wordも使えるんじゃない?
Home Assistantが自分の音声アシスタント用に開発したものだよ。
これ本当にいいね、全部一緒にまとめててすごいよ。
早くSesame [1]のオープンウェイト版が出るといいなー。
これ出たら君のアプリのキラー機能になるはずだから、要チェックだよ。
[1] https://www.sesame.com/
ありがとう!あの声カスタムだったんだね。
Coquiの他のすぐ使える音声とかどこで見れるの?
デモページだと声クローンするみたいに見えるけど、リストがないんだ。
Kokoroに切り替えたら動いたんだけど、Coquiよりあんまり良くないな。
Openwebuiでもそうだった。
速いけど変な発音がある。
英語とスペイン語みたいなバイリンガルTTSがあると最高だね、Coquiならできるかも。
これ動かすのにGPUの最小VRAMどれくらいいる?
GitHubにそれ見当たらなかったんだ。
pipecatって見た?
あれも似たような感じで、標準化されたバックエンドとかwebrtcのターン検出パイプラインやろうとしてるみたいだよ。
各ステップにどれくらい時間かかるか情報ある?
各ステップで何msかかるかとか。
これMacで動かしたらどれくらい速いか気になるんだけど。
だいたいの予想とかある?
うん、テストしてみたよ。彼らがそこで何作ったのかよく分かんないけど、raw websockets使うより明らかにレイテンシ増えるね。ホントはそうじゃないはずなのに、僕のテストではそうなったんだ。
(openaiとかGoogle voice chatのユーザーとして言うけどさ)。確かに速いんだけど、自然な間を取りながら話せないんだよね。僕らって考える時とか、色々理由があって長短ポーズを取るじゃん。でもこれらツールだと、止まった瞬間にAIが喋り始めちゃう。テキストでも音声でもね。前にTwitterでデモ見たんだけど、AIが相手が話し終わるまで待ってたんだ。ポーズの長さも平気。あれがどれくらい難しいか分かんないけど、たぶん別のAIが分析して判断してるんだろうね。
思うに、それって人間にとっても面白い問題だよね。すごく主観的。例えば、長くて考え込むようなポーズだらけのセラピー想像してみて。セラピーって割り込まず話させてくれるもんだけど、そこにはたくさんの裏の意味とかニュアンスがある。友達との興奮したおしゃべりと比べてみてよ。AIには見えないボディランゲージもいっぱいあるしね。少なくとも今は。
もっとコメントを表示(1)
これ、100%同意!うん!考えまとめてる時、LLMに返信始められたくないから、『うーん…』とか声出して繋いじゃってる自分に気づいたよ。これ、マジで難しい問題。ユーザーが『そうだね!』とか『はい』とか、相槌打っただけで止まらないようにする、でも割り込みはOKって問題と似てる。MacWhisper(これだけじゃないけど)のいいとこは、ホールドして話せるとこ。だから好きなだけ止めて、また始めても、終わりと判断されないんだ。
最近、この論文[^1]で『uh』と『um』の違いを知ったよ。
> この論文によると、話し手は『uh』や『um』でこれから短い(uh)か長い(um)ポーズが入ることを予告してるんだって。これで単語探してる、次何言うか考えてる、まだ話したい、もう終わり、とか示唆できるらしい。データ分析の結果、ポーズの必要をチェックして、どこで、どう止まるか、どっち言うか決めてるんだって。普通の単語みたいに計画して話してるって。
[1]: https://www.sciencedirect.com/science/article/abs/pii/S00100…
誰かと会話中、ずーっと”ズレてる”時、ホント嫌だね。オシロスコープのサイン波が微妙に位相がズレてるの想像しちゃう。快適に戻すには、ほぼハードリセットいるね—部屋出るとか、かけ直すとか。まあ、世の中にはただ世界とズレてる人もいるけどね。
なんかさ、中断されないように、話し方悪くするように訓練されてるわけだ。文学の先生が授業でフィラーワード避けるべきで、代わりに黙って考える時間取れって言ってたの覚えてるよ。まあ、公平に言えば、現実世界でも割り込まれないように長いフィラーワード使う人結構いるけど、あれ聞いててイライラするんだよね。
LLMと音声処理を重ねて、単なる一時停止とか文末じゃなくて、意味的に重要な切り替わりを見つけて、自然に割り込む必要あるんだろうね。
> 自然に話せない
電話だってそうじゃん。往復のレイテンシ簡単に300msになるけど、みんなそれに慣れるように話し方学んだんだ。ホント贅沢したいなら、古いアナログのPTSN回線探してみて。ノイズも遅延もない。美しくてシームレスな50msのレイテンシ。デジタル化は通話品質にとって最悪だったよ。
それ、マジで似た問題なんだよね。丁寧な人間がお互いに話し始める前に耐えられるラウンドトリップの最大遅延は、ベル電話システムの起源からしっかり研究されてる。俺の記憶だと、300ms以下がマジでいい感じ。AIはローカルで動かしても処理遅延あるし。電話だと遅延は光速に左右される感じだけど、人間が対話する会話への影響は同じだよ。
もしかして、銅線の電話網を使ったことなくて、デジタルか携帯網しか使ったことないから?
POTSはエンドツーエンドなら魔法みたいだったよ。もうないと思うけどね。俺が最後に銅線から銅線へのPOTS通話をしたのは2015年だもん! AT&Tはそのアナログ回線に月額40ドル近くも課金してたから解約したんだ。俺のVoIP回線は長距離も国際電話もできて(POTSにはなかった)月額20ドルだよ。しかも、自分でコントロールしてるPBXを経由してるんだ。
これはターン検出って呼ばれてて、最近これを解決するための素晴らしいツールがいくつか出てきてるよ。(あるユーザーがLivekitのターン検出モデルに言及してたね)。1年もすれば劇的に改善すると思う。
ターン検出モデルが小さかったら、エッジで実行して10~50msくらいの「黙れ」レイテンシにできるのかな? それは良いね。
ハハ - これ、AIじゃない音声アシスタント、例えばAlexaでもこの問題あるわ。
”ヘイ Alexa、ライトを…”って、気分を決めようと一瞬考える間に
”その設定にはできません”
”…青に…ちくしょう。”
うん、俺が見たデモはこれだったね:https://x.com/livekit/status/1870194686532694417
でも「音声検出 一時停止あり」で検索したら、新しい候補が結構あるみたいだよ!
https://x.com/kwindla/status/1897711929617154148
これも面白いアプローチだね https://x.com/zan2434/status/1753660774541849020
たぶん、何らかの理由で一時停止してるけど数秒で dictating(喋り続ける)つもりだ、っていうのを正式に示す特別な音とか言葉を決めるべきかもね。「うーん、待って」みたいに。
代替案として、2つの入力ストリームを使うハックっぽい解決策は良いかもね。1つは全部拾って、2つ目は「うーん、あー、待って、いややっぱ、それなしで」みたいなフィラーワードを探すんだ。2つ目のストリームはVeto-command(却下コマンド)としてLLMをカットオフできる。3つ目の入力ストリームは単に長い一時停止を探すようにできるね。これ全部、あっという間にリソース食いになるけど。これ作ろうと思ってたんだけどまだ作ってないから、自分を罰してアイデアを公開するわ。これで学ぶことを願ってる。
別の方法としては、ラジオみたいに、あの決まりに従うってのはどうかな。
”heredoc”の音声版が必要だね。
”AIさん、どうぞ”、”人間さん、どうぞ”だってさ :)
あれ、待てよ:”リストをどうやって繰り返し処理すんのー”、”繰り返し処理は…なプロセスだよ…” :p
”どうぞ”って何度も言ってる間に、Shakmaを再現できそうじゃん。
シンプルな指示じゃダメなの?AIに、準備ができたと思うまで特別な待機トークンだけで応答させるようにさ。完璧にはいかないかもだけど、とっかかりにはなるでしょ。
ポーズは最初の指標としてはいいけど、ポーズがあった時に、そこまで話された内容をモデルに食わせて、割り込むべきかもうちょっと待つべきか判断させるべきだね。
正直、これってオーバーエンジニアリングの問題だと思うわ。単にユーザーが話したい時にボタンを押して、話し終わったら押すだけで十分だよ。開始と終了の合言葉でもいいし。
まだ本物の人間と話してるみたいに感じる必要はないんだからさ。
理想は、マイクボタン付きの小さい”スティックリモコン”だね。
ボタンを押してる間だけAIが聞いてくれるし、そのデバイスは24時間年中無休で持ち歩けるくらい効率的だといいな。
それか、AIにAsianなまりをつけたらどう?違う大陸の人と電話で話すときは遅延を受け入れるでしょ。だからこれもそうすれば?
そうそう、何か勉強してるときの質問なんか、途中でポーズすることあるじゃん。今の製品はどれも割り込んできて邪魔なんだよ。良い人間は顔色とか見て待ってくれるのに。AIにtaco stand聞くのと、複雑な話をするのは全然違うんだよ。
これってめっちゃ大きな問題だよ。だいたい”turn taking”って呼ばれてるやつね。
こういうの見るたびマジワクワクするけど、いざPCで動かそうとするとPythonと格闘してすぐ諦めちゃうんだ。今日はPythonバージョンが3.12じゃなく「3.12未満かつ3.9以上」が必要で、3.11入れてもダメ。OPみたいなすごい成果が、こういう面倒で使われにくいのは残念。「Docker使えよ」って言うけどWindowsで試したことある?俺がWindows開発しない理由だよ。JVMやNodeじゃこんな問題無かったな。
仮想環境(virtual environments)の素敵な世界を紹介しよう!特にWindowsで、フルインストールで動かす面倒なことから解放してくれるよ。俺はminicondaが好きだけど、venvでも全然OKさ。
uvが最適解だよ。https://docs.astral.sh/uv/
悲しいけど、LLM界隈の人たちって自分のソフトをちゃんとパッケージングするの苦手みたいだね(もしかしてわざと?)。
LLM界隈の人たちが〜ってのは、Pythonの副作用みたいなもんだね。依存関係と戦ってない人が作ったPythonプロジェクトはこうなりがち。でもuvが最高ってのは同意だよ。俺もガチPythonプログラマーじゃないけどML系のプロジェクトで使ってる。condaとか色々試したけど、uvは超重要ポイント押さえてるんだ。Pythonバージョン変えられるしvenv管理も楽。依存関係の悩み減るよ。コマンド例は長いから省略するね!
もっとコメントを表示(2)
venvを使った仮想環境だけじゃ、他のツールと組み合わせないとPythonのバージョン問題は解決しないんだぜ。
requirements.txtからpyproject.tomlへ移行する流れがあるよ。「uv add」とか「uv install」みたいなコマンドを使うと、依存関係の初期設定とか管理の面倒がかなり減るんだ。
ありがとう。言ったように、俺はそんなにPythonプログラマーじゃないから、そういうトレンド追ってないんだよね…requirements.txt使う理由考えたけど、普通の依存関係入れるだけなら良い答え出てこなかったんだ。 personally requirements.txtで困ったことないから、pyproject.tomlが何を解決してくれるのか分かんない。なんか問題ぶつかったら変えるかなーって感じ。
知らない技術やツール、使い慣れないOSでML関係のプロジェクト動かすのにどれくらい時間かかるか知ってる?だいたい1〜2時間、下手したらもっとだよ。
ああいう批判ってマジこじつけで手抜きすぎ。「知らない言語コンパイルして、使ったことないツール使って、慣れないOSで…」って?
君の文章をコピペして、WindowsをMacに変えて、homebrewに文句言うとかに置き換えても通用するんだ。それはエコシステムとかOSとかツールとか開発者としての君自身について何も言ってないし、コメントとして役に立つか?微妙だね。
セキュリティのためにも、こういうのは全部sandboxの中でやった方が良いんじゃないかな。
uvってcudaとうまく動く?
俺はできるだけnix-shellで開発環境全部指定してるんだけど、venvとかcudaとは相性悪いことが多い。nix flakeでcuda環境固定できたの一度だけだけどすぐ壊れてvenvに戻ったよ。
pip、pyenv、poetry、conda、mambaとか色々使ったけど、変なエッジケースがマジで多いんだ。PythonかNodeか分かんなくなる /snark
「最終兵器」みたいなツールが出たら喜んで使うけど、みんなそう謳ってたんだよね。
んでさあ、これってだいたい25%くらいの時しか動かないんだよね。他の時はrequirements.txtとかのよく分かんないエラーが出て、結局ググっても別のプロジェクトのGitHubリポジトリで未解決になってるissue見つけるだけなんだ。誰かPythonの依存関係地獄だけ解決してくれるLLMエージェント作ってくんないかなあ。
”Pythonの依存関係地獄だけ解決してくれるLLMエージェント作ってくんないかなあ。”
ほら、だからGPT 5がずっと遅れてるんだよ。
俺もcondaとかmamba使ってて速いんだけど、システムレベルのパッケージが必要な時もあるんだよね。この前TRELLISをWindowsで動かそうとして諦めたわ。あと、新しいリポジトリ動かすのにvenv作ると、CUDAとかPyTorchでディスク容量めっちゃ食われるんだよ。すぐ何百GBになっちゃう。
愚痴ってごめんね、Pythonのパッケージ管理の話になるとさあ…
たぶんみんな、信頼できないサードパーティライブラリとかはなんか隔離された環境で動かしてるよね?ハッキングされたいって言うなら別だけどさあ。基本的なセキュリティ理解はあるって前提にしないと、話めっちゃ長くなるしね^^
この件だとuv
がマジ最高だよ。超速いし、condaみたいにグローバルツールとしてめっちゃいい感じに動くし、複数のPythonバージョンをダウンロードして管理したり、どの仮想環境でどのバージョン使うかってのもやってくれるんだ。
仮想環境っていいけど、単独だと微妙なんだよね。requirements.txtも使えるけど、依存が多いとメンテがマジ大変。
Astral uvとかpoetryはpyproject.tomlをメンテして仮想環境も管理してくれるんだ。
だから初心者でもuv sync
とかpoetry install
って打てば仮想環境知らなくても大丈夫だし、root権限もいらないし、依存の競合も気にしなくていいよ。簡単なコマンドで使えるんだ。
分かった。でもさあ、GPUをサンドボックスの中で動かすのも結構難しいステップになりうるんだよね。きっとほとんどの人は諦めてサンドボックス無しでコマンド実行してると思うよ。
だから、そのやり方の手順も記事に含めた方がいいかもね。
ハハ、なるほどねー。もしあのPythonの状況(依存関係地獄)を解決できるんなら、もうAGIって呼んじゃっていいレベルだと思うわ。
GP(元投稿者)の問題はさあ、(どうやら)適切なPythonバージョンを選択できないことじゃなくて、インストールできないことだったみたいだよ。
uvみたいなの使うと(リンク先見てね)、そうなると思うよ。でもさ、ただpython -m venv .venv
ってやると、作った時のpythonのバージョンになるんだよね。OSesによってはpython3.8
とかpython3.9
みたいなバイナリがあるから、python3.8 -m venv .venv
ってやれば特定のバージョンに固定できるけど、ちょっと面倒だよね。
このスレッドについてのメタなコメントだけどさ、”これ使え””あれ使え”みたいなコメント多すぎじゃない?なんかトップのコメントの言いたいこと証明してる感じだよね。pythonライブラリ入れる時も同じこと思うわ。依存関係管理する方法いっぱいありすぎて、もっと標準化されてたらなってマジで思うよ。
pyproject.tomlには良い点がいくつかあるよ!まず依存関係を細かくグループ分けできる(開発用とかね)。プロジェクトのメタデータやツール設定(ruffとかblackとか)も一箇所にまとめられるし、フォーマットが標準化されてるから他のツールとも連携しやすいんだ。requirements.txtより便利になったよ。
condaとかuvはpythonのバージョン管理もしてくれるから魅力的だよね。特に公式のOSチャンネルだと一つのバージョンしか提供してなくて、いろんなバージョンのpython入れるのが簡単じゃないシステムには助かる。少なくともmacosではbrewが最近のバージョンをいくつか同時にインストールできるけどね。
uvがこの問題を解決してくれるよ。uv venv python3.11
これで完了さ。
俺はnix-shell使うことが多いけど、相手がNix分からなそうな時はuv使うよ。cudaとも問題なく動くみたい。個人的にはトラブルないね。最近動画分類のtransformerモデル作った時も、uvで管理してpytorchもvenvに入れたけど全然大丈夫だったよ。
UVってさ、結局venv使ってるんだよ。
python開発者じゃない俺みたいなのが、たまにpythonプロジェクト動かす時、venvの使い方毎回調べるのが超面倒!pathにスクリプト入れて.venv
に自動でvenv作ってactivateするようにしたよ。pipにBundlerみたいな機能が最初からあれば最高なのにね。
全く同じ経験だよ。ほんと、パッケージ本体はハッシュで中央に保存して、venvsからはそこにリンクするだけにするべきだよね。
Condaならできるよ!例えば、conda create -n myenv python=3.9
って感じでね。