unityで視線入力アプリに録音機能をつけたい⑧ ボタンを非表示・録音時間・・・

これは、今までも文字の表示・非表示をやったので

それと同じことをしました。

 

新しいCSファイルを作って

キーを押したら

いろいろ消す専用にしようかと思ったのですが、

既に、ボタンの画像を貼ったりしている

スクリプトがあったので、

そのスクリプト上で非表示等もやることにしました。

 

play.csなどの中の

 

 void Update()

の中に、

 

if (Input.GetKeyDown(KeyCode.R) || Input.GetKeyDown(KeyCode.K))
        {
            if (Button.transform.localScale == Vector3.one)
            {
                // 非表示

                Button.transform.localScale = Vector3.zero;


            }
            else
            {
                Button.transform.localScale = Vector3.one;
            }
        }

 

を入れました。

これで、RかKを押すとボタンが消えます。

 

 

・・・・

 

これで、ある程度欲しかった機能はついた

気がするのですが、

やっぱり不便なのが

 

録音時間が10秒

 

なこと。

 

無音も含めてとにかく10秒。

10秒オーバーしたら、最後から10秒分だけ。

出だしが消えている。

 

例えば

2秒しか音がなくて8秒無音だとします。

視線を入力して音を鳴らして、

すぐに目がそれたとします。

 

でもまたすぐに視線が入力されたら、

気持ち的には

もう一度見たわけだから音が鳴って欲しいと思います。

 

しかし、目をそらしてからすぐに視線入力した場合、

実際は無音の8秒を鳴らしている最中だったりするので

 

「見たのに鳴らない」

 

ということになります。

 

とても不便。

 

ということで、

UnityのMicrophoneで正確な録音時間を取得する方法 - Qiita

こちらのサイト様があったから出来ました。

きっと、無ければ詰んでいたと思います。

 

ありがとうございます。

 

出来ました。

 

すべての画像ごとに録音ができました。

停止ボタンを押した時点までの長さのファイルが出来ました。

 

詳細を書きたいのですが、

試行錯誤で遅くなってしまったので続きは明日。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

unityで視線入力アプリに録音機能をつけたい⑦ 3つの画像ごとにボタンを配置

録音には成功しましたが、

実際に配布用にビルドして試すといろいろ問題がありました。

 

・ゲームを停止させないと録音できなかった

 

 void OnApplicationQuit()
    {
        SavWav.Save("mic_" + DateTime.Now.ToString("yyyyMMddhhmmss"), tmp);
    }

 

MicCapture.cs内の↑これのせいでした。

これの{ }内だけをコピーして

「録音botannを2回押したとき((botan1oshitaplay == 0)ではない)」の中にもってきました。

 

 

 

 

 public void onClick()
    {

        if (botan1oshitaplay == 0)
        {
            ・・・

        }
        else
        {
           ・・・
            SavWav.Save("oto1", tmp);
           ・・・

            }

        

    }

 

 

 

・次々新しいファイルが作られて、最初に録音したファイルだけが

 再生される。

 

これも、上記のコードで、保存するときのファイル名を

時間とかにするのをやめました。

そうするとずっと同じ名前(oto1.wav)で

上書き保存していってくれます。

 

・・・

 

・・・

 

1個のボタンを配置したら

残り2個は

同じようにしたら出来るだろうと思うのですが、

なかなかうまくいきませんでした。

 

とても時間がかかって、

なんとか、各画像の前にボタンを1個ずつもってくることが出来ました。

 

いっぱい難しいことがあって、何がエラーの原因だったか分からないこともたくさんあったのですが、

 

Assetsに、SavWavファイルが3つになりました。

MicCapture.csの内容は全部Play.cs内に移行したのでMicCapture.csは削除しました。

保存するときのSavWav.csですが、

どのボタンをおしたかで保存するパスを変える・・・

 

としたかったのですが、

とりあえず、今はSavWavをコピーして

SavWav、SavWav2、SavWav3

と、ファイルを3つ作って、

 

例えばplay2.csだと

としています。

 

SavWav2の方では、

 

・・・

 

と、なっています。

これで、

音はここ/2フォルダにoto2の名前で保存できます。

 

 

尚、ボタンを増やしたときにやったことですが、

のinspectorはこうです↓

Play2にいろいろ入れました。

と言っても、Button2に、UIでつくったButton2をもってきて入れたのと

ONとOFFにアセットの画像をもってきたぐらいですが。

 

 

忘れがちだったのが

オブジェクトのinspector

これに、On Click()を

加えて上記のようにすることでした。

 

unityで視線入力アプリに録音機能をつけたい⑥ 録音ボタンを配置できた。

録音開始ボタンを押すと

ボタンの表示が変わるようにするのに

ものすごい時間を費やしました。

 

自分で、こうしたら良いのかな?

と、

思いついたコードもあったのですが、

 

念のためネットで調べると

自分が思いついたようなコードを載せているサイトが

あまりにネット上にないものだから、

これは良くないコードだから無いんだろうな。。。

(あるいは簡単すぎてネットに乗せるほどではない?)

