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

この記事は最終更新日から3年以上が経過しています。

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

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
コメント
この記事にコメントはありません。
あなたもコメントしてみませんか :)
すでにアカウントを持っている方は
ユーザーは見つかりませんでした