2026/09/11_日本語を英語にするだけならトークン激安できたっぱ(∩´Θ`)∩が!

06:26

著者: かっぱ

カテゴリー: 雑記, IT技術ネタ?, パソコン・インターネット

タグ:OBS, Cloudflare, Workers AI, ReazonSpeech, Llama3, Python, 音声認識, リアルタイム翻訳, AI

おぱよう(o’Θ’o)ノ)) かっぱだっぱ♪ 無料でパソコンにCPUやGPU負荷を掛けずにOBSとか用にリアルタイム字幕を作ろうとして色々やってたっぱが いつの間にか超節約版ができてたっぱ・・ ==長い話が嫌いなら末尾のファイルをダウンロードしてがんばって設定して試せばいい==っぱ(人Θ’o) そのうちおいらの配信でかぱ柱またしてると思うけどの・・
少し思い返すに
Pythonを使って、CloudflareでWhisperとLlama3を組み合わせて日本語を即字幕かや他国の言語を日本語に翻訳するやつを8月14日位に公開したっぱよね?(o’Θ’))ゥンゥン
ごく一部のもの好きがしっかり組み直してもっといいものをそのうち公開する予感っぱが(人Θ’o)ネッ その後、トークン節約の為や翻訳アプリが誤検出されて厄介な事になると困る環境の為に ブラウザ版も作ったっぱよね?8月29日の事っぱ(o’Θ’))ゥンゥン
で、だ。 正直最近のPCならCPU性能いいし、日本語の音声認識に特化したものでパソコン側でそこだけ処理して残りの処理をCloudflareにぶん投げた方がいいのでは?💡とお皿が光ったっぱよ∑(‘Θ’)
結論からいうと、トークン大節約に成功(∩゜Θ。)∩わ~い♪ これならAIガードレールもONにして1日数時間つかうのもありっぱ♪ ガードレールなしなら1日16時間いけるのでもう余計なことしなくていいっぱルン♪ ((o’Θ’o)) ルン♪ ※配信民はNGワードやガードレール使ってないと放送事故になる配信先もあるので気をつけようっぱ!
ガードレールなしなら余裕っぱが⋯ ガードレールありだと半日配信する人だと足りんなヾ(゚θ゜ )ォィォィ とおもって⋯”AIに最初に辞書を作らせてCloudflareのK2キャッシュに収納”してCloudflareのAIのトークン節約を試みたりもしたっぱが⋯ 余程同じ単語がたくさんでる話題じゃないとあんまり意味は無いっぱ┐(。Θ゜)┌ヤレヤレカパカパ お題として”配信のお題やゲームのタイトル”とかを最初に辞書作成をポチっておくとその後の配信でトークンが節約できるようにはしたっぱ⋯ 逆説的に・・AI Gatewayのキャッシュに読みやすい用に日本語の辞書を丸ごとAIが読みやすい形式にしてJsonで保管してやればトークン無双じゃないかとも思ったっぱが(ぉぃ ゲーム辞書の保存先にWorker KV を使えば事前演習を前日やって次の日本番でやるみたいな時に辞書作成の短い手間やトークン節約もできるっぱo(・Θ・)oウンこれっぱ! という 一応そういうのもつけたっぱ・・・?
ついつい寝不足の時に思いつきで一気に作ってできたっぱ(∩゜Θ。)∩わ~い♪寝るっぱー! すると・・ あるぇ・・・? 生成物があるっぱ・・これなにっぱ・・?KV?Gateway?牛のマーク?なんだろうこれっぱ・・? というオーパーツが生成されていたっぱ(ぉぃ
一応ライセンスはMITとかApache2.0とかいてあるの確認してやってたみたいなので問題はないと思うっぱが各人での再確認はおすすめしておくっぱo(・Θ・)oウン(雑 時々、ライセンスが変更になるところも世の中にはあるっぱからね・・ そういう時は掲載((_ロ(・Θ・。)゛ケシケシせなあかんっぱ・・ 多分説明書に記載あったと思うけどAIが暴走して時々説明端折るっぱ⋯( ・Θ・).;’.、ブッ 消えてないといいけど⋯ あ、そうそう(*´-Θ-)フフフッ これおいらの方ではそれらのファイル同梱してなくて ReazonSpeech K2およびモデルは本配布物に含まれていません。利用時に各自で公式配布元から取得してください。
⊂(^θ^)⊃セフセフっぱ まあ、ReadMe読んで、数行入力するだけで使えるから問題ないっぱね⋯ これがおいらの方で最初から全部入りのexe作って配る場合になるとかかないといけないっぱ(備忘録メモ

最近ボケが激しいからの生成物のログをみて今気がついたっぱ(ギリセーフ なぜ全部入りを作らないかといえば、最新のファイルDLして使ったほうが セキュリティ的にもいいだろうし性能もあがるだろうっぱ? そもそもかっぱのあやしいコードに信頼性皆無だからの(人Θ’o)ネッ

ちなみに類似のものだと・・ OBS LocalVocalとか LiveTranslateとか (これらCloudを使わないのでCPUとGPUに負荷がかなりかかる) あるっぱ おいらのK2版は何って? ReazonSpeech K2を日本語ASRとして使って 日本語音声 ↓ ReazonSpeech K2 ↓ 日本語の後処理 ↓ ゲーム固有名詞辞書 ↓ Workers AI ↓ 翻訳 ↓ OBS という流れで使うっぱ(人Θ’o)ネッ で、キャッシュ機能を間に挟んでるからトークンも節約⋯ 日本語を英語にして出すだけ! (Cloudflare使ってないとただ、ReazonSpeech K2が日本語認識して表示するだけ。) になるように作った記憶っぱ(。-Θ-。)ボォ…(だよの?マジ徹夜テンションだったので不穏) ともあれ 過去のPython版やブラウザ版の経験から若干いいとこ取りしているので・・・ CPU負荷はほぼ感じないだろうし困ることはないっぱ(人Θ’o) 以下ちょっと暴走AIが作った説明文をちょっと乗せておくっぱ♪ 配布物はいつもどおり記事の一番最後においておくっぱルン♪ ((o’Θ’o)) ルン♪

⋯ぱぁ!(これを書いてる時にキャッシュが機能しない起動方法が有ることに気がついた) 直したのでOKっぱ( ・Θ・).;’.、ブッ(ぉぃぃ

トークン節約はWhisperをK2に置き換えたことが実質9割の節約ができたっぱ🤗 んじゃ辞書機能とWorkerAIのキャッシュは何か? 推論スキップできる場合リアルタイムの字幕の遅延を更に削減できる事が肝っぱね トークン節約も0.?%は期待できるけども遅延対策程度なので初期設定で飛ばしても絶対ダメとは言えない程度っぱね┐(。Θ゜)┌ヤレヤレカパカパ ちなみにAIに最近のおいらの素行をブログ化させようとするとこうなるらしいっぱ


Reazon K2 + Cloudflare Workers AI でリアルタイム字幕翻訳を作ったら、想定外の問題が次々出てきた話

きっかけ:「Neuron節約できるんじゃね?」

Cloudflare Workers AI で Whisper をフル稼働させてリアルタイム字幕翻訳をやると、便利だけど Neuron 消費がそれなりに大きい。Whisper が Neuron 消費の93%を占める、という実測データもあった。

そこで思った。

「音声認識をローカルでやって、翻訳だけ Cloudflare に任せれば、Neuron は翻訳分だけで済むんじゃね?」

従来:
音声 → Whisper(Cloudflare) → 文字起こし+翻訳 → 字幕

今回:
音声 → Reazon K2(ローカルCPU) → 日本語テキスト → Cloudflare Workers AI → 翻訳 → OBS

音声認識をローカルに分離すれば、Cloudflare に送られるのは認識済みテキストだけ。Neuron 消費は翻訳分のみになる。

これが今回の本題。


K2を動かしてみた:CPUだけで速い

ReazonSpeech K2 は日本語音声認識に特化したモデル。Hugging Face から初回約775MBダウンロード、以後はローカルキャッシュ。

実測してみた(CPU / FP32 / 8秒チャンク / AMD 24論理コア):

音声長 推論時間 RTF RSS
2.1秒 0.090秒 0.043 825MB
9.8秒 0.365秒 0.037 980MB
15.5秒 0.419秒 0.027 1,006MB

RTF 0.027〜0.043って何かという、リアルタイムの約23〜37倍速い。CPU推論でこれ。GPU不要。

CPU使用率も推論時約10〜15%で、推論が常時走るわけではないので長時間平均すればもっと低い。

「CPUだけでこんなに速いのか」 というのが第一印象。


しかしK2には重大な注意点があった:英語ほぼ無反応事件

翻訳方向に en_to_ja(英語→日本語)の選択肢がある。じゃあ英語も認識できるんだな、と思うじゃないですか。

大間違いでした。

実際に英語音声を入れてみた:

音声 結果
一般的な英語音声 ❌ ほぼ無反応
和製英語の単語 ⚠️ たまに拾う(日本語として認識される)
日本語訛りの英語 ⚠️ 限定的に認識

つまり、K2は日本語音声認識モデルであって、多言語ASRではない。 en_to_ja の選択肢があっても、K2が英語音声を拾えるわけではない。

これは利用者にとってめちゃくちゃ重要。ボタンがあるから動くと思ったら悲惨なことになる。

READMEには「海外配信を日本語字幕にしたいならWhisper版を使ってください」と明記した。


翻訳先を増やしたら別の問題が出た:中国語漢字誤判定事件

K2は日本語しか拾えないけど、翻訳先は英語以外にも増やしたい。Llama 3.1 8B は多言語対応モデルだから、フランス語・スペイン語・中国語・韓国語も行けるはず。

中国語翻訳を追加して試してみた。翻訳自体は成功。

日本語: うん
翻訳: 好的

ちゃんと中国語になっている。ところが——

[翻訳失敗 - 日本語のまま返却] 元のテキストを使用

は?

調べてみると、翻訳結果に漢字が含まれているのを「日本語が残っている」と誤判定していた。

元のコード:

if direction == "ja_to_en" and re.search(r'[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\u3400-\u4DBF]', translated):
    # 日本語文字が残っている → 翻訳失敗
    return ""

\u4E00-\u9FFF はCJK統合漢字。中国語の漢字もこれにマッチする。

「日本語判定に漢字を使う」という一見もっともらしい処理が、中国語を追加した瞬間に破綻する。技術記事として最高に面白いやつだ。

修正:

if normalized_target in ("english", "en", "英語"):
    # 英語: ひらがな・カタカナ・漢字が残っていれば日本語残存
    japanese_pattern = r'[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\u3400-\u4DBF]'
else:
    # 中国語等: 漢字は正常なので、ひらがな・カタカナのみ判定
    japanese_pattern = r'[\u3040-\u309F\u30A0-\u30FF]'

英語の時は厳しく、中国語等の時はひらがな・カタカナだけで判定。これで「我要去东京」の漢字を誤爆しなくなった。


字幕タグもバグった:内部は正しいのにUIが嘘をつく事件

中国語翻訳ができるようになった。コンソールにも ja_to_en→chinese と正しく表示されている。

しかしOBSの字幕は:

[JA] うん
➔ 好的

[JA] って何?中国語じゃないの?

調べてみると、表示部分で lang_tag"[JA]" 固定になっていた。内部ではちゃんと custom_target_lang = "chinese" まで渡っているのに、表示だけ固定。

「内部処理は正しいのにUIだけ嘘をつく」という典型的なやつ。

最終的に言語タグ生成関数を作って解決:

[JA] うん
➔ [CN] 好的

フランス語なら [FR]、韓国語なら [KO]。手動入力なら [{言語名}] になる。


フランス語を試したらNGワードが暴れた:英語フィルタが襲いかかる事件

中国語も直った。じゃあフランス語も試してみよう。

フランス語翻訳は成功。きれいに翻訳されている。

ところが——

翻訳: Oui, brusquement***

***

フランス語用NGワードなんて作った記憶がない。なぜマスクされている?

調べてみると、英語用NGワードフィルタが翻訳後のフランス語にも掛かっていた。

NGワードリストは英語と日本語の単語が混在している。re.IGNORECASE で大文字小文字区別なし。フランス語の単語の一部が英語NGワードに部分一致したのだ。

「NGワードマスクも動いています!」と報告されて、「……フランス語用NGワードなんて作ったっけ?」となる。これも記事として最高に面白い。

最終的には、多言語それぞれのNGワード辞書を作るのは現実的ではないという判断。READMEには「英語以外の翻訳先ではCloudflareのAIガードレール機能の利用を推奨」と書いた。

ガードレールありだとNeuron消費が約4倍(3〜5時間に短縮)になるが、必要に応じてONにすればいい。字幕・機械翻訳の誤字に寛容な配信もあれば、そうじゃない配信もある。


認証情報も整理した:毎回環境変数を設定する羽手になっていた事件

ここまでで機能は揃ってきた。でも起動するたびに一つ問題があった。

Cloudflare API認証情報(Account ID / API Token)は .cf_credentials に保存されていて、次回から自動読み込みされる。

しかしゲーム辞書の認証情報(Worker URL / Auth Token)は環境変数のみ

つまり、IDLEから起動するたびに——

「なんで毎回PowerShellで環境変数設定してから起動してんだ俺」

という問題w

そこで .cf_credentials に統合:

account_id=...
api_token=...
game_dict_worker_url=...
game_dict_auth_token=...

しかもただ追記するだけでなく:

  • 環境変数優先(両方設定されていれば環境変数を使う)
  • .cf_credentials 次点(環境変数未設定時にファイルから読込)
  • 既存設定を壊さない(行単位で読込・該当キーだけ置換・一時ファイル経由で原子書き込み)
  • 不完全な認証情報は保存しない(両方入力完了してから保存)

初回起動時には「ゲーム辞書を使用しますか?」と聞いて、Yなら Worker URL と Auth Token を入力させる。次回からは聞かない。


結局どれくらい節約できたか

翻訳1回あたり約4 Neurons(Llama 3.1 8B / 入力約300トークン・出力約80トークン想定)。

10,000 Neurons ÷ 4 ≈ 約2,500回翻訳/日。

ただしこれは「すべてのチャンクが翻訳に送られる」という仮定。実際にはVAD(無音区間のスキップ)、フィラースキップ(「あー」「うん」等の除外)、重複スキップ(同じ内容の再翻訳回避)により、翻訳APIに送られるチャンクは入力の半分〜3割程度に減る。

チャンク長8秒・1時間あたり450チャンク(全翻訳時)として、スキップ後の実効翻訳回数が1時間あたり140〜280回程度とすると、2,500回 ÷ 140〜280 ≈ 約9〜18時間が目安。発話量・テキスト長・キャッシュヒット率により大きく変動するため、あくまで目安。

WhisperをCloudflareでフル稼働していた頃と比べて、音声認識のNeuron消費がゼロになった。翻訳分だけで1日配信できる。

AI Gatewayのキャッシュを使えば、同一テキストの翻訳はキャッシュから返るのでさらに節約できる。


それでもまだ英語配信は諦めていない

K2は日本語特化で英語音声を拾えない。でも「英語配信を日本語字幕にしたい」という需要はある。

次の調査対象は Moonshine Tiny

Moonshine は Useful Sensors 社の軽量ASRモデル。英語音声認識に特化。Tiny版はCPU-onlyでもリアルタイム動作可能。

英語音声 → Moonshine Tiny(ローカルCPU) → 英語テキスト → Cloudflare Workers AI → 日本語翻訳 → OBS

もし実現できれば、日本語はK2、英語はMoonshine、という切り替えでローカル処理のまま両言語に対応できるかもしれない。あくまで構想の段階で、実装できるかはまだ分からない。


📦 配布物・ライセンス

本プロジェクトの配布物

以下は本プロジェクトの著作物として MIT License で公開しています。

  • Python本体(reazon_k2_live_v4_baseline_20260909_work.py
  • Workerコード(game-dict-worker-v2.js
  • wrangler.toml
  • requirements.txt
  • README(日本語・英語)

外部ソフトウェア・モデル

本プロジェクトでは、以下の外部ソフトウェア/モデルを利用します。これらは本プロジェクトのMIT Licenseには含まれません。

  • ReazonSpeech K2 モデル — Apache-2.0
  • Llama 3.1 8B — Llama Community License
  • その他の依存パッケージ — 各パッケージのライセンスに従います

外部ソフトウェア・モデルの利用条件、再配布条件、商用利用条件等については、それぞれの公式ライセンスおよび利用規約を確認してください。


まとめ

「ローカルで音声認識すればNeuron節約できるんじゃね?」から始まって、想定外の問題が次々出てきた:

  1. K2は日本語特化 → 英語音声ほぼ無反応
  2. 中国語翻訳を追加 → 漢字を「日本語残存」と誤判定
  3. 字幕タグが [JA] 固定 → 内部は正しいのにUIが嘘をつく
  4. フランス語翻訳 → 英語NGワードフィルタが襲いかかる
  5. 認証情報が環境変数のみ → 毎回PowerShellから設定する羽手

でも最終的には、言語認識の罠は修正し、字幕タグも直り、認証情報も一元化できた。フランス語のNGワード問題は「多言語それぞれのNGワード辞書を作るのは現実的ではない」と仕様として割り切った。そしてNeuron消費は翻訳分だけで済むようになった。

「最初から完璧に設計した」ではなく、「動かしてみたら次々問題が出てきた」 というのが今回の開発だった。でもその過程で、K2の性能特性、多言語翻訳の文字判定の罠、フィルタの言語依存、認証情報の一元管理など、いろいろ学べた。

次はMoonshine Tinyで英語音声も拾えるようにしたい。


🙄で・・ ここまでAIが書いてるっぱが 実はこのあとMoonshineより有力な候補を見つけたっぱ

  • microsoft/VibeVoice-ASR-Streaming-1.5B
  • VibeVoice-ASR-BitNet
  • microsoft/VibeASR.cpp

9月入ってすぐにでたばかりであまり試されてない気がするっぱが・・ Whisper板の上位互換としてつかうならひょっとしてアリ寄りじゃないかと思っているっぱ ただ、これはその・・ 多分そこそこ良いCPU環境じゃないとK2版のように負荷らしい負荷を感じずに使えるようなものにならないんじゃないかのぅ?とも思っているっぱ
まあ置き換えはそこまで難しくないので検証すればって感じだっぱが リアル健康優先だからの👼チーン…(8θ」∠)
例によって利用したことで何が起きてもおいらは知らないっぱ 一応English版と日本語版の雑なReadMeはあるけども⋯
ん?字幕を出すためのtxtが見当たらないっぱ? 一度起動して初期設定した後にでてくるっぱd(-Θ-。)ネッ

Enjoy Use It !reazon-k2-subtitle-translation.rar

コメント