はじめに

こんにちは、カメのひとあるきです。

帰省できない時こそ、地元を近くに感じたい。
ならば、「AIに広島弁をしゃべらせてみよう」と思い立ちました。作ったのは、広島弁で返事をしてくれるLINEチャットボット

ところが最初はAI任せにすると関西弁など他方言が混ざり、どうにも安定しません。
そこで方針を変更。LLMで標準語の短い1文を生成 → S3の方言辞書で広島弁に置換する“ハイブリッド方式”に切り替えました。

本記事では、どんな構成で動かしているのか、なぜ他方言が混ざったのか、そして辞書置換のハイブリッドでどう解決したのかを順にご紹介します。

広島弁ボットの全体像

  • 最小構成LINE → API Gateway → Lambda → Bedrock / S3 → LINE Reply

  • ひと言送ると 広島弁の一文+地元ネタ(ユーモア文)の一言 の2通が返る

  • Bedrock(Claude)で標準語の短い一文を生成し、S3の辞書置換により方言化。

  • 地元ネタ(ユーモア)の一言は、S3 の hiroshima_humor_list.jsonmessage からランダムで一つ返す。
    ※用意されているものはないので事前に用意しておく必要があります。以下例文。
  {
    "topic": "カープ",
    "message": "今日もしんどいかもしれんけど、カープの応援に負けんよう頑張りんさい!"
  },

LINE Botの基本構成

  1. LINE Developersでチャネル作成

    • Messaging API用のチャネルを作成

    • Channel secretChannel access token を控える

  2. Webhook URLの登録

    • 「Messaging API設定」でWebhook URLを登録

    • 検証を行い「Success」を確認

  3. 署名検証と返信処理

    • Lambdaで受け取ったリクエストに対し、x-line-signatureChannel secret でHMAC-SHA256検証

    • JSONを解析し、イベント内の replyToken を使って Reply API で応答

👉 詳細は公式ドキュメントを参照:

LINE公式:Botを作成する前に
LINE公式:Webhookイベントを受け取る

まずは失敗から:AI 任せの“ワンパス式”で起きたこと

最初の版は単純で、LINEから届いた文章をそのままLambda経由でBedrock(Claude)に渡し「広島弁で返して」とお願いするだけでした。

一見それっぽく返ってきますが、ところどころに関西弁など他方言が混じり、違和感が残ります。

👇チャットの失敗例スクリーンショット。広島っぽさもあるが自然とはかけ離れた返信。・・・難しい。

例えば、広島弁では「そうじゃけぇね」は「そうじゃねぇ」と表現します。また、「がんばっちょかんしゃい」は山口県の方言です。これは、AIが指示だけを頼りに「広島弁らしさ」を創作してしまうためです。語尾や助詞の強いクセに引っぱられやすく、結果として「AIに丸投げするほど広島から遠ざかる」構造になっていました。

解決のカギは「役割分担」—ハイブリッド方式へ

言葉の温度(共感や間合い)は AI、方言の形(語尾・語彙)は辞書に任せます。まず Bedrock(Claude)を一度だけ呼び、決定論寄り(temperature=0 / top_p=0 / top_k=1)で標準語の短い一文を作る。ここまでが AI の仕事です。

そこから先は、S3の方言辞書で機械的に置換します。長い表現から順に当て、途中はプレースホルダで退避して二重置換を防ぎ、最後に60文字へ整えます。締めの地元ネタ(ユーモア文)は hiroshima_humor_list.jsonmessage無加工で一文だけ。結果、AIが体温を整え、辞書が骨格を守る分担に落ち着き、混ざりは止まりました。

S3のデータ構成

S3には以下のドキュメントを入れました。

hiroshima_dialect_data/
├─ phrase_pairs.json # 例: [{"standard":"〜している","dialect":"〜しよる"}]
├─ hiroshima_dialect_expanded.json # 例: [{"standard":"とても","dialect":"ぶち","example":"ぶちうまい"}]
├─ hiroshima_humor_list.json # 例: [{"message":"今日はお好み焼きの口じゃね〜"}]
└─ dialogue_pairs.jsonl # 例: {"user":"疲れた","reply":"無理せんでええよ"}(1行1JSON)

この4点(言い換えルール/語彙拡張/地元ネタ(ユーモア)/参考対話)だけで運用できます。S3を更新すれば即反映されるので、デプロイなしで少しずつ“広島らしさ”が育つのも魅力です。

ポイント:置換は長い順+境界意識+プレースホルダで挙動を安定化。変換を盛り込みすぎると過剰方言になるので、運用で微調整します。

そうして出来上がったものがこちら!

伝わるでしょうか、広島県民としては限りなく合格といえる方言レベルになりました!

運用してみて

方言はルールであり、同時に空気でもあると実感しました。語尾や助詞のゆれ、地名や食べ物に宿る温度まで含めて“らしさ”。だからこそ 温度はAI、形は辞書 の分担が効きます。二通構成とも相性が良いです。最初の一文で今に寄り添い、続くひと言で地元の空気がふっと届く。小さな工夫で、トーク画面に奥行きが出ました。

さらに、S3 にお店や地名、季節ネタを蓄え、必要なときだけ検索して差し込むといった要素も含めばより地元感が味わえるかなと思います。また、気分や用途に合わせて他県の方言へ切り替えるバージョンも面白そうですね。

おわりに

最小構成でも体験は作れる。AIは一回、方言は辞書、更新はS3へ追記するだけ。小さな変更が“らしさ”を積み上げ、混ざりは消えていきました。広島弁の一文と、地元のひと言──それだけで、機械的だったやりとりが、ぐっと人間らしくなります。次は、あなたの方言で。

最後まで読んでくれてありがとうね。また帰ってきんさいよ、待っとるけぇね!