MASATO NASU

Tools

Apps, prototypes, and utilities designed for actual use.

KANON

KANON

#Android#英語学習#リアルタイム字幕#音声認識#翻訳#OpenAI#生成AI#AI#Androidアプリ#個人開発#BYOK#アクセシビリティ

音を、観る。Androidリアルタイム字幕アプリ「KANON」を作りました 英語を聞いていて、ほんの一瞬だけ意味を取り損ねることがあります。 単語を知らないわけでもない。文章として読めば分かる。それでも、実際の会話やラジオになると、音がそのまま通り過ぎてしまう。 そんな時、「いま聞こえた英語が、その場で文字になって見えればいいのに」と思ったことから、このアプリを作り始めました。 KANON / 観音 名前は KANON(観音)。 コンセプトは、 音を、観る。 です。 Android端末で再生されている英語音声を取得し、別のアプリを使っている最中でも、その画面の上に英語字幕と日本語訳を重ねて表示します。 専用の動画プレイヤーやラジオアプリを作るのではなく、今使っているアプリに字幕を後付けするという考え方です。 YouTubeを見ている時も、ラジオを聞いている時も、対応しているアプリであればKANONの字幕窓だけを上に浮かせて使えます。 最初は「REWIND」だった 実は、最初からKANONを作ろうとしていたわけではありません。 最初のアイデアは REWIND というものでした。 聞き取れなかった瞬間にボタンを押すと、直前の10秒程度をもう一度確認できる。「今の何?」を実現するアプリです。 ところが実際に試していくと、気付きました。 巻き戻すより、最初から字幕が見えている方が便利。 そこで、REWIND機能を主役から外しました。 10秒バッファ、REPLAY、巻き戻しボタンなどを削り、リアルタイム字幕と翻訳だけに集中することにしました。 機能を増やすより、不要なものを捨てたことで、アプリの目的がはっきりしました。 できること KANONでは、Androidの再生音声をキャプチャし、リアルタイムで英語を文字に変換します。 確定した英文には日本語訳を付け、フローティングウィンドウの中へ順番に追加していきます。 字幕窓は画面上をドラッグして移動できます。 必要な時は小さく畳み、終了したい時は STOP。 字幕は一文だけではなく、そのセッション中の全文を積み上げて表示する設計にしています。 つまり、少し前に何と言っていたかも、そのまま上へスクロールして確認できます。 BYOK KANONは BYOK(Bring Your Own Key) 方式です。 OpenAI APIキーをアプリそのものに埋め込まず、利用者自身のAPIキーを端末に設定して使います。 APIキーはAndroid Keystoreを利用して端末側で保護します。 音声を録音ファイルとして保存したり、音声データをアーカイブしたりする機能も付けていません。 KANONが動いている間だけ音を処理し、字幕化する。 できるだけ役割を限定した設計にしています。 Androidだからできたこと 今回面白かったのは、Androidの AudioPlaybackCapture です。 対応しているアプリであれば、マイクから周囲の音を拾うのではなく、端末内部で再生されている音声そのものを取得できます。 これによって、 「動画アプリ専用字幕」 ではなく、 Androidの上にもう一枚、聴覚補助レイヤーを重ねる という構造が可能になりました。 ただし、すべての音声を取得できるわけではありません。 DRMなどで保護されたコンテンツや、再生音声のキャプチャを許可していないアプリでは利用できません。 そこはAndroid側の仕様に従います。 なぜ「観音」なのか KANONという名前を考えた時、「観音」という漢字がとても自然に感じられました。 観音は文字通り、 音を観る。 今回作っているものと、そのまま重なります。 英語という音が流れていく。 それを文字として観る。 さらに日本語として意味を観る。 アプリの機能を説明するために後から意味を付けたというより、名前を決めたことで、むしろアプリが何をするものなのかが整理された感覚があります。 アイコンも観音様をモチーフにしました。 周囲には音声波形を配置しています。 宗教的な意味を前面に出すというより、「音を観る」という言葉そのものを視覚化したシンボルとして使っています。 字幕を「足す」という発想 動画サービスには字幕機能があります。 翻訳アプリにも音声認識があります。 でもKANONでやりたかったのは、そのどちらでもありません。 既存のサービス側に機能を追加してもらうのではなく、 自分の端末側で、足りない機能を一枚重ねる。 という方法です。 これはアプリというより、少しOSの拡張に近い感覚があります。 英語が聞き取りづらいなら、動画を別の場所へ持っていくのではなく、その場に字幕を持ってくる。 問題のある場所そのものに、小さな道具を置く。 今回も、そんな発想から生まれました。 KANON / 観音 Live English Caption + Japanese Translation for Android 音を、観る。 Android端末でのインストールと初期設定 KANONはGoogle PlayではなくAPKからインストールするため、初回だけいくつかAndroid側の設定が必要です。 1. APKをダウンロードする Android端末から以下のAPKをダウンロードします。 https://github.com/Masato-Nasu/KANON/releases/download/v0.1.0/KANON-v0.1.0.apk ダウンロードした KANON-v0.1.0.apk を開きます。 初めてAPKを直接インストールする場合、 「この提供元からのアプリを許可」 などの確認が表示されることがあります。 Chromeからダウンロードした場合はChrome、ファイル管理アプリから開いた場合はそのアプリに対して、一時的に「不明なアプリのインストール」を許可してください。 インストール後は、この許可を再びOFFにしてもKANONは使用できます。 2. OpenAI APIキーを設定する KANONを起動すると、OpenAI APIキーの入力欄があります。 自分のAPIキーを入力して、 SAVE KEY を押します。 KANONはBYOK(Bring Your Own Key)方式なので、アプリ内に共通のAPIキーは入っていません。 APIキーはAndroid Keystoreを利用して端末内に保存されます。 なお、OpenAI APIはChatGPTの契約とは別料金です。APIアカウントに利用可能なクレジットが必要です。 3. 「他のアプリの上に表示」を許可する KANONの字幕は、YouTubeやラジオアプリなどの上に重ねて表示します。 そのため、 「他のアプリの上に表示」 「重ねて表示」 「Display over other apps」 などと表示される権限が必要です。 KANONの画面から設定を開き、 KANON → 他のアプリの上に表示 → 許可 をONにしてください。 Androidのメーカーやバージョンによって表示名は多少異なります。 設定画面から探す場合は、おおむね 設定 → アプリ → 特別なアプリアクセス → 他のアプリの上に表示 → KANON にあります。 4. START KANONを押す 準備ができたら、 START KANON を押します。 Androidから画面共有・録画に関する確認画面が表示されます。 KANONではAndroidの MediaProjection を利用して、対応アプリが再生している内部音声を取得するため、この許可が必要です。 Androidの確認画面では「画面を録画または共有します」など、少し大げさに見える表示が出る場合があります。 KANON自体は、画面映像を保存するためではなく、再生音声を取得するためにこの仕組みを使用しています。 表示されたら、 今すぐ開始 / Start now などを押してください。 5. 通知を許可する Android 13以降では、通知の許可を求められることがあります。 KANONは音声取得中、AndroidのForeground Serviceとして動作するため、通知領域に動作中であることを表示します。 KANONから通知の許可を求められた場合は、 許可 を選択してください。 6. 英語音声を再生する KANONを開始した状態で、YouTube、ラジオ、動画などの英語音声を再生します。 対応しているアプリであれば、画面上にKANONの字幕ウィンドウが表示され、 英語字幕 ↓ 日本語訳 の順に追加されていきます。 字幕ウィンドウはドラッグして好きな位置へ移動できます。 MIN で小さくし、OPEN で再び開くことができます。 終了するときは、 STOP を押してください。 STOPすると、音声キャプチャ、音声認識、翻訳、フローティングウィンドウ、Foreground Serviceをすべて終了します。 字幕が出ない場合 まず、次の点を確認してください。 OpenAI APIキーが正しく保存されている OpenAI APIに利用可能なクレジットがある 「他のアプリの上に表示」が許可されている START KANON後のAndroidの共有確認で「開始」を押している インターネットへ接続されている 再生しているアプリがAndroidの内部音声キャプチャを許可している 特に最後の点は重要です。 KANONはAndroidの AudioPlaybackCapture を利用していますが、すべてのAndroidアプリの音声を強制的に取得できるわけではありません。 再生側のアプリが内部音声の取得を禁止している場合や、DRMで保護された映像・音声などではKANONから取得できません。 通話音声などの取得を目的としたアプリでもありません。 「他のアプリの上に表示」を許可できない場合 APKを直接インストールした端末や、一部メーカーのAndroidでは、セキュリティ設定によって特殊な権限が制限されることがあります。 通常は、 設定 → アプリ → KANON を開き、右上のメニューなどに 「制限付き設定を許可」 「Allow restricted settings」 が表示されていないか確認してください。 ただし、この項目の有無や場所はAndroidの機種・OSによって異なります。 それでも「他のアプリの上に表示」が許可できない場合は、PCからADBを利用して確認する方法もあります。 $adb = "$env:LOCALAPPDATA\Android\Sdk\platform-tools\adb.exe" & $adb shell cmd appops set jp.masatolab.kanon ACCESS_RESTRICTED_SETTINGS allow & $adb shell cmd appops set jp.masatolab.kanon SYSTEM_ALERT_WINDOW allow & $adb shell cmd appops get jp.masatolab.kanon SYSTEM_ALERT_WINDOW 最後に SYSTEM_ALERT_WINDOW: allow と表示されれば、Android側では重ねて表示が許可されています。 このADB操作は通常は必要ありません。端末の設定画面から許可できない場合の最終手段です。