一日で俺の嫁を作る方法　～一日で自分の好きな声・キャラ・見た目でおしゃべりしてくれるAIキャラクターを作ろう～

# はじめに
いくつかのAPIを組み合わせることで、一日で自分の好きな声・キャラ・見た目でおしゃべりできるAIキャラクターを作りました。この記事を読めば同じ感じで誰でも一日で俺の嫁を作ることができるようになります。
また今回はVR環境版とスマートフォン環境版の二種類を作成しました。
これらのアプリとUnity Projectは以下のgithubで公開しています。
軽く試してみたい人は作り方の6に従って、AgentCraftでAIの会話例を作成して、それをSebastienでデバイスIDとして発行すれば試すことができます。詳しくは6および6に載せている資料をご覧ください。
https://github.com/gyokuro33/ai-agent

# 何を作ったか
こんなのです。

スマートフォン版
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">俺の嫁を一日で作ってみた <a href="https://t.co/c3xbmofXH8">pic.twitter.com/c3xbmofXH8</a></p>&mdash; おろろ (@ororo33) <a href="https://twitter.com/ororo33/status/1207275425509982208?ref_src=twsrc%5Etfw">December 18, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

VR版
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">VRバージョン <a href="https://t.co/jUok4d38qu">pic.twitter.com/jUok4d38qu</a></p>&mdash; おろろ (@ororo33) <a href="https://twitter.com/ororo33/status/1207329068321869824?ref_src=twsrc%5Etfw">December 18, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 使用したもの

