0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

娘(5歳)のためのAI家庭教師を作り始めた③ - 英語フレーズ練習追加篇

0
Last updated at Posted at 2026-07-01

はじめに

前回の記事では、Gemini APIのコストについて書きました。

今回は、娘向けの学習支援アプリに新しく追加した英語のフレーズ練習機能についてです。

英会話は週に数回、リアルの講師とレッスンをしています。そのレッスン音声を録音して AI に評価させる仕組みは最初から設計に入っていました。ただ、それだけだと「週に数回しか使えない機能」になってしまいます。

毎日5〜10分でも続けられる何かが欲しいと、上長(妻)からご意見いただき、今回のフレーズ練習を追加しました。

スクリーンショット 2026-07-01 19.35.11.png


毎日続けるために何が必要か

英語の学習において、継続的なインプットとアウトプットの繰り返しが大事なのは間違いないと思っています。

週数回のレッスンはそれ自体価値がありますが、レッスンとレッスンの間が空いてしまいます。特に5歳の子どもは、間が空くと前回の内容をすっかり忘れてしまうことも多いです。

そこで、毎日できる「短い練習」として、フレーズのシャドーイングを取り入れることにしました。

シャドーイング自体は昔からある学習法ですが、5歳の子どもにとって「何のフレーズを練習するか」という動機づけが必要ということで、そこも例のモンスターを題材とすることにしました。


設計で考えたこと

モンスターを「題材」にする

最初に考えたのは「モンスターの名前を英語で言う練習」でしたが、これは日常英会話にあまり参考にならないと気づきました。

そこで方針を変えて、モンスターを題材(フック)にしながら、実際には日常でも使える英単語を覚えるという設計にしました。

具体的には、タイプ名・色・形容詞・動詞をフレーズの素材にしています。

今日のモンスター = 炎タイプ の場合

フレーズ1: "It is a Fire type."   → タイプ名(Fire, Water, Electric...)
フレーズ2: "It can fly."          → 動詞(fly, swim, run...)
フレーズ3: "It is big and strong." → 形容詞(big, small, fast, cute...)

Fire や Water、big や small は、モンスター文脈で覚えた後も日常で使えます。モンスターはあくまで「入口」という位置づけです。

スクリーンショット 2026-07-01 19.42.34.png

日本語訳はすぐに見せない

最初のUIでは英語と日本語を同時に表示していましたが、これはやめました。

日本語がそこにあると、5歳の子どもは必ずそちらを見てしまいます。英語の音と意味が脳内で結びつく前に日本語で答えが見えてしまうため、シャドーイングの効果が下がると思いました。

かわりに、「どんないみ?」というボタンをタップしたときだけ日本語訳が出る設計にしました。意味を能動的に確認するひと手間を入れることで、英語を先に処理させることを狙っています。

スクリーンショット 2026-07-01 19.43.49.png

モンスターは最後まで内緒にする

当初は「今日のモンスターは○○です!」という発表画面を作っていましたが、これもなくしました。

フレーズ自体がヒントになっているので、練習しながら「なんのモンスターだろう?」と考えてもらえるほうが、ゲームとして面白いと思ったためです。

評価後、ステッカー画像の生成を待って、そのステッカーが答え合わせになる流れにしています。

フレーズ3つを練習(モンスターは非公開)
  ↓
AI 総合評価
  ↓
ステッカー生成(このタイミングで正体が明かされる)

フレーズデータの準備

全モンスター分のフレーズをどう用意するかが最初の課題でした。

「事前に Gemini に生成させる」という案もありましたが、毎度お金かけて生成することもないので、、事前にデータファイルとして作成しておきます。

各モンスターに3フレーズ、カテゴリ(タイプ・色・形容詞・動詞・特徴)を持つ構造にしています。

// 抜粋・イメージ
export const CHARACTER_PHRASES: CharacterPhrase[] = [
  {
    no: 25, // 電気タイプのモンスター
    phrases: [
      {
        english: "It is an Electric type.",
        japanese: "でんきタイプです。",
        category: "type",
      },
      { english: "It is yellow.", japanese: "きいろです。", category: "color" },
      {
        english: "It has red cheeks.",
        japanese: "あかいほっぺがあります。",
        category: "feature",
      },
    ],
  },
  // ...
];

全モンスター × 3フレーズで、合計453フレーズになりました。


実装