と思い、自分では思いつかないような方法がないか探しました。

 

 

ですが、思いつかないような

方法を見つけることは出来ても

理解が追いつかなかったり、

なんだかんだと難しいこと(一番下に内容記載)があり、

結局時間がかかりすぎて、

最初に自分で思いついた方法を採用しました。

 

 

先にコードを載せると

 

MicCapture.csは以下です。

まだまだ作成途中です。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEngine.UI;
using UnityEngine.EventSystems;


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

    AudioClip tmp;
   

    //ボタンのtextを変えるのに必要
    public GameObject Button;   //画像を変更したいボタン
    public Sprite ON;     //変更したい画像
    public Sprite OFF;     //変更したい画像

    public int botan1oshita = 0;

 

    void Start()
    {
        var audio = GetComponent<AudioSource>();
        AudioClip myclip;
        AudioSource audioSource;
        string micName = "null"; //マイクデバイスの名前
        const int samplingFrequency = 44100; //サンプリング周波数
        const int maxTime_s = 300; //最大録音時間[s]

        //マイクデバイスを探す
        foreach (string device in Microphone.devices)
        {
            Debug.Log("Name: " + device);
          
        }

       
        /*
        audio.clip = tmp = Microphone.Start(Microphone.devices[0], true, 10, 44100);
        audio.mute = true;
        while (Microphone.GetPosition(null) <= 0) { }
        //   audio.Play();
        */

        //録音botann関係
        botan1oshita = 0;

        //これでボタンの画像を「BtnImage」の素材に変更できる
        Button.GetComponent<Image>().sprite = ON;


    }

    void OnApplicationQuit()
    {
        SavWav.Save("mic_" + DateTime.Now.ToString("yyyyMMddhhmmss"), tmp);
    }


    //ここからボタンについて


    public void onClick()
    {

        if(botan1oshita == 0)
        {
            Button.GetComponent<Image>().sprite = OFF;
            botan1oshita = 1;
            Debug.Log(" botan1oshita = 1");


            tmp = Microphone.Start(Microphone.devices[0], true, 10, 44100);
            while (Microphone.GetPosition(null) <= 0) { }
            Debug.Log(" 録音します = 1");
        }
        else
        {
            Button.GetComponent<Image>().sprite = ON;
            botan1oshita = 0;
            //マイクの録音を強制的に終了
            Microphone.End(Microphone.devices[0]);
        }
        
    }

}

 

 

画像をWindowsのペイントアプリで作って

