LoginSignup
34
23

More than 5 years have passed since last update.

UnityでAudioSource.Mute=trueにした時にMicrophone(マイク)から音量が取得できない時の対処法

Last updated at Posted at 2015-11-24

最近SSDがクラッシュしてUnityの環境を5.0.1から5.2にしなくてはならなかった事件があって悲しい思いをしています。

それで5.0.1を使ってた時はAudioSourceをMuteにしてても音量が取れた(気がする…)はずだったんですが、最近5.2にアップデートして急にできなくなって悩んでました。

検証してませんが
Unityでボイスチャットを作る話 - http://qiita.com/CST_negi/items/bf3bc0ede34bbcd2f7b2
と関係あるかも?

とりあえず対処法を見つけましたが正しいか微妙なため何かあったらコメントしてください。

ことの発端

マイクの音量を使って何かするプログラムを書きたかったので以下のURLを参考に書いてました。
http://unity-michi.com/post-396/

で、書いたコードが

 MicTest.cs
using UnityEngine;
using System.Collections;

public class MicTest : MonoBehaviour
{
    private new AudioSource audio;
    void Start()
    {
        audio = GetComponent<AudioSource>();
        audio.clip = Microphone.Start(null, true, 999, 44100);  // マイクからのAudio-InをAudioSourceに流す
        audio.loop = true;                                      // ループ再生にしておく
        audio.mute = true;                                      // マイクからの入力音なので音を流す必要がない
        while (!(Microphone.GetPosition("") > 0)) { }             // マイクが取れるまで待つ。空文字でデフォルトのマイクを探してくれる
        audio.Play();                                           // 再生する
    }

    void Update()
    {
        float vol = GetAveragedVolume();
        Debug.Log(vol);
    }

    float GetAveragedVolume()
    {
        float[] data = new float[256];
        float a = 0;
        audio.GetOutputData(data, 0);
        foreach (float s in data)
        {
            a += Mathf.Abs(s);
        }
        return a / 256.0f;
    }
}

です。
今までだったら

CropperCapture[3].png

前はこんな感じで適当にAddComponentしてできたはずなんですが、何故かDebug.Log(vol)で出力されるのは0のみ。

CropperCapture[8].png

コードのコメントにもありますが、自分の声をマイクで拾ってそれをUnity上で再生させたくはないのでMute=trueにしてますが、その一方で音量自体はとりたかったので困っていました。
ちなみに、Mute=falseにすると音量はとれますが、自分の声が再生されてしまうので解決になってないなぁということです。

で、いろいろ調べてたんですが、結果から言うとこれは仕様っぽいです。AudioMixerに関わる話でした。

直し方

調べたらこの件に関するUnity知恵袋がヒットしました。
What happened to Mute on audiosource for microphone?

ここに書いてあることを元に無事直すことができました。
Mute=falseの時は音量がとれることを応用します。

①まず先ほどのMicTest.csのmute=trueをコメントアウトします。

MicTest.cs
void Start()
    {
        audio = GetComponent<AudioSource>();
        audio.clip = Microphone.Start(null, true, 999, 44100);  // マイクからのAudio-InをAudioSourceに流す
        audio.loop = true;                                      // ループ再生にしておく
        //audio.mute = true;    //←ここ                         // マイクからの入力音なので音を流す必要がない
        while (!(Microphone.GetPosition("") > 0)) { }             // マイクが取れるまで待つ。空文字でデフォルトのマイクを探してくれる
        audio.Play();                                           // 再生する
    }

②次にAudioMixerを作ります。
CropperCapture[4].png

こんな感じ。
ポイントは-80.0dBになっていることです。

③それをAudioSourceのOutputに貼り付ける
CropperCapture[5].png


以上で
CropperCapture[6].png

自分の声がUnity上で聞こえない状態で値がとれるようになりました。やったぜ。

34
23
0

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
34
23