日本語の音声を聞きながら原文と翻訳を確認できるデスクトップアプリを作っています。この記事では、音声認識と翻訳をPC内で動かす現在の実装を整理します。構成はTauri、Rust、whisper.cpp、Hy-MT2-1.8BのGGUFです。Apple SiliconではMetalを使います。速度のベンチマークではなく、実装の役割分担についての記録です。
まず、翻訳の限界
小型モデルなので不自然な訳は残ります。開発時の比較記録にも、擬音が自然な韓国語にならず音のまま残る例や、口調と意味がずれる例があります。また、文字起こしを誤ると、その文字列を入力にする翻訳にも影響します。自動字幕を完成済みの翻訳として扱わず、日本語と訳文を一緒に確認できる形にしています。
音声認識と翻訳を分ける
処理は「音声→日本語の文字起こし→翻訳→字幕表示」です。Rust側ではwhisper-rsからwhisper.cppを呼びます。音声認識の設定ではWhisper自身の翻訳を無効にし、文字起こしの結果を次の翻訳処理に渡します。Whisperだけで日本語音声を韓国語に変換する構成ではありません。
Tauriはデスクトップアプリの土台で、推論処理はRust側にあります。利用者にPython環境やCUDAの構築を求める方式ではありません。音声認識と翻訳を別の工程にすることで、画面でも原文と翻訳を区別できます。翻訳が不自然なとき、まず入力になった日本語を確認できます。
Apple SiliconとMetal
macOS向けのCargo設定では、whisper-rsのmetal機能を有効にしています。Metalのカーネルを実行ファイルに含める設定もあり、利用者がXcodeを用意する前提ではありません。対応対象はM1以降のApple SiliconとmacOS 14以降です。Intel Macは対象外です。
「NVIDIA不要」は「どのPCでも同じ速度」という意味ではありません。メモリや音源の長さによって待ち時間は変わります。M1の特定条件で計測した数値をこの記事では示していないため、リアルタイム処理も保証しません。対応機種の説明と処理速度の説明は分けています。
1.8BモデルはGGUFで実行
翻訳はTencent Hy-MT2-1.8BのQ4_K_M GGUFを、同梱のllama.cppサーバーで実行します。モデルの取得先はリビジョンを固定し、ファイルサイズとSHA-256も定義しています。GGUF本体は約1.13GBですが、これはアプリや追加パック全体の容量ではありません。
翻訳用の子プロセスがサーバーを起動し、接続先を127.0.0.1に限定します。外部の翻訳APIに文章を送る構成ではありません。起動処理にはGPUで開始できなかった場合にCPUを試す経路があります。Apple Silicon側ではMetalを使用しますが、GPUの利用と処理成功は別の状態として扱います。
前の台詞は口調の判断に使う
日本語から韓国語への翻訳では、丁寧語とくだけた話し方の扱いも必要になります。現在の処理は同じトラックの直前二行を口調の判断に使います。ただし、前の台詞を今回の翻訳対象として一緒にプロンプトへ入れる方式ではありません。対象の行と、口調を決めるための情報を分けています。
用語のヒントも使いますが、指定を増やせば必ず改善するわけではありません。既存の開発記録では、一律に口調を指定すると訳が硬くなる例がありました。入力の内容に応じた指定を使っても、意味や話し方が常に保たれるわけではありません。原文を確認する余地を残す必要があります。
ローカル処理とダウンロード
メディアと文字起こしをクラウドにアップロードせず、認識と翻訳をPC内で処理します。一方、モデルを取得するための通信は必要です。「ローカル推論」と「アプリが一切通信しない」は同じではありません。モデルを受け取る通信と、利用者の音声を送信する処理を区別して説明しています。
アプリについて
この構成を使ったアプリがLocal Mediaです。ローカルのASMRやドラマCDを作品単位で整理・再生し、文字起こしの検索や原文と翻訳の表示ができます。無料版は作品数無制限、日本語文字起こしはトラック全編、翻訳字幕は各トラック冒頭3分です。字幕の書き出しは有料の正式版の機能です。無料版は登録なしでダウンロードできます。https://local-media.koedana123.workers.dev/