Assets内に入れました。(png



 

GameObjectのinspectorです

 

Assetsから画像を持ってきて、ON,OFFのところで離しました。

 

 

これはButtonのinspectorです。

 

とりあえず、

ボタンを押したら録音

もう一回押したら停止するようになりました。

 

 

ボタンに画像を貼り付ける方法は以下を参考に致しました。

Unity Buttonを好きな画像にする方法 Unity学習13 - Unityでゲーム、アプリ開発 (unityprogram.info)

 

ボタンの画像の変更方法はこちらをそのままお借りしました。

【Unity 2020】uGUIボタンの画像をスクリプトで変更する | スタスキー&ザッキ (studiohunburg.com)

 

次は、録音botannを増やします。

 

尚、上で少し触れた難しかったこと。

①ボタンを押してもクリックされない

 (ボタンの座標が悪くて押せてなかった。イメージの後ろになってた?

  よく分かりませんが、座標を変えると出来た。

  ここにいたるまでかなり時間を費やした)

 

②ボタンに表示された文字を最初変えようとしたら

 思いのほか出来なかった。画像を変えることにするまでに

 だいぶ時間を費やした。

 

③ボタンを押したら録音開始。

 というのは割と早くできたけど、停止させるコードを見つけるのに

 少し苦労した。

 

です。

 

 

 

unityで視線入力アプリに録音機能をつけたい⑤ 視線アプリに入れる。ボタンの位置はRender Modeを World Spaceに。

それでは、視線アプリの中に入れてみます。

 

まずは、

前回までで作った録音保存できるアプリ内の

↓これらのCSファイルを二つともコピーペーストします。

 

 

エクスプローラーの

録音アプリの

アセットフォルダから直接

視線入力アプリのアセットフォルダ内にコピペしました。

 

↑(Assetsフォルダ内にあるcsファイルを視線アプリのAssetsフォルダにコピペ)

 

それから、視線入力アプリのHierarchyで

右クリックして

Create Emptyを選びGameObjectを作ります。

 

さっきフォルダ内にCSファイルを入れたから

Assets内に「MicCapture.cs」があるので

それをGameObjectにくっつけます。

 

GameObjectのinspectorにこれらがある状態にします。

 

 

 

アプリを起動して、しゃべったら

保存するよう指定したフォルダ内にWAVファイルが出来ていました。

 

それから、もう一度アプリを起動して

視線を画面に向けたら、録音した音声が鳴りました。

 

 

その後、再度、保存フォルダを見たら

ファイルが二つになっていました。

 

今のままでは起動している限りずっと録音し続けるようになっています。

 

視線で音を出そうとして起動したら、

目を向けている間も、

鳴っている音を新たなWAVファイルに保存していきます。

 

ということで、

 

起動してすぐに録音するんじゃなく

ボタンを押したら録音して、もう一度押したら

録音を止めるようにします。

 

また、画像も3つあるので、

ボタンもそれぞれの画像につき

一つずつ、

つまり計3つ作ろうと思います。

 

・・・

 

ボタンの配置に苦労しました。

 

画面上はオブジェクトの前にあるように見えても

起動するとズレズレです。

 

多分この辺りをちゃんと理解していないからだと思いました。

【Unity】【uGUI】CanvasのRender Modeをちゃんと理解する - LIGHT11 (hatenadiary.com)

 

canvasのRender Modeを

World Space にすると

まあまあ、見たとおりに配置されます。

 

これが↓

 

こうなる↓

 

ただし、上の画像の犬の下にあるボタンだけが

Render ModeがWorld Space です。

 

他の文字などは全部

Screen Space Overlayです。

 

これは、ボタンなど、UIごとに変えることが出来なかったので、

元々作ってた

↓このcanvasをコピーして

 

Hierarchy内でペーストして、canvas2を作りました。

その中にボタンを作って、

その代わり、コピーしたキャンバスに

くっついて来たInputFieldやmojihyoji等は全部削除しました。

 

↑こんな感じ。

 

新たに作ったcanvas2のinspectorを

↓こう変えると、犬イメージの前においた

ボタンが、起動しても、ちゃんと前にあるように見えました。

 

unityで視線入力アプリに録音機能をつけたい④ WAVファイルの保存場所を好きに変えてみる

視線入力アプリの中に、

前回作った

WAVファイルに録音保存するアプリを入れる前に、

 

保存場所を好きに変えてみる

をやってみます。

 

 

現在は

 var filepath =

 Path.Combine(Application.persistentDataPath, filename);

 

これを、自分でWAVやMP3を入れたりするように

指定したフォルダに変更したいと思います。

 

変えたところは以下の3点

 

public static bool Save(string filename, AudioClip clip) {
        if (!filename.ToLower().EndsWith(".wav")) {
            filename += ".wav";
        }

        //参考サイトではこう var filepath = Path.Combine(Application.persistentDataPath, filename);
        //↓
        var otoPathrokuon = Path.Combine("C:/オリジナル視線アプリ/音はここ/1", filename);

        ///////////////////////////////////////////////////////////////////////////Debug.Log(filepath);

        // Make sure directory exists if user is saving to sub dir.
        //参考サイトではこう Directory.CreateDirectory(Path.GetDirectoryName(filepath));
        ///↓
        Directory.CreateDirectory(Path.GetDirectoryName(otoPathrokuon));


        //参考サイトではこう  using (var fileStream = CreateEmpty(filepath)) {
        ///↓
        using (var fileStream = CreateEmpty(otoPathrokuon))
        {


            ConvertAndWrite(fileStream, clip);

            WriteHeader(fileStream, clip);
        }

        return true; // TODO: return false if there's a failure saving the file
    }

 

 

これで、Cドライブの中に作った

オリジナル視線アプリフォルダ内に作った

音はここフォルダ内に作った

1フォルダ内に

録音したwavファイルが保存できました。

 

unityで視線入力アプリに録音機能をつけたい③ マイクで録音、WAV保存出来た

出来ました。

 

大変お世話になったのが

↓こちら

DIYer Unity にマイク音声を取り込む

この通りにアプリを作って

次に、続きの記事で

DIYer Unity 内の音をファイル出力する

こちらを参考にプログラムを作りました。

 

ほぼ、そのまま作りましたが、

保存場所は、

「SavWav.cs」のまま

var filepath = Path.Combine(Application.persistentDataPath, filename);

 

にしました。

 

次回からは、視線入力アプリに合わせて、

パスを「音ファイル」を保存しているところに変えます。

 

そして

視線入力アプリの中に

今回作った録音再生の機能を入れていきたいと思います。

 

 

コードを載せても良いのですが、

本当にほぼリンク先のコードのままなので、

ここに載せるのはやめておこうかなと思います。

 

初心者にもとても分かりやすく書いてあるページでした。

unityで視線入力アプリに録音機能をつけたい② 前回のエラーは無くなったけど・・・

①で消せそうになかったエラーは消えました。

 

正しい消し方かどうかは分かりませんが

 

Unity上で音声を録音し、録音したデータをWavファイルに保存するコードと、録音したWavデータを再生するコード · GitHub

 

上記のプログラムの内、

OutMic.cs

RecordMic.cs

に記載のある

 

「WavUtility」とはなんぞや?という問題でした。

 

UnityWav/WavUtility.cs at master · deadlyfingers/UnityWav · GitHub

 

ここにありました。

 

これを

Assetsに入れるとこのエラーは消えました。

 

が、やっぱり他のエラーが

消せません。

 

これは

最初に思った通り私にはまだまだ

難しそうなので、

やはり予定通り、ゆっくり少しずつ

積み重ねていこうと思います。