視線入力アプリをVersionUP(mp3→wav)⑧ 成功した。そしてwavの保存先。

昨日の記事を自分で読み返して、

エラーが続き過ぎて無力感が文字から溢れていると感じました。

 

後から読んだら自分でも何について書いているか分かる自信がありません。

 

今回はもう少し、後の自分に親切な書き方を心がけようと思います。

 

・・・ここまでの話・・・

 

mp3→wav変換アプリは出来た

外部フォルダからwavファイルを読み込んで視線で鳴らすアプリも出来た

この二つをくっつけるとエラーが出る

 

・・・ここまでしたこと・・・

Unityを2018にしたり2021にしたり2019にしたりした。

 

・・・今からやろうと思うこと・・・

 

2019.4.1f1で新しく視線入力アプリを作る。

そこに、mp3→wav変換のコードを足していく。

 

今までは反対をしてました。

「変換コードに、視線入力アプリを足す。」

 

これをやろうとして、Assetsの中にTobiiのSDKを入れた瞬間に

アタッチされてたScriptが外れて、

エラーになっただろう箇所を取り除こうが、

今あるScriptごと削除して、新規Scriptを作ろうが、

二度と何もアタッチ出来ないプロジェクトになってしまったのでした。

 

・・・・

 

ということで、

まず、視線入力アプリを作り直しました。

 

・・・

成功です。

 

そこから、ソーっと、

ちょっとずつ、ちょっとずつ、音変換アプリのコードを足していき・・・

 

 

??

あ、、なんか、

アッサリ出来た・・・

 

丸1日かけて全然ダメだったのが、次の日になるとアッサリ出来ること。

たまにあります。。。

 

 

 

忘れないうちにコードを全部貼り付けます。

尚、何度も書いてきましたが、mp3→wav変換の部分については

下記のサイト様よりコードを参考にさせていただいております。

【Unity】【C#】Windows で mp3 をランタイムで再生する - ヽ|∵|ゝ(Fantom) の 開発blog?

 

New Scriptはplayという名前で作っています。

尚、目的の物さえ作れたらいいという気持ちでやっておりまして、

よく分からない部分があっても気にせず作っています。

なので、下記のコードで余分な物もいっぱいあるだろうことを了承ください。

 

 

 

using System.Collections;
using System.IO;
using System.Collections.Generic;
using UnityEngine;
using Tobii.Gaming; //ライブラリの追加
using NAudio.Wave;


public class play : MonoBehaviour
{
    

    // public AudioClip audioClip;
    public AudioSource audioSource;
    public string mp3Path;           //再生する mp3 のパス

    //注視情報
    private GazeAware gazeAware;

    //停止中か再生中かなど
    int ichiziteishi;

 

 

    private void Start()
    {
        //audioSource = this.GetComponent<AudioSource>();
        //StartCoroutine(Connect());

 

        //注視情報の取得
        gazeAware = GetComponent<GazeAware>();

        //一時停止が押されたかどうかを見るための変数。最初と再生中は1.一時停止中は2
        ichiziteishi = 1;


        if (File.Exists(mp3Path))
        {
            //wav 変換した一時ファイルを保存するパス
            var wavPath = Application.temporaryCachePath + "/converted.wav";
            ConvertMp3ToWav(mp3Path, wavPath);
            StartCoroutine(PlayWav(wavPath));
        }
        else
        {
            Debug.Log($"File not found : {mp3Path}");
        }

 

    }


    //mp3 → wav 変換して、保存したパスを返す
    public void ConvertMp3ToWav(string mp3Path, string wavPath)
    {
        //ファイルを byte 配列で読み込み
        var bytes = File.ReadAllBytes(mp3Path);

        //wav を一時ファイルとして保存
        using (var stream = new MemoryStream())
        {
            stream.Write(bytes, 0, bytes.Length);
            stream.Position = 0;

            using (var reader = new Mp3FileReader(stream))
            {
                WaveFileWriter.CreateWaveFile(wavPath, reader);  //wav で書き出し
                Debug.Log($"Convert to wav successfully : {wavPath}");
            }
        }
    }

 

