これまで「FFTrans Pro」や「FFTrans Neu」といった音声ファイルを文字起こしするアプリを作ってきましたが、リアルタイム文字起こしができないと言われ続けた(と作者は思っている)ので、リアルタイム文字起こし・翻訳アプリ「FFTrans HUD」を作ってみました。
ただ、世の中にはすでにZoomの自動字幕やリアルタイムの文字入力ツール、翻訳ウェブサービスが溢れています。
今さらリアルタイム翻訳を作るからには差別化をする必要がありました。
大きな方針としては以下の4つを掲げて開発に臨みました。
1. 徹底してオフラインにすること
2. こっそり翻訳できること(bot不要)
3. 途中経過で勘違いさせる翻訳を出さないこと
4. 8GBのMacで常時起動しておいても支障ないこと
1に関してはFFTransシリーズでこれまでもずっと徹底していたことで、オフラインだと謳っていても認証や使用状況などをネットワーク送信していたり、モデルの更新チェックが都度走ったりしているものが多いのが実情かと。
FFTransシリーズはトライアル中や初回のモデルダウンロードはやむなしとしても、それ以外は極論、LANケーブルを引っこ抜いていても動作することを徹底しています。
Apple純正の文字起こしエンジン、speechAnalyzerやTranslation APIもロケール(言語)が切り替わるとダウンロードに行くケースがあるので、そこはまあ仕方ない部分ではあるのですけど、少なくともアプリとしては徹底したいなと。
また、音声もVADが取得した一文と経過表示中の途中の文のみを音声認識のためにメモリに保持し、音声認識が終わったら完全に破棄しています。
ログもファイルではなくメモリ上にのみ保持し、ユーザーが明示的に保存しない限りはアプリを閉じたら一瞬で消え去ります。
それすら嫌な人のために、ログをメモリに記録しない設定まで用意する徹底ぶりです。
次に「こっそり翻訳」は今回のHUDの最大のテーマかもしれません。
会議中に相手の英語が聞き取れなくて、冷や汗をかきながらやり過ごすことって意外とありませんか?
私も海外企業のコンサル案件の打ち合わせが来て、リスニングができれば十分と聞いていたのに蓋を開けてみたら、完全にネイティブな速度で捲し立てられ、おまけに「こいつ、全然分かってないな」という顔をされた苦い経験があります。
かと言って、会議に翻訳botを招待するのは目に見えて相手に分かってしまいますし、セキュリティ的にクラウドに音声を投げるのはNG(個人的には規約云々以前にNGだと思っていますが)な場面も多いでしょう。
また、海外発信の講演配信やゲームを公式字幕を待たずに今すぐ楽しみたいということも結構あるかと。
そこで、画面上にオーバーレイで半透明の字幕を出す「HUD(ヘッドアップディスプレイ)」で行こうと考えたわけです。
技術的には以前リリースしたMuteHUDからの発案でもあります。
ただの透過字幕だと思われがちですが、FFTrans HUDでは「画面共有にHUDを含めない(デフォルトで共有も可能)」ようにしてあります。
ですから、オンライン会議で画面共有をしていても、相手の画面には字幕が一切映りません。
つまり、言葉は良くないですが、相手に知られることなく、自分だけがそっと翻訳を確認して会話の状況を把握する『こっそり翻訳』が実現できるわけです。
次に、リアルタイムというと「2秒以内に翻訳」とか「先読み翻訳」みたいなセールストークが先行しがちですけど、FFTrans HUDはVADで一文が確定して初めて翻訳をしています。
日本語のように否定が最後に来るなど、言語によって語順が異なる限り、どう頑張っても最後まで聞かないと正しい翻訳はできないんですよね。
早めに出すけどあとで書き変わって「え?最初から分かってましたけど…」みたいな手法もありますけど、人間の同時通訳ですらちゃんと聞き終えてから伝えているわけで、ここは待つのが正解だろうと。
もちろん、処理の軽快さを維持するためというのもありますけどね。
その軽快さですが、いちばん分かりやすいのは翻訳、読み上げをやっている時の消費電力です。
言語識別やVAD、音声認識の負荷が掛かっている場合で最大6W程度、翻訳や読み上げをしている時はなんと1Wを切って動作しています。
メモリ消費はOS側管理の部分を除けば100MBにも満たないほどです。
もちろん良いことばかりではなく、まだまだ完璧でない部分もあります。
1.4.0からは、話されている言語を自動で判定する「言語識別」や、自分が話した日本語を相手の言語に翻訳する「双方向翻訳」を実装しました。
自動識別には「ECAPA-TDNN」というモデルを内包してローカルで動かしているのですが、リアルタイム翻訳の性質上、短い発話の隙間で瞬時に判定しなければなりません。
本来なら10秒くらいは正確な判定に欲しいところなのですが、1秒や2秒くらいから経過表示のために判別させるので上手くいかないケースはあります。
ましてや107言語から判定…みたいなことを間に受けてやったらもう悲惨な結果になってしまいます。
現在は7言語に絞って、最もそれらしい言語を選んでいるといったほうが良いでしょう。
またVADは言語の境界を理解していませんから、切れ目なく多言語で会話されると複数の言語を1つの言語として認識してしまうこともあります。
VADのパラメータは調整可能ではありますが、言語が分かっているならば最初からソースやターゲット言語を明示して固定しておくほうが良いでしょう。
読み上げに関してもAVSpeechSynthesizerを用いていますが、ボイスの選定や音質が現状はOS依存な部分があります。
アプリ内ですでにダウンロードしてあるボイスから最良音質のものを使用するように工夫はしてありますけど、アプリ側でダウンロードすることはできないんですよね。
またダウンロードする場所も「システム環境設定」の「アクセシビリティ」→「リーダーと読み上げ」→「システムの声」のiボタンで「声」ダイアログが開いて、そこから言語を選び、使いたい声をダウンロードするという、文で書いても分かりづらい状態です。
ちなみに読み上げはスピーカーからでも問題ないように配慮してあります。
ほとんどの翻訳アプリはPush-To-Talk(PTT)を採用してありますが、あれは合成音声をマイクがまた拾って音声認識してしまうという「無限ループ」を避けるためなんです。
FFTrans HUDではこれを防ぐために、OSレベルで「マイクのVoice Processing(エコーキャンセル)」を有効にしつつ、システム音声側で自プロセスの音声を除外する制御を行っています。
ここもDTLN-aecなどのAI系のダブルトークキャンセルを搭載すればさらに改善可能ですが、軽快さを重視すれば現状のバランスが良いかなと。
もちろん、将来的に拡張可能なように読み上げ音声をバッファに持つようにはしてありますが。
あとはリアルタイムで流れる英語ニュースなどを翻訳していると、英語のスピードに対して、日本語の読み上げスピードが追いつかず、音声キューがどんどん溜まっていく現象もあります。
最初にあげたビデオ会議でもまさにこんな感じに捲し立てられましたね。
そこで、1.6.0では「キューが一定以上溜まったら、古いストックをスキップして、強制的に最新の翻訳文にジャンプして読み上げる」という、実用性を最優先したスキップ処理を入れました。
さらに、聞き取りやすいように読み上げ速度を40%〜150%で細かく調整できるようにしてあります。
ここも溜まった部分を要約して読み上げるとか、離席時の部分を三行にまとめて、みたいなことは今はLLMで可能な時代です。
macOSの次期バージョンでFoundation Modelsが強化されるようなので、そこで再検討してみたいとは思っていますが、少なくともクラウドに安易に投げたり、オフラインAIモデルを別途積むのは、圧倒的な軽さを守るためにも避けたいと思っているので、現状は見送っています。
最後はちょっと宣伝になりますが、FFTrans HUDは、サブスクではなく2,000円の「買い切り」永久ライセンスです。
14日間は起動時等に不正防止のためのネットワーク認証が入ってしまいますが、送信されるのはユーザーIDのみで名前もメールアドレスも、クレジットカード登録も一切必要なく、製品版と全く同じ機能を無料でお試しいただけます。
フリーバージョンを作ることもちょっと考えましたが、そうすると固有名詞を文字起こし後も即時反映できる「カスタム辞書」や、双方向翻訳、読み上げ機能などを割愛せざるを得なくなってしまいます。
まずは14日間体験を気軽にお試しいただけたらなと思っています。





コメント