Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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)

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away