Unityで録音機能を作りたい！

## はじめに
Unityで録音機能を作って、画面の中のキャラクターとお話できるような機能を作ってみようかなあ！とふと思い立ってしまいました。
まずはひとつずつやっていこう〜と思い、
自分の声を録音する→保存する→再生する
という基本的な実装をしてみました！

## 実装してみる
ちなみに私はというと、多少Web系の言語をやってはいたのですがC#は学び始めの段階でして、
まだまだわからないことだらけなので、1から自分で考えてコードを書いていくにはあまりにも時間がかかりすぎるし挫折してまう。。
ということで、他の方が記事としてあげてくださっているコードを参考にして実装してみました！


ベースのコードは、こちらの方を参考にさせていただきました。

https://kato-robotics.hatenablog.com/entry/2018/07/07/142156

こちらを参考に書いたコードがこちらです！

```AudioManager.cs
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;

public class AudioManager : MonoBehaviour
{
    AudioClip myclip;
    AudioSource audioSource;
    [SerializeField] string micName;   //マイクデバイスの名前 nullを入れるとデフォルトのマイクを使用する
    int samplingFrequency = 44100;  //サンプリング周波数
    int maxTime = 300;         //最大録音時間

    // Start is called before the first frame update
    void Start()
    {
        //マイクデバイスを探す
        foreach (string device in Microphone.devices)
        {
            Debug.Log("Name: " + device);
            micName = device;
        }
    }


    public void StartButton()
    {
        Debug.Log("recording start!");
        //deviceName => "null" デフォルトのマイクを指定
        //Microphone.Startで録音を開始（マイクデバイスの名前、ループするかどうか、録音時間[s], サンプリング周波数）
        //録音データはAudioClip変数に保存される
        myclip = Microphone.Start(deviceName: micName, loop: false, lengthSec: maxTime, frequency: samplingFrequency);
    }

    public void EndButton()
    {
        if(Microphone.IsRecording(deviceName: micName) == true)
        {
            Debug.Log("recording stoped");
            Microphone.End(deviceName: micName);
        }
    }

    public void PlayButton()
    {
        Debug.Log("play");
        audioSource = gameObject.GetComponent<AudioSource>();
        audioSource.clip = myclip;
        audioSource.Play();
    }

}
```
Unityのエディタ上にボタンを3つ作って、対応する関数をアタッチします！


録音というとなんか複雑なのかなと思ったのですが、Microphoneクラスなどがもう定義されていて、
.Startや.Endで操作できるんですね、、！意外と単純！
micNameを[SerializeField]しているのは、個人的にInspectorから何が入っているのかを確認したかっただけなので、必要ない方は[SerializeField]は削除してくださいね！

## 再生してみる

エラーも特に出ていないので、いけてそう！
![スクリーンショット 2023-08-26 12.49.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2635943/6fed443e-ee40-80d8-a83e-52ba5466062e.png)

機能を見たかっただけなのでUIが申し訳ないことになっていますが、（せめてボタンの大きさくらい少し大きくしとけば見やすかった...）
このように「Start Button」、「End Button」、「Play Button」の3つのボタンがあり、
「Start Button」を押すとコンソールに「recording start!」が出て録音が開始され、
「End Button」を押すとコンソールに「recording stoped」が出て録音が終了し、
「Play Button」を押すとコンソールに「play」が出て録音された音声が再生される、、はずです。


## しかし問題発生
![スクリーンショット 2023-08-26 12.49.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2635943/d2eda305-9f0b-6b46-21f5-295c713d668a.png)

録音して再生までしてみたものの。。

音が出ない！！！！！！！！！

エラーも出ていないし、inspectorを確認しても、Micも取得できているしAudioClipもちゃんと入っている。。
死ぬほど音量ボタンを押したが変わらず。

データとしてAuidoClipに渡せてはいるようですが、そもそも録音時にマイクで音を拾えていないのではないか？と考えました。

少し気になったのが、最初にマイクを取得する際、2種類のマイクを取得している点。
![66F2697A-7271-4319-B67E-0CEA49E6F0B7_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2635943/cd2adf6e-2806-50e9-2e20-3b56bef11326.jpeg)

おそらくMacBook AirのマイクというのがPC本体のマイクだと思うのですが、2種類のマイクを取得してしまっており、後に取得したAoomAudioDeviceというものがマイクとして渡されてしまっているようです。

これをMacBook Airのマイクにすることができたら、解決するのでは、、！？！？

## 手を借りてみる

こういう時はネットに聞いてみよう。
Unityで録音機能を実装している記事は結構あります。

今回はこちらの記事を参考にさせていただきました！

https://qiita.com/segur/items/6d7b140418ef9adf6e7c

特に、最初のマイクを取得する際の書き方を参考にさせていただき、
マイクを取得する際のStart関数をこのように直してみました。

```AudioManager.cs
void Start()
    {
        //マイクデバイスを探す
        if (Microphone.devices.Length == 0)
        {
            Debug.Log("マイクが見つかりません");
            return;
        }

        Debug.Log("Name: " + Microphone.devices[0]);
        //マイク名
        micName = Microphone.devices[0];

    }
```

そうしたらなんと、、、

録音された音声が再生された〜〜〜〜〜〜！！！！！
音が出ました！笑

![5DDE3021-F495-404A-98BE-4EFFA43E2CF7.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2635943/f16ec823-c4e2-aaae-ccad-a6bde8caf710.jpeg)

inspectorを改めて確認してみると、確かに「Mic Name」のところに「MacBook Airのマイク」が入っています。
やはり音声を拾うマイクが違かったみたいですね、、

今回はマイクデバイスを検出して配列の0番目のマイクを指定することで解決できましたが、これはどんなケースでも当てはまるのだろうか、、？？

お詳しい方、ぜひご指摘や修正点ございましたらコメントいただけますと幸いです！！！

それでは今回はこちらで！