LoginSignup
26
21

More than 5 years have passed since last update.

Unity:マイクの音量を取得する(1)

Last updated at Posted at 2019-01-09

Unityで音に合わせて何かをしたい場合、下記の手順でリアルタイムにマイクの音量を取得できます。

  • Hierarchyタブで右クリック>空のゲームオブジェクトを作る
    2019-01-09_140631.png

  • 作ったオブジェクトに[AddComponent]>AudioSourceでオーディオソースをつける
    2019-01-09_140719.png

  • AudioSource>Loopにチェックを入れる
    2019-01-09_141034.png

  • Project>Create>C#Scriptでスクリプトを作成し、MicVolumeSample.csという名前を付けて下記をコピペする

MicVolumeSample.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MicVolumeSample : MonoBehaviour {
    [SerializeField, Range(0f, 10f)] float m_gain = 1f; // 音量に掛ける倍率
    float m_volumeRate; // 音量(0-1)
    // Use this for initialization
    void Start () {
        AudioSource aud = GetComponent<AudioSource>();
        if ((aud != null)&&(Microphone.devices.Length>0)) // オーディオソースとマイクがある
        {
            string devName = Microphone.devices[0]; // 複数見つかってもとりあえず0番目のマイクを使用
            int minFreq, maxFreq;
            Microphone.GetDeviceCaps(devName, out minFreq, out maxFreq); // 最大最小サンプリング数を得る
            aud.clip = Microphone.Start(devName, true, 2, minFreq); // 音の大きさを取るだけなので最小サンプリングで十分
            aud.Play(); //マイクをオーディオソースとして実行(Play)開始
        }
    }

    // Update is called once per frame
    void Update () {
        Debug.Log(m_volumeRate);
    }

    // オーディオが読まれるたびに実行される
    private void OnAudioFilterRead(float[] data, int channels)
    {
        float sum = 0f;
        for (int i = 0; i < data.Length; ++i)
        {
            sum += Mathf.Abs(data[i]); // データ(波形)の絶対値を足す
        }
        // データ数で割ったものに倍率をかけて音量とする
        m_volumeRate = Mathf.Clamp01(sum * m_gain / (float)data.Length);
    }
}
  • 音量がログに表示される
    • (ログウィンドウが表示されていない場合はWindow>General>Consoleを選択) 2019-01-10_194501.png

2019-01-09_141213.png

・・・のですが、このままだとマイクの音をそのままオーディオソースに流すのでハウリングを起こしてしまいます。かといってオーディオソースのボリュームを0にすると今度はマイクの音が拾えなくなります。そこで、

  • Projectタブで右クリック>Create>AudioMixer でオーディオミキサーを作る
  • オーディオミキサー>Groups>+マークをクリックし、Dummyという名前のグループを作る
  • できたDummyのボリュームを最小(-80)にする

2019-01-09_141456.png

  • 最初に作成したGameObject>AudioClip>OutputにDummyを指定する 2019-01-09_141552.png

これでマイクで拾った音を出力しないようになり、ハウリングが起きなくなります

Unity:マイクの音量を取得する(2)

26
21
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
21