ml-agent toolkitで音声学習

ml-agent toolkitの自身テスト用のため書きます

今日もまたwalker agentを無理やり修正しました
（音量注意）

これをできるよにします
　
0.3秒の音を学習します
ブレインのバクトルアクション値を10240にしスペースタイプ```Continuous```にします
```Key Continuous Player Actions```を1にしてください

音声データの0.3秒部分（10240の値）をUnityのOnAudioFilterReadで聞こえるよにします
　

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MLAgents;
using System.Linq;

public class WalkerAgent : Agent
{
    public float[] ffflo;

    public override void InitializeAgent()
    {
        ffflo = new float[10240];
    }
    public override void CollectObservations()
    {
        AddVectorObs(0f);
    }
    public override void AgentAction(float[] vectorAction, string textAction)
    {
            for (int i = 0; i < ffflo.Length; i++)
            {

                ffflo[i] = vectorAction[i];
            }
    }
}

```
　
エーゼントの音を確認するスクリプトを追加しましょ
Agentttが確認するエーゼントです

```C#
using UnityEngine;
using System.Collections;
using System.Linq;

[RequireComponent(typeof(AudioSource))]
public class SoundTestgi : MonoBehaviour
{

    public AudioSource audio_;
    public WalkerAgent Agenttt;
    private float[] recordedData_;
    public int offset_ = 0;
    void Start()
    {
        recordedData_ = new float[audio_.clip.samples * audio_.clip.channels];
        audio_.clip.GetData(recordedData_, 0);
        Debug.Log(recordedData_.Length);
    }
    void OnAudioFilterRead(float[] data, int channels)
    {
        // 終わると０から再生、return文のため上面に書いた
        if (offset_ >= 10240)
        {
            offset_ = 0;
            return;
        }
        for (int i = 0; i < data.Length; i = i + channels)
        {

            data[i] = Agenttt.ffflo[(i / 2)+offset_];
            if (channels == 2)
            {
                data[i + 1] = Agenttt.ffflo[(i/2)+offset_];
            }
        }
        offset_ += 1024;
    }
}
```

　
Core Brain Player.cs

```C#
        public AudioSource audio_ra;
        public SoundTestgi sssp;
        private int sound = 0;//音声学習する区間です、テストするくらいなら80がいいかと
        private float[] recordedData_ra;
        private int offset_ra = 0;
        private bool checksounds = true;
```

```if (brain.brainParameters.vectorActionSpaceType == SpaceType.continuous)```部分に下を追加

```C#
                        if (checksounds)//はじめての時発生します
                        {//WalkerPairはSoundTestgiがあるオブジェットです、ほかのオブジェクトにあったら変えてください
                            audio_ra = GameObject.Find("WalkerPair").GetComponent<AudioSource>();
                            sssp = GameObject.Find("WalkerPair").GetComponent <SoundTestgi>();
                            recordedData_ra = new float[audio_ra.clip.samples * 2];
                            audio_ra.clip.GetData(recordedData_ra, 0);
                            checksounds = false;
                        }
                       for (int ia = 0; ia < 10; ia++)
                        {
                            for (int i = 0; i < 2048; i = i + 2)
                            {
                                action[(i/2) +(1024*ia)] = recordedData_ra[(2048 * ia)+ (2048 * sound) + (((i) * 161) / 176)] * 0.9146f;
                            }
                        }
```

模倣学習できます

作りに参考になったら嬉しいです

#ほか

実はINPUTが０ですけど**（AddVectorObs()で書いたのがAddVectorObs(0f);これしかなく完全ないですが）**入れると音声合成できるんじゃないかと思いますが、ためしていません

本当にwalkeragentで書き込む場合walkeragentのchildオブジェット（バーディ）を全部消します

**録音するファイルはステレオにしてください**、**でも**結果は**＊右耳のモノをステレオするだけです＊**。結果はモノをステレオします。
下からは全部同じ意味となります。

**一方耳のデータを両耳のデータにします**。両耳のデータもおなじく一方耳のデータだけします
つまりステレオをモノで学習してまたステレオに聞こえるよにします、ここで言うモノとは**mono**で、**物**ではありません**monoとは両方の区別のない音データつまり、右左の区別!!なく!!一個!!!!!!の音や効果音を意味**し、**ステレオは、右左の音、効果音などが区別が!!!ある!!!データを意味します**
もっとわかりやすくいうと

ステレオは、右耳と左耳で違う音が流れるデータです
モノ（mono,物じゃありません）は、左耳と右耳が同じ音のデータを意味します

つまり、**録音するファイルはステレオにしてください**、**でも**結果は**＊右耳のモノをステレオするだけです＊**
とは

**＊要するに、録音するファイル、必要なファイルはステレオですが、一方耳のデータを両耳のデータにします＊**という意味です