    void Update()
    {
        // マウスの左ボタンを推した場合も再生


        //オブジェクトを注視していたらTrue
        bool flg = gazeAware.HasGazeFocus;


        //注視していたり、マウスが左クリックされたら

        if (flg || Input.GetMouseButtonDown(0))
        {


            //注視していたら赤色に
            gameObject.GetComponent<Renderer>().material.color = Color.red;


            if (!audioSource.isPlaying)  //再生中で無いなら
            {

                //一時停止関数がもし2(一時停止中)なら
                if (ichiziteishi == 2)
                {
                    //再開してください(同時にichiziteisi変数は1になる)
                    UnPause();

                }

                //一時停止関数がもし1(一時停止中でない(起動したところだったり、停止中だったり))なら再生する。
                else
                {

                    audioSource.Play();
                    // Play(audioClip);

                }


            }

 

        }

        //注視して無かったり、マウス左クリックされてなかったりしたら
        else
        {
            //注視していなければ青色に
            gameObject.GetComponent<Renderer>().material.color = Color.blue;
            //注視がそれただけでは一時停止にはしていない。視線がそれることはよくあると思うので。
            //一時停止にしたいならPauseを入れたら可能。

            //改訂として目をそらしたら止めるようにする
            // Pause();

 


        }


        // 停止

        if (audioSource.isPlaying)  //再生中なら
        {

            //注視がそれているときのみ有効。テンキーの「2」を押して離したら停止
            if (Input.GetKeyUp(KeyCode.Keypad2))
            {

                Stop();


            }


        }


        // 注視がそれているときのみ有効。一時停止
        if (audioSource.isPlaying)  //再生中なら
        {

            //テンキーの「1」を押して離したら一時停止し、ichiziteishi変数を2に。
            if (Input.GetKeyUp(KeyCode.Keypad1))
            {
                Pause();

            }
        }


        // 再開
        if (!audioSource.isPlaying)  //停止中なら
        {

            //もう一回、注視したり左クリックしたりしたら再開し、ichiziteishi変数を1に。
            if (flg || Input.GetMouseButtonDown(0))
            {

                UnPause();


            }
        }

        if (Input.GetKey(KeyCode.Escape))
        {
            Application.Quit();
        }

 

    }

 

 


    //ストリーミング再生する
    IEnumerator PlayWav(string path)
    {
        using (var www = new WWW("file://" + path))
        {
            while (!www.isDone)
                yield return null;

            if (string.IsNullOrEmpty(www.error))
            {
                var clip = www.GetAudioClip(false, true);
                audioSource.clip = clip;
                //audioSource.Play(); //コメントを解除したらアプリ立ち上げと同時に音を再生する。
                Debug.Log($"Play wav : {path}");
            }
            else
            {
                Debug.Log(www.error);
            }
        }
    }

    //再生、一時停止、停止、再開、完全に停止について

    /*
    // 再生 Play と、入力したら一回だけ再生
    private void Play(AudioClip audi)
        {
            audioSource.PlayOneShot(audi);
            
    }
    */

    //  一時停止 Pauseと、入力したらichiziteishi変数に2を入れて、一時停止
    private void Pause()
    {
        ichiziteishi = 2;
        audioSource.Pause();
    }

    // 停止  Stopと、入力したら停止
    private void Stop()
    {
        audioSource.Stop();
    }

    // 再開 UnPause と、入力したらichiziteishi変数に1を入れて、再開

    private void UnPause()
    {
        ichiziteishi = 1;
        audioSource.UnPause();
    }

 

}

 

このコードは

この、Cubeにアタッチしています。

 

Inspectorで新しく足したものを表示すると↓こうです。

 

Assetsの中身です。

 

上の図のPluginsの中身です。x86フォルダを作って、更にその中を表示しています。

 

ビルドします。

今更ですが、ビルド前に、File→Save Asでsceneというのを

作っておくようです。

 

Save Asでは名前を求められるので、たいていプロジェクト名にしています。

今回はmusicPlay3.3

 

ユニティマークのsceneがAssetsの中に保存されます。

 

今回のビルドも途中で止まりました。

デスクトップに新しく作ったフォルダに保存し、

かつ、

PlaySetting...のother Settings...の

Api Compatibility Levelを.NET 4.xにすると作ることが出来ました。

 

 

このアプリの動きを書いてなかった気がします。

 

・真っ青な画面が立ち上がります

(Cubeのサイズを画面いっぱいになるように広げています)

・視線入力装置をパソコンにとりつけて、画面を見ると赤くなります。

・それと同時に指定したフォルダ(このコードではC→soundフォルダ)に

 保存した1.mp3という名前の音ファイルが再生されます。

・数字キーの1を押すと一時停止。再び画面を見ると続きから再生。

・数字キーの2を押すと停止。再び画面を見ると最初から再生。

・目をそらすと画面は青くなるけど、音は止まらない。

 (一度、目をそらしたら止まるようにしたら、聞き続けるために

  すごく目が辛くなったので)

・mp3から変換されたwavの保存先は

 C:\Users\xxx\AppData\Local\Temp\DefaultCompany\musicPlay3_3