にわか方言翻訳機をGemini Pro APIのAIでつくってみた

皆さんは県外の人が地元の方言を喋っていて「なんかちょっと違うな〜」と思うことはありませんか？関西圏の方言なんかはもらいやすい人多い気がします。自分の昔の福岡上司は1週間だけ大阪へ出張して以来ずっと関西弁風になってしまっています。

でもやはりにわかはにわかなのでネイティブ方言と比べるとやっぱり違うんですよね。そのなんか違うな〜の感覚、これをいつでも再現できるとすれば再現したいと思いませんか？

.......すぅ、えぇ、さすが、そうですよね。そう思いますよね？思いますに決まってますよねぇ?!!!!

そんな皆様のご要望に応え、この度は方言精度の高いとはいえないAIに方言を喋らせることによってあたかも県外民が無理して方言話してるような「なんかちょっと違うな〜」感を各方言で手軽に楽しめるサイトをつくってみました。

この記事は地元民でありながら福岡の方言に対してエセ方言と言われたことのある悲しい人間によって書かれています。

## 成果物
https://hougen.aminosan.app/

![Mar-15-2024 11-57-03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651103/975cd80e-dd58-10a3-8f0a-f79ce7fb5a6b.gif)

地元が福岡なので違和感しかない翻訳結果が出ました。
日本語でかつ日本語の方言はおそらく学習量が少ないことが理由かもしれません。

## 使った技術
React,TS,Vercel,Gemini Pro API

ChakraUI用のcreate-react-appで環境は作りそのままベタがきで作りました。

## つくったきっかけ
エンジンメーカー(ギークハウス) @enginemaker の住人からGeminiのAIが無料で使えると聞いてAI系でアプリをつくってみたかったのでお試しで平日ど真ん中の火曜の晩にノリと勢いで作りました。（スタイル変えたりシェアボタン作ったり、サムネやドメイン設定は別日にやった）

### Geminiを使った理由
無料で使えるからです。従量課金の何か想定していない理由でとんでもない料金を請求されるのではないかという恐怖がありません。

### 今のをにわか博多弁で
タダやけん。使った分だけ払えばよかろうもん。どげんわけかわからん理由でばか高い料金請求されるっちゅう怖さがないばい。

## 仕組み
単純にpromptを事前に仕込んでおいてクリックすると引数として選択した方言と入力されたテキストを渡してレスポンスを待っているだけです。
ここの処理で色々と遊べる余地がまだまだありますね。

### モデルをチューニングする機能
まだ使っていないのですがGeminiではGUI操作からモデルをチューニングできるそうで、csvデータをimportすればいけるそうです。自分のようにPythonは軽くしか触らない人にとっては実装せずにチューニングできるのは嬉しいです。

![スクリーンショット 2024-03-13 19.22.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651103/1e3c70a1-9f61-dad9-ad6b-77f8196e3f33.png)


## つまづきポイント
デフォルトで入力される言葉に対してブロッキングが設定されていました。デフォルトは結構厳しいようで「好きです。付き合ってください」という言葉も有害なワードとして弾かれました。

### safetySettingsで対処
下記のようにsafetySettingsのプロパティを設定しました。
最初は適当にGoogle公式ドキュメントなどを参照してHARM_CATEGORY_HARASSMENTなどの設定を文字型としてそのままコピペして設定していたもののエラーのレスポンスを吐きます。

これは文字列ではなくenumだったからなのですが、typeをimportして使うようにしましょう。

下は実際のコードと少し違いますが概ね下のように実装しました。

```typescript
import { GoogleGenerativeAI, HarmCategory, HarmBlockThreshold } from '@google/generative-ai'

const generationConfig = { //適当に設定しているだけ
    "candidate_count": 1,
    "max_output_tokens": 256,
    "temperature": 1.0,
    "top_p": 0.7,
  }
  
const safetySettings= [
    {
      "category": HarmCategory.HARM_CATEGORY_HARASSMENT,
      "threshold": HarmBlockThreshold.BLOCK_NONE,　// BLOCK_NONEは規制しないの意
    },
    {
      "category": HarmCategory.HARM_CATEGORY_HATE_SPEECH,
      "threshold": HarmBlockThreshold.BLOCK_NONE,
    },
    {
      "category": HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
      "threshold": HarmBlockThreshold.BLOCK_NONE,
    },
    {
      "category": HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
      "threshold": HarmBlockThreshold.BLOCK_NONE,
    },
  ];

const model = genAI.getGenerativeModel({ 
          model: 'gemini-pro',
          generationConfig,
          safetySettings
        });

// 適当に非同期関数の中でリクエストを投げる
const prompt = "これはpromptです。を沖縄弁にして";
const result = await model.generateContent(prompt);
const response = await result.response;
const text = response.text();

console.log(text) // "くゎっちー、ぷろんぷとぅやいびーん"

```

## 思わぬ収穫
無料で使えるからというインターネット的な乞食マインドでGeminiを触ったわけですが、こんなネタアプリでも開発者と認めてもらえた？ようで次世代の Gemini 1.5ver の無料枠として100万トークン(70万単語くらい使えるらしい。たぶん英語の話しだけどかなり十分)をもらえました。
![スクリーンショット 2024-03-14 17.06.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651103/d207353b-eaa1-767c-7b9d-c0fb076e169b.png)
お財布が痛まないという安心感でアプリを作れるのは精神衛生上とても良いのでみんなも気軽に使ってみてゲットを目指すことをお勧めします。

## 今後のやる気が出たらやっていこうな展開
・ネタやカスタム方言を設定できるようにする
・Gemini側で精度を高めるための設定をする
・Promptの精度を上げる
・入力されたデータを集め人気のある文章を定型文として入力できるようにする
・Gemini以外に無料のAIがあったら使えるようにする
・UI改善

## 最後に
ちゅーらさん、ここまで読んじょうてぃーちゅーがなびら。
うちなんちゅ、Gemini Pro API使っち、もっとおもしろいもん作っちょーてぃきーやいびーん！

(ここまで読んでくださってありがとうございます。
これからもGemini Pro APIを使ってもっと面白いものを作っていきたいです！の意)