Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

最近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上で聞こえない状態で値がとれるようになりました。やったぜ。

Why do not you register as a user and use Qiita more conveniently?
  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
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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