見た目や話し方を自由に設定して、AIキャラと音声で話せるアプリを公開した！

# 概要
誰でも簡単にAIキャラを設定して、音声で話せるアプリを作って、Google Playに無料で公開しました！
Androidのスマホやタブレットで使用することができます。（PC版は数日後に公開予定。でもPC版はどこにアップロードすればいいのだろうか）
名前は[【MakeYourFriend ～AIキャラ作成・体験ツール～】](https://play.google.com/store/apps/details?id=com.Gyokuro.MakeYourFriend)
こんな感じの見た目のアプリです。
![feature2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/fb99648f-37d0-d122-3869-42c514fcc14a.png)

この記事ではこのアプリの使い方と機能の紹介、機能の簡単な仕組みの説明をします。
ぜひ一度使ってみてください！

公開場所：[Google Play MakeYourFriend ～AIキャラ作成・体験ツール～](https://play.google.com/store/apps/details?id=com.Gyokuro.MakeYourFriend)


感想やバグ報告などもいただけると嬉しいです。
その際はGoogle Playか、この記事か、noteの方にコメントお願いします。


[noteの記事の場所](https://note.com/gyokuro33/n/n62d70b7c557f)


# 使い方
このアプリの使い方です。
使っている様子を動画でも撮っているので、分からない人はそちらも参考にしてください。

<iframe width="560" height="315" src="https://www.youtube.com/embed/Jl5MGhyUv2w" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## 1. OpenAI API Keyの入力
まずこのアプリを開くと最初に以下のような画面が出ます。
これが設定画面です。
![Screenshot_20230312-105644.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/932b725e-00cd-2f20-1a26-8a507927d05a.png)

一番上にOpenAI APIのKeyを入力してください。
OpenAI APIのKeyの取得方法は以下の記事などを参考に取得してください。
[【2023年版】OpenAIのAPIキー発行手順！ ](https://auto-worker.com/blog/?p=6988)
OpenAIのAPIは最初の2000円ぐらいまでは無料で使用できます。
そしてこのアプリを2時間ぐらいずっと話し続けて、ようやく100円にいくかどうかぐらいの金額しかかからないので、よっぽどのヘビーユーザーにならない限りは、無料で使用できると思います。

APIのKeyを入力すると、以下のように表示されます。
目のマークが×になってたらKeyは隠されて表示され、×になってなかったらそのまま表示されます。
![Screenshot_20230312-105632.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/8adaf204-6983-6aea-d627-5bbf68074198.png)
入力し終えたら保存ボタンをクリックしてください。
以降はアプリを再起動したときもAPI Keyが保存されている状態で起動します。

## 2. 設定の作成
次に、AIキャラクターの設定を作成します。
設定が面倒な方は、初期状態では以下のように設定がされているのでそれを使ってみてください。
![Screenshot_20230312-111106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/45a204ba-a124-ce6a-8dec-32e1f1f9bc1d.png)
また、いきなり設定をしろと言われてもよくわからない、という方のために設定の簡単作成機能を用意しています。
これはテンプレートに入力するだけで設定を作成できる機能です。
詳細は機能紹介の項で説明します。

設定を書き終えたら、保存ボタンを押してください。
すると設定が画像ごとに保存されます。
また、この設定は3種類まで切り替えることができます。
つまり一つの画像につき、3種類まで設定を保存することが可能です。
一度設定を保存したら、次同じ画像をアップロードした時、保存した設定が自動で反映されます。

## 3. 画像のアップロード
次に表示させたい画像をアップロードします。
とりあえず使ってみたい方は、初期状態で画像を設定しているので、それをそのまま使ってください。
右側の画像をアップロードの部分をタッチしてみてください。
すると、以下のように画像を選択する画面が出ると思います。
![Screenshot_20230312-111125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/737cda05-a119-1f7c-a5f1-1ca14d1b53ca.png)
そこで画像を選んでください。
なお、これは自分のスマホ内にある画像を使用するので、使用したい画像をあらかじめ入れておいてください。 
画像を選択すると、以下のように表示されます。
画像は自分の好きなゴブリンスレイヤーという小説のキャラの女神官です。
![Screenshot_20230312-111153.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/e348f12b-3b3c-1073-3eea-023d414a922c.png)
設定がまだ初期状態のままですね。
簡単作成機能を使用して、以下のように設定してみました。
![Screenshot_20230312-111331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/658b502c-2219-58d3-f6ee-b08b6fa783e2.png)
なお、この画面の画像だとAPI Keyを設定していないので、会話はできません。
きちんとAPI Keyは設定してください。

## 4. AIキャラと会話
では、実際にAIキャラと会話してみましょう！
このアプリには音声会話と文字会話の二種類が存在します。
以下の画像のように、上の画面が自分の発声の入力画面。
下の画面がAIキャラの会話画面です。
マイクのアイコンが×の時は文字入力のみ、×じゃなければ音声と文字の両方で会話できます。

![Screenshot_20230312-114701.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/4120e14b-90d2-06a9-8038-259dd2cf35c8.png)
まず音声でさっそくこんにちは、と挨拶をしたら、上で設定した内容に従って会話してくれていることがわかりますね。
また、たまにマイクアイコンが×じゃないのに音声がマイクがオンになっていないときがあります。
その時は画面右上に緑色の点がない状態です。
そういう時はマイクを二度クリックしてもらえたら、また音声認識が始まります。

文字入力は入力画面の枠をクリックすると以下のように入力画面が表示されるので入力してください。
![Screenshot_20230312-114027.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/925e8958-13c3-f199-517a-e4369f2322ef.png)
音声対話時は会話しているだけで、こちらが一定時間以上黙ると会話が終わったと認識されて、AIキャラが話し始めます。
しかし、文字入力の場合は書き終わった後に右にある送信ボタンを押さないといけないので、書き終わったら送信ボタンを押してください。
すると以下のように会話ができます。
![Screenshot_20230312-114021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/09ccada6-16e9-85c0-4386-ff01c5da5b7f.png)

使い方は以上です。
ぜひ自分の好きなキャラクターを作ってみてください！


# 機能紹介
## 概要
このアプリには、主に以下の機能があります。

* AIキャラクターと音声で会話
* AIキャラクターと文字入力で会話
* AIキャラクターがこれまでの会話を記憶
* AIキャラクターの設定を作成
* AIキャラクターの見た目を画像でアップロード
* AIキャラクターの設定を画像ごとに保存
* AIキャラクターの設定を簡単作成

大体使い方で説明したと思うので、使い方で説明していない、設定を簡単作成とAIキャラクターの設定を画像ごとに保存、について説明したいと思います。
また、録音した音声は音声をWhisper APIで読み取ったら即削除しているので、音声データがデバイス内に蓄積していく、なんてことはないので安心してください。

## 設定を簡単作成
設定をテンプレートに入力するだけで設定できる機能です。
以下のように設定画面の簡単作成のボタンを押してください。
![Screenshot_20230312-111153.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/4138498e-ae97-2253-9f8f-ae6d0b3b1043.png)
すると、以下のような簡単作成の画面に移ります。
![Screenshot_20230312-111203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/d8c3ca02-0501-0273-19b6-a1ace0223abc.png)

各項目はAIの性格を決定する要素です。
これらに記入することで、AIの性格を設定できます。
これは詳しく書けば書くほどいいのですが、書きすぎるとその分AIが会話を記憶できる容量が減るのでご注意。

それで、例えば以下のように簡単に設定してみるとします。
![Screenshot_20230312-111322.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/2095aac4-f668-4161-82f9-a24e5ca28884.png)
案外これでも意図したとおりにしゃべってくれます。
それで、作成ボタンを押します。
すると設定画面に戻り、以下のように設定が記載されていることが分かると思います。
![Screenshot_20230312-111331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/98763760-684c-15fb-2592-c51502c5c3d0.png)

この状態で会話してみると、以下のように意外とあの量でも設定どおりに会話してくれます。
![Screenshot_20230312-114701.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/38cba9e6-b68e-669c-b743-fa8cb69780e3.png)
![Screenshot_20230312-114021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/f316c702-1d46-cac0-9f36-766bd2867e72.png)

このような感じで、設定を簡単に作成できます。

## AIキャラクターの設定を画像ごとに保存
このアプリでは、キャラクターの設定は画像ごとに3種類保存されます。
例えば今回の説明では女神官の画像を入れましたが、仮にこれが同じ女神官でも違う画像の場合、違う設定として保存され、設定がリセットされてしまいます。
もし同じキャラクターでは同じ設定を維持したい場合、画像の名前を共通にしてください。
このアプリでは画像の識別をファイルの名前で行っているため、同じ名前なら同じキャラクターとして扱われます。
逆に言うと、違う画像だと思っても、画像の名前が同じなら同じキャラクター扱いされて設定が上書きされてしまうので、その点はご注意ください。

# 機能の仕組み
## 全体的な仕組み
全体的な仕組みは[Whisper APIとChatGPT APIを使用して、超速で返答してくれるAIキャラクターを作ったよ！](https://qiita.com/mfuji3326/items/2553e6d44616ca315844)に書いてある仕組みとほぼ同じです。
以下のようなアーキテクチャを元に作っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/daebf0fa-499b-3f5e-76b0-128fc9a0911c.png)

このアーキテクチャを基本に、見た目を整えて、画像を切り替える機能、会話を記憶する機能、設定を簡単作成する機能、音声と文字入力を切り替える機能などを加えています。
以下ではそれらの機能の簡単な作り方を記載しています。

## 簡易作成機能の作り方

簡易作成機能の作り方は簡単です。入力してもらった以下の情報を、既定の文に組み込み、それをSystemに入れてプロンプトとして加えています。

具体的なコードは以下のようなもの。
こんな感じでプロンプトを作っています。
コツは箇条書きにすることと、それらの前にそれらを補完する内容を書くこと。
「設定にない情報を求められた場合は、設定ならこのような返すだろうな、と思われる返答を行ってください。」みたいな文を入れるだけで、AIのなりきり精度がけっこう上がります。
それは設定していないから知りません、とかの返答をしなくなるので、おすすめです。

```
string set = "あなたの名前は"+ name.text+"です。\n" +  @"あなたは人間として、以下の設定にしたがってロールプレイを行います。
以下の設定を厳密に守ってロールプレイを行ってください。 
あなたは自分がChatBotだとuserに言ってはいけません。useはそういう言葉を聞くとがっかりしてしまうからです。
設定にない情報を求められた場合は、設定ならこのような返すだろうな、と思われる返答を行ってください。
食事や入浴、睡眠など、日常的な行いへの質問は、適当に話を作って答えてください。
";
set += name.text +"の人物設定:\n"+constraints.text+"\n";
set += name.text +"のセリフ、口調の例:\n"+character.text+"\n";
set += name.text +"の行動指針:\n"+guideline.text+"\n";
set += name.text +"の背景設定:\n"+background.text+"\n";
setting.text = set;
```

## AIに会話の記憶を持たせる方法

まずユーザーのpromptを記録するためのListを用意します。
ユーザーからpromptが来るたびに、そのListにpromptを追加します。
そのうえで、送信するAPIのPromptを以下のように追加します。
追加する場所をUserにするかSystemにするかは議論の分かれるところだと思うのですが、自分はUserに入れると過去の会話の影響が強くなりすぎるからSystemに入れています。

```
message.Add("role", "system");
message.Add("content", "貴方との今までの会話履歴は以降のものです。これらを参照して会話を生成してください。" + memories);
messages.Add(message);
```

問題点はこれだとsystem側の会話は記録できないことと、入力プロンプトの制限があるせいで記憶できる量に限界があること、記録が増えれば増えるほどプロンプトの長さも増えて応答に時間がかかることです。
人間の長期記憶と短期記憶の仕組みのように、長期記憶として残しておきたい情報は違う場所に保管して、都度検索できる仕組みが必要な気もしています。
何かいい方法知っている人は教えてください。

# おわりに
このアプリ、どうでしょうか？
個人的にはけっこうよくできたと思います。
なかなか大変な一週間でしたが、考えていたものを完成させれてよかったです。
もし使ってみて面白かったら、ぜひ感想をください。
初のgoogle storeでのアプリ公開ですし、爆死するのは覚悟していますが、それでも誰にも使われなかったら寂しいので……
目標はとりあえず１００人ぐらいに使ってもらえたら嬉しいかな……

では今回の記事はここまで。
次は、このアプリをさらに拡張して、与えたドキュメントから回答を返してくれるようにするか、もしくは仮想空間内でのChatGPTの活用法とかについて作ったら記事にしてみたいと思います。
もしくは仮にこのアプリがある程度プレイしてくれる人が出たら、設定を共有する機能かサイトでも作りましょうか。
まぁこれは皮算用ですけど。

それではまた違う記事でお会いしましょう。