🔖

英語の発音をAIで“音そのまま”カタカナに変換するWebアプリを作りました

に公開

「Katakanizer」を作りました

英語をはじめとした外国語の発音を、AIで“音に忠実な”カタカナに変換するWebアプリ「Katakanizer」をリリースしました。

https://katakanizer.lydear.com

どんなアプリか

英文を入れると、AIが「翻訳」ではなく「音」をカタカナに直してくれます。
特徴は、ひとつの英文に対してカジュアル版とフォーマル版の2種類のカタカナが出てくることです。
たとえば I called you yesterday を入れると、こんな感じです。

  • カジュアル:アイコールジュイェスタディ
  • フォーマル:アイ コールド ユー イェスターデイ

カジュアルはリエゾンやリダクション込みの“実際にネイティブが喋っているっぽい音”、フォーマルは1単語ずつはっきり読んだときの音、というイメージです。
英語のほかに、韓国語・フランス語・スペイン語・ドイツ語・イタリア語・ポルトガル語・中国語・日本語の合計9言語に対応しています。

使い方

英文(または対応言語のテキスト)を入力して送信するだけです。
フレーズ単位で「原文 ↔ 発音」が並ぶので、どの単語がどう発音されているのか見ながら音読する用途に使えます。
変換した結果は履歴として残り、お気に入りに入れておけば後から復習できます。
無料で1日5回まで使えます。

技術スタック

  • フロントエンド:Next.js 16 + React 19 + TypeScript + Tailwind CSS
  • バックエンド:FastAPI + Python(uv管理)
  • AI:OpenAI GPT-5.1(Responses API + Structured Output)
  • 認証:Firebase Authentication
  • データベース:PostgreSQL(Neon)
  • デプロイ:Vercel(フロント・APIともに)

作った理由

英語を聞き取れるようになりたいときに、教科書的な「アイ コールド ユー」を覚えてもネイティブの I called you には全然聞こえなくて、結局聞き取れない、ということがよくあります。
実際の音は「アイコールジュ」みたいに繋がって、短くなって、消えたりする。これをそのままカタカナで書けるなら、リスニングと音読の練習に使えるんじゃないかと思って作りました。

開発で大変だったところ

「翻訳」ではなく「音」を返してもらうプロンプト調整

一番試行錯誤したのがこれです。
普通にプロンプトを書くと、AIはどうしても「翻訳」をしようとします。I called you yesterday を入れると「私は昨日あなたに電話しました」を意識した結果が返ってきて、音とはズレたカタカナになってしまう。

なので、

  • これは翻訳ではなく 音の表記変換 であるとはっきり書く
  • 自然な発話の区切りでフレーズに分けて、フレーズ単位で casual / formal を返してもらう
  • カジュアル版にはリエゾン・リダクションを反映するよう例示する
  • 同じフレーズが繰り返し出てきても、出てきた回数ぶん必ず返すよう明示する

といった指示を積み重ねて、ようやく「音のカタカナ化」をしてくれるようになりました。

地味ですが「繰り返し出てきた表現を勝手にまとめないでね」を明示するのが効きました。これを書く前は、同じフレーズが2回出てくる文だと2回目をしれっと省略してくることがあって、原文とカタカナがズレてしまっていました。

Structured Output で“パースできない返答”をなくす

AI の返答を JSON にパースして UI に並べる必要があったので、最初は普通にプロンプトで「JSON で返して」とお願いしていました。が、たまにカギカッコの数が合わなかったり、説明文が混ざってきたりして、パースに失敗することがありました。

なので OpenAI の Responses API の Structured Output に乗り換えて、Pydantic でスキーマを定義する方式にしました。

class PhraseMapping(BaseModel):
    phrase: str
    casual: str
    formal: str

class ConversionResponse(BaseModel):
    phrases: list[PhraseMapping]

response = client.responses.parse(
    model="gpt-5.1",
    input=[{"role": "user", "content": prompt}],
    text_format=ConversionResponse,
)
result = response.output_parsed

これでパース失敗がほぼなくなり、フロントエンド側で「壊れたレスポンス用のフォールバックUI」みたいなものを書かなくて済むようになりました。

長文を並列で投げる

英語の発音をカタカナ化したい場面って、1文だけじゃなくて、洋楽の歌詞1番ぶんとか、スピーチの段落とか、わりとまとまった長さを一気に変換したいことが多いんですよね。
これを1回のAIリクエストに全部投げると、レスポンスは遅いし、たまに後半を勝手に省略されたりします。
なので、

  • 入力が1000文字を超える場合は、文末記号(. ! ?)で区切って ~1000文字単位のチャンクに分割
  • 各チャンクへの変換を ThreadPoolExecutor で並列実行
  • 返ってきた結果を phrase_mappings として連結

という処理にしました。

with ThreadPoolExecutor(max_workers=3) as executor:
    futures = {executor.submit(self._convert_short_text, chunk, language): chunk for chunk in chunks}
    for future in futures:
        result = future.result()
        if result and result.get("phrase_mappings"):
            all_phrase_mappings.extend(result["phrase_mappings"])

直列で投げていたときは長文だと体感5〜10秒かかっていたのが、3チャンクなら2〜3秒で返ってくるようになりました。

おわりに

無料で1日5回まで遊べます。英語のリスニングや音読で「教科書の読み方とネイティブの音が違いすぎる」と感じたことのある人に、ちょっと使ってみてもらえたら嬉しいです。

https://katakanizer.lydear.com

Discussion