NTTドコモの[Agentcraft](https://agentcraft.sebastien.ai/) : AIエージェント作成ツール
NTTドコモの[SEBASTIEN](https://users-v2.sebastien.ai/dashboard/) :  AIエージェント基盤
SEBASTIENと音声対話するための[Unity向けSDK](https://aiagent-document.s3-ap-northeast-1.amazonaws.com/agentcraft_tutorial/sdk_for_unity_beta.zip)
Oculus社の[Oculus RiftS](https://www.oculus.com/rift-s/)　もしくはOculus LinkでOculus Riftsと同様に操作可能にした[Oculus Quest](https://www.oculus.com/quest/)
Oculus社の[OVRLipsync](https://developer.oculus.com/downloads/package/oculus-lipsync-unity/) : 3Dモデルに音声に合わせた口パクを行わせるツール
Unity Technolosies Japanの[unity chan!](https://unity-chan.com/) © UTJ/UCL　: 3Dモデル。可愛いくて様々なポーズや表情が揃っている。違うキャラが作りたい人は自分の好きなキャラの3Dモデル
[Unity(2018.4.13f1)](https://unity3d.com/jp/unity/whats-new/2018.4.13) : ゲーム開発エンジン
適当なAndroidのスマートフォン

# 参考にした記事
[ドコモAIエージェントAPI](https://docs.sebastien.ai/step4/agentcraft-howtouse/#specific_functions)
[【UnityC#講座】ユニティちゃんの表情を替える【SetLayerWeight】](https://unity-shoshinsha.biz/archives/626)
[キャラクターを喋らせる！OVR Lip Syncの導入から問題発生時の解決法まで](https://blog.gcrest.com/archives/404)
[Unityで作る！ドコモAIエージェントAPIを使った音声対話アプリ作成ハンズオン](https://aiagent-document.s3-ap-northeast-1.amazonaws.com/agentcraft_tutorial/sdk_for_unity_beta_handson.pdf)

# 構成図
アプリの仕組みは以下のようになっています。
基本アプリ側で行うのはグラフィックの描画と音声のInput,Outputのみで、それ以外の音声認識や音声合成、会話作成などは連携するAPI先で処理しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/8d5c53e7-6cc9-65af-2f67-e3bc5cde3dcd.png)




# 作り方

以下の手順に従っていけば、AIキャラクターを表示させておしゃべりを楽しむことができるようになります。
#### 1. 使用したものの欄にあるものをすべてダウンロード
バージョン指定されているものはそのバーションのものを。バーション指定されていないものは最新のものをダウンロード。

#### 2. Unityに空のプロジェクトを作成する

#### 3. ダウンロードした以下の三つのファイルを作成したプロジェクトにインポートする
1. SEBASTIENと音声対話するためのUnity向けSDK
2. OVRLipsync
3. Unity Chan

インポートの方法は以下の記事を参考にしてください。
[パッケージのインポート](https://yttm-work.jp/unity_beginner/unity_beginner_0008.html)

#### 4.  Asset/Sebastien/Scenes/mainのシーンを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/02dcb324-9049-cbf3-4d60-2322782413d6.png)

#### 5. 以下の記事を参考に、Unitychanが音声を再生することで口パクしてくれるようにする

[キャラクターを喋らせる！OVR Lip Syncの導入から問題発生時の解決法まで](https://blog.gcrest.com/archives/404)
ただし最新のOVRLipsyncを使う場合ならVisemeToBlendTargetsの設定は記事とは異なり、以下のように設定する必要があります。
またUnity chan以外をしゃべらせたい場合は違う3Dキャラクターを同様の手順で設定して、口パクできるようにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/300e7644-7a33-ed43-2f1e-af2690c7459e.png)

#### 6. 以下のハンズオン資料に従って、エージェントとの対話までできるようにする

[Unityで作る！ドコモAIエージェントAPIを使った音声対話アプリ作成ハンズオン](https://aiagent-document.s3-ap-northeast-1.amazonaws.com/agentcraft_tutorial/sdk_for_unity_beta_handson.pdf)
対話内容はお好みで。この段階で、キャラがしゃべる声や会話内容などを作成します。
Agentcraftの詳しい使い方や作り方は[ここ](https://docs.sebastien.ai/step4/agentcraft-howtouse/#specific_functions)に載っています。
簡単に説明すると、会話については以下のように発話例とそれへの応答を決めることで、会話への対応パターンを作ることができます。
またキャラクターの声は以下のように、50以上の声から選ぶことができます。声のサンプルは[ここ](https://docs.sebastien.ai/voice-model/)で聞くことができます。
さらにこれらの声は声質や話速、抑揚、声の高さなど様々なパラメーターをチューニングすることで、自分だけの声を作ることも可能です。
また以下の動画のように、会話中に声を変更することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/3c90d171-a7ce-5d3d-4a10-91567bf3bc6f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/15a11719-e913-3f8a-0f04-c13c0b79dbe2.png)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">違う声で話すようにお願いする <a href="https://t.co/wJqrcvy8OB">pic.twitter.com/wJqrcvy8OB</a></p>&mdash; おろろ (@ororo33) <a href="https://twitter.com/ororo33/status/1207333221689544704?ref_src=twsrc%5Etfw">December 18, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
#### 7. SpeakToLipsyncというC#スクリプトを書き、手順5で作成したLipSyncSoundに追加する
コードの内容は以下のもの。
書いている内容としては、Sebastienが合成した音声をOVRLipSyncで再生させることで、言った内容と同じことを口パクしてくれるようにする、というもの。

```C#:SpeakToLipsync.css
using System;
using UnityEngine;
using System.Diagnostics;
using Debug = UnityEngine.Debug;
using System.Threading;

public class SpeakToLipsync : MonoBehaviour

{
    public AudioSource currentAudioSource = null;
    public AudioSource speakAudioSource = null;
    public GameObject speakOb;

    private AudioClip beforeAudioClip;

    void Awake()
    {
        speakAudioSource = speakOb.GetComponent<AudioSource>();
        if (!currentAudioSource) currentAudioSource = GetComponent<AudioSource>();
        if (!currentAudioSource) return; 
        
    }
    // Start is called before the first frame update
    void Start()
    {
        currentAudioSource.mute = false;
        beforeAudioClip = speakAudioSource.clip;

    }

    // Update is called once per frame
    void Update()
    {

        if (beforeAudioClip != speakAudioSource.clip)
        {
            currentAudioSource.clip = speakAudioSource.clip;
            currentAudioSource.Play();
        }
        beforeAudioClip = speakAudioSource.clip;


    }

}

```

#### 8. SpeakToLipsync.cssのSpeakObにHierarchyにあるSpeakを入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/ffa0654c-da9e-eda2-1317-33cec5142f55.png)

#### 9. HierarchyにあるCanvasのGameObjectを非アクティブにする

#### 10. Asset/Sebastien/Example内にあるExample.cssを以下のように変更する

関数Startの一番最後、speak.start();の次に以下の二行を入れてください。

```C#
speak.cancelPlay();//音声再生をキャンセルする
speak.unmute();
```
また関数onPlayEndに以下の一行を入れてください。

```C#
speak.unmute();
```
こうすることで、AIキャラクターが常に音声を聞いて反応してくれるようになります。


#### 11. （VR版を試したい場合は）Player SettingのXR SettingからVirtual Reality Supportedにチェックを入れて、VRに対応できるようにする。



#### 12. （android版を試したい場合は）使用プラットフォームをAndroidに変える

#### 13. 各デバイスをPCにつなぐ
#### 14. アプリをBuild&Runする
# 応用例
以上に書いた作り方は基本です。
これを基にさらに工夫を加えることで、より人間のような応答をAIキャラクターがしてくれるようになります。

## 1. AIキャラクターの応答に表情を加える
DocomoのAgentcraftには言葉以外のメタ情報を応答の際に送るという機能が存在します。
その機能を使って、AIキャラクターが応答する際に以下のような感情の情報も一緒に送り込み、その感情に応じた表情をさせることで、AIキャラクターが表情豊かに話してくれます。
表情の変え方は以下の記事を参考にすれば簡単に変えることができます。
詳しい作り方は、いいねが50超えたら書きます……（力尽きた感）
[【UnityC#講座】ユニティちゃんの表情を替える【SetLayerWeight】](https://unity-shoshinsha.biz/archives/626)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/824e2bb8-b795-afa7-877e-21ff53760e0f.png)
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">言葉と一緒に表情を変える <a href="https://t.co/SS8JLK6of0">pic.twitter.com/SS8JLK6of0</a></p>&mdash; おろろ (@ororo33) <a href="https://twitter.com/ororo33/status/1207329374644498437?ref_src=twsrc%5Etfw">December 18, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## 2. AIキャラクターが会話を記憶して、その情報を基に話すようにする

DocomoのAgentcraftには会話中で発された言葉を記憶して、会話を作成する機能があります。
例えば「私のことを覚えていますか？」　という質問に対して、その人と話したことがあるかで、以下のように分岐を作ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/55ca9a6f-0059-b29b-a3a7-cf7758bf67e3.png)

この機能を活用すると、以下のように、自分の好みなどのパーソナライズな情報を汲んでくれる、まさしく俺の嫁を作ることができます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/de1ae3ea-f133-df2e-6ce3-95add54ecf9d.png)
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">会話の情報を記録する <a href="https://t.co/s0wImLHEuk">pic.twitter.com/s0wImLHEuk</a></p>&mdash; おろろ (@ororo33) <a href="https://twitter.com/ororo33/status/1207329849120940032?ref_src=twsrc%5Etfw">December 18, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">会話の情報がまだない場合 <a href="https://t.co/uwz6oGhsuN">pic.twitter.com/uwz6oGhsuN</a></p>&mdash; おろろ (@ororo33) <a href="https://twitter.com/ororo33/status/1207330208983896064?ref_src=twsrc%5Etfw">December 18, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
## 3. AIキャラクターを攻略できるようにする

応用2のさらなる応用です。
このAIキャラクターには情報を記憶させることが可能です。
そして会話にはその記憶から分岐を作ることが可能です。
そしてこの記憶は会話内以外にもあらかじめ設定することが可能です。
つまり、AIキャラクターと会話して、AIキャラクターの好みに合った返答を行えば好感度が上昇or下降するようにする。そうした会話を多数作れば、会話するにしたがってどんどん好感度が上昇（もしくは下降）していく、攻略可能な俺の嫁が誕生します！
ただ一つ問題点があり、自分で作るとそこらへんの好みや会話をすべて知っている状態で会話をすることになり、非常に虚しいことです……
この記事を読んだ誰かに作ってほしい……



# まとめ
以上のように作っていくことで、自分の好きな声・キャラでおしゃべりしてくれるVRアシスタントを作ることができるようになります。
ぜひみんなで自分だけのキャラクターを作って、楽しんでください。
またこのアプリはSEBASTIENのデバイスIDを使用することで作成したキャラクターのAIの振る舞いを試すことができます。
つまり、他の人が育成したキャラクターとおしゃべりすることもできるんです！
この記事を読んでくれた方は、ぜひ自分だけのキャラクターを作り、それを公開することで色んなキャラクターを生み出してほしいです！