NIGHTWAVEとはどんなアプリか
今回のテーマは、HuggingFaceのハッカソン「Build Small Hackathon」に出品されたアプリ「NIGHTWAVE」の日本語実装です。
NIGHTWAVEは、小型モデルだけで動く架空の深夜ラジオ局です。DJが番組を進行し、架空の曲を紹介します。
面白いのは、リスナーが電話をかけてDJと話せたり、天気を聞けたりする点です。実際に放送の時間が流れているように感じられる構造になっています。
戸田さんが特に評価したのは、OpenAIのGPTやGoogleのGeminiのような巨大モデルではなく、小型モデルの縛りで作られている点です。
元アプリの構成は、約1ビリオンのLLM、音声認識にWhisperのSmall、音声合成に約82メガのKokoroという組み合わせでした。
全部軽量なモデルで実装しているとか、すごい面白かったなと思いました。
オリジナルの完成度と、うまさの理由
改めてオリジナルのNIGHTWAVEを見ると、24時間動く架空の深夜ラジオ局というコンセプトで、DJがラジオのホストとして喋り、架空の曲を紹介します。
電話用のUIを押すと、実際に電話をして音声認識を行い、DJと話せる仕組みになっています。
小型モデルでありながらクオリティが低いわけではなく、むしろリアルタイム対応の大型モデルに「ラジオっぽい放送をやって」と丸投げするより、うまく構造ができていると戸田さんは話します。
うまさの理由は、番組の進行や音楽に流すパラメータ、出力が壊れたときのフォールバックを、アプリ側の仕組みとして持たせている点にあります。
そのため、小型モデルでも動作し、失敗してもきちんとフォールバックして再実行できる設計になっています。
日本語ローカル版の構成
日本語版は、HuggingFace Spaceに公開されているオリジナルのコードを読みながら作られました。
ただし、LLM・音声合成・音声認識を使う部分は、ローカルではなくModalという推論サービスのエンドポイントを叩く形になっていました。
公開されていたのはBrain、ASR、Speakという3つのエンドポイントでした。おそらくBrainがDJの発話を考える部分、ASRが音声の書き起こし、Speakが音声合成だと推測されます。
戸田さんはこの3つを、できるだけクラウドに出さず手元のMacだけで動かすことを目指して、自前で再実装しました。
TinySwallowの1.5ビリオン量子化モデル
FastWhisperのSmall
Kokoroの日本語ボイス
一通り動かした結果、長時間流しっぱなしにできるかまでは検証していないものの、ブラウザで再生し、DJが日本語で話し、APIも一通り通るところまでは確認できたとのことです。
日本語化で詰まった4つのポイント
日本語化では、単純な翻訳では済まない詰まりどころが複数ありました。
1つ目は、電話のトリガー検出です。オリジナルは「あなたは本物ですか?」「スタジオはどこにあるんですか?」といった質問に、ハードコーディングで面白おかしく答える仕組みでした。
英語版はWhen、Where、What、Whoといった疑問詞を拾う仕組みでしたが、日本語にそのまま翻訳すると、「なんとなく」の「何」に反応してしまうなど、誤爆が起きたそうです。
そこで、文章として疑問文になっているか、「何々ですか」の形になっているかを見る、シンプルなルールとの合わせ技で対応しました。
2つ目は、小型モデルの構造化出力の弱さです。DJが話すテキストに、セミコロンを含むリスト形式が混ざってしまうことがありました。
これをそのままTTSに渡すと良くないため、TTSに渡す前に、出やすい構造化部分を抜く後処理を入れました。
昔チャットボットを運用してたんですけど、その時に例外パターンをハードコーディングでガンガン作り込んでいたことがあって、その頃を思い出して面白かったですね。
3つ目は、字幕の同期です。TTSにKokoroを使っていますが、英語では単語ごとにタイムスタンプが出るのに対し、日本語ではタイムスタンプが出てこなかったといいます。
そこで句読点でチャンクに分け、長いチャンクは文字数などのルールで分割して表示する形にしました。厳密ではないものの、意外と違和感なく表示できたそうです。
4つ目は、同じくTTSの読みの間違いです。日本語音声は流暢に出るものの、固有名詞などで読みが変になる箇所がありました。これは今回は対応する余裕がなく、無視したとのことです。
英語版
When/Where/What/Whoの疑問詞を拾う
単純翻訳の問題
「なんとなく」の「何」などで誤爆する
日本語版の対応
疑問文の形かを見るルールとの合わせ技にする
今回わかったこと
今回の検証から見えてきたのは、小型モデルでも責務を縛れば、かなり面白い体験を作れるということです。
1.5ビリオンのモデルに番組全体を任せるのは難しいため、番組の構造はアプリが管理し、モデルには短い発話だけを書かせます。音声認識と音声合成は、それぞれ別の小さなモデルに任せます。
英語アプリの日本語化についても気づきがありました。単純な翻訳作業よりも、疑問文の判定や字幕の分割といった、泥臭く細かい穴を塞ぐ作業が多かったといいます。
最近はLLMを使うと、プロンプトを修正するだけでいい感じになることも多い中で、今回は昔ながらのエンジニアリングをしている感覚があり、それが面白かったと戸田さんは振り返ります。
検証に使ったコードはGitHubに、試行錯誤や詰まったことはZennの記事にまとめられており、概要欄にリンクが貼られています。
まとめ
小型モデルだけで動く深夜ラジオ「NIGHTWAVE」を、日本語かつローカル環境へ移植した検証回でした。翻訳では済まない泥臭い作業を通じて、責務を縛った設計の面白さが見えてきました。
- NIGHTWAVEは、小型モデルだけで動く架空の深夜ラジオ局で、電話でDJと話せる構造を持つ
- 日本語ローカル版はTinySwallow 1.5B、FastWhisper Small、Kokoro日本語ボイスで再実装された
- 日本語化ではトリガー検出、構造化出力、字幕同期、読み間違いといった詰まりどころがあった
- 番組構造はアプリが管理し、モデルには短い発話だけを任せることで小型モデルでも成立した
- 翻訳より、細かい穴を塞ぐ昔ながらのエンジニアリング作業が中心になった