お手本音声(TTS)

サンプル音声は Web Speech API を使っています。ブラウザ標準なので追加コストがかかりません。

ただし、デフォルトでは OS の低品質な音声が使われてしまいます。speechSynthesis.getVoices() で利用可能な音声一覧を取得し、実績のあるネイティブ英語音声を優先して選ぶようにしました。

const GOOD_VOICES = [
  "Samantha", // macOS / Safari(US女性)
  "Google US English", // Chrome
  "Google UK English Female", // Chrome
];

リストにある音声が見つからなければ、ブラウザのデフォルトに任せます。中途半端なフォールバックより、デフォルトのほうがマシなケースがあったためです。

話す速さは rate: 0.4(通常の40%速度)を基本にして、さらに遅い rate: 0.1 のボタンも並べています。

[ピクチャ:「きいてみよう」「🐢 ゆっくり」ボタンが並んだ画面]

録音

録音は MediaRecorder API を使っています。

ボタンを押したら録音開始、もう一度押したら停止、という単純な設計です。録音後は自分の声を聞き直せるボタンも用意しました。

何度でも録音し直せて、最後に録音した音声だけが評価に送られます。

const recorder = new MediaRecorder(stream);
recorder.ondataavailable = (e) => chunks.push(e.data);
recorder.onstop = () => {
  const blob = new Blob(chunks, { type: "audio/webm" });
  // 録音URLを更新、最後の録音だけ保持
};

Gemini Audio による評価

3フレーズの録音が終わったら、まとめて Gemini に送って総合評価を受けます。

const response = await ai.models.generateContent({
  model: "gemini-3.5-flash",
  contents: [
    {
      role: "user",
      parts: [
        { text: `フレーズ1「${phrase0}」の音声です:` },
        { inlineData: { mimeType: "audio/webm", data: b64_0 } },
        { text: `フレーズ2「${phrase1}」の音声です:` },
        { inlineData: { mimeType: "audio/webm", data: b64_1 } },
        { text: `フレーズ3「${phrase2}」の音声です:` },
        { inlineData: { mimeType: "audio/webm", data: b64_2 } },
        { text: buildPrompt([phrase0, phrase1, phrase2]) },
      ],
    },
  ],
});

1回のリクエストに3つの音声ファイルとプロンプトをまとめて送ります。分けて送るより、文脈をまとめて渡せるので総合評価に向いていると思いました。

2026年7月時点では gemini-3.5-flash を使っていますが、精度やコストの状況を見て、今後別のモデルに変更する可能性もあると思っています。


評価プロンプトは要改善

最初のプロンプトは「迷ったら good を選ぶ」「5〜6歳なりの発音を考慮する」という方針にしていました。

実際に動かしてみると、無音のまま送っても「たいへんよくできました」が返ってくるという状況になりました。

原因はプロンプトの緩さにありました。評価基準を厳格に書き直して、以下の点を明示しました。

  • 無音・ほぼ無音は必ず try にする
  • 「なんとなく言えている」は good であり excellent ではない
  • 日本語なまりが強い場合は good 以下
  • excellent は本当によく発音できている場合のみ

評価は子どもへの動機づけに関わるので、甘すぎると意味がなく、辛すぎるとやる気が落ちます。このバランスはまだ調整中です。


現在できていること

  • ひらがな・カタカナ評価
  • 英語フレーズ練習(シャドーイング + AI評価)
  • 英語チャンネル選択(フレーズ / レッスン)
  • ステッカーへの取得チャンネル記録
  • 英会話レッスン評価(講師音声アップロード)
  • ピアノ評価
  • UIちゃんとする
  • 評価精度のブラッシュアップ(継続中)

まとめ

毎日続けるための仕組みとして、フレーズ練習を追加しました。

モンスターを題材にすることで「今日のモンスターは何だろう?」という動機が生まれ、実際に学べる単語はタイプ名・色・形容詞・動詞など日常でも使えるものにしています。

日本語訳を即座に見せない設計や、モンスターを最後まで隠すクイズ要素は、5歳の子どもの集中を引き出すためのUX的な工夫です。

評価プロンプトの甘さはまだ調整が続いています。AI の評価を子どもの学習に使う場合、精度と動機づけのバランスをどう取るかは一朝一夕では決まらないと感じています。

次は、講師とのレッスン音声を使った英会話評価の実装を進めます。

関連記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?