質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2555閲覧

マイクから入力した音量の数値を取得して条件式として利用したい

miyamo

総合スコア5

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/02/26 12:24

前提・実現したいこと

マイクからの入力を検知して、自動で録音開始・終了というのをしたいです。

Unity(C#)を使っています。
録音から再生までの一連の処理を書いているのですが、いかんせんプログラミングに関してはまだ日の浅い初心者なので、つまずいています。

PCにマイクとスピーカーをつないで録音再生を行っているのですが、普通に画面内のボタン、あるいは何らかのキーボードキーを押して
「録音開始→録音終了→再生」
というのはいろいろなサイトを見て実現できた(ある程度理解もしてるつもり)のですが、これら開始や終了を手動ではなく自動で行いたいのです。

つまり、
「マイクに音声が入ったら録音開始→音声が聞こえなくなって数秒ぐらい経ったら勝手に終了→勝手に再生」
というようなものを考えています。

一応いろいろと調べたんですが、おそらくマイクに入った音量の数値?みたいなのを取得してif文使って
1.一定の数値以上になったら録音開始の処理を実行
2.if文の中にif文作って、上記メソッド実行後に一定の数値以下になってから数秒間その状態が維持されたら録音終了
という処理を書けばいけるかなと考えています。(違ってたらすいません…)

困っていること

肝心な部分である「音量を数値で取得する方法」がシンプルにわからない。

https://qiita.com/ELIXIR/items/ff503d48c24092c05843
上記のサイトなんか明らかにヒントになりそうなのですが、あいにく初心者ゆえ仕組みがよくわかりません…。

現状のコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5[RequireComponent (typeof (AudioSource))] 6public class RecordingTest1 : MonoBehaviour 7{ 8 AudioClip myclip; 9 AudioSource audioSource; 10 string micName = "null"; //マイクデバイスの名前 11 const int samplingFrequency = 44100; //サンプリング周波数 12 const int maxTime_s = 300; //最大録音時間[s] 13 14 void Start() 15 { 16 //マイクデバイスを探す 17 foreach (string device in Microphone.devices) 18 { 19 Debug.Log("Name: " + device); 20 micName = device; 21 } 22 } 23 24 void Update() 25 { 26 27 } 28 29 public void RecStart() 30 { 31 Debug.Log("recording start"); 32 // deviceName: "null" -> デフォルトのマイクを指定 33 myclip = Microphone.Start(deviceName: micName, loop: false, lengthSec: maxTime_s, frequency: samplingFrequency); 34 } 35 36 public void RecEnd() 37 { 38 if (Microphone.IsRecording(deviceName: micName) == true) 39 { 40 Debug.Log("recording stoped"); 41 Microphone.End(deviceName: micName); 42 43 RecPlay(); // ※終了と同時に自動的に再生したいので 44 } 45 else 46 { 47 Debug.Log("not recording"); 48 } 49 50 } 51 52 public void RecPlay() 53 { 54 Debug.Log("play"); 55 audioSource = gameObject.GetComponent<AudioSource>(); 56 audioSource.clip = myclip; 57 audioSource.Play(); 58 } 59}

上記のソースコードについて

実際はもう少しいろいろ書き足したり手を加えてたりしてますが、分かりやすくするため関係ない部分は消してます。
正直、ほぼコピペでそれをベースにいじってるので、サンプリング周波数とかの意味はぶっちゃけよくわかってないです(汗)
本来、上記のコードは録音開始・録音終了・録音再生のそれぞれの処理をそれぞれの画面内ボタンに割り当てて手動で操作するものなのですが
これらの処理を先述したように(Update関数で)音量の数値をif文の条件式に使ってそれぞれの処理を呼び出せたらいいなと思ってます。

質問は初めてなので至らない部分はあると思いますが、何卒よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Unity のオーディオの再生・エフェクト・解析周りについてまとめてみた

凹みTipsさんの上記の記事に「音量の計算」という項目で音量を求めるコードが確認できます。

C#

1using UnityEngine; 2using System.Linq; 3 4public class WaveOutputter : MonoBehaviour 5{ 6 private float[] waveData_ = new float[1024]; 7 8 void Update() 9 { 10 AudioListener.GetOutputData(waveData_, 1); 11 var volume = waveData_.Select(x => x*x).Sum() / waveData_.Length; 12 transform.localScale = Vector3.one * volume; 13 } 14}

上記の例では求めた音量をモデルのスケールに使用していますが、今回の場合ではおそらく以下のようになるかと思います。 (あくまでイメージです)

C#

1void Update() 2{ 3 AudioListener.GetOutputData(waveData_, 1); 4 var volume = waveData_.Select(x => x*x).Sum() / waveData_.Length; 5 6 if (volume >= 0.1f) 7 { 8 // 録画開始 9 } 10 if (volume <= 1.0f) 11 { 12 // 録画停止 13 } 14}

また、音量を求める処理とは別に気になったこととして、Unityでマイクを使用する場合は録音していない状態で入力を受け付けることはできるのかという点が気になりました。
まだ調べていないので可能かどうかは不明ですが、アセットストアなども調査した方がいいかもしれません。

投稿2020/02/26 12:58

kawa0x0A

総合スコア271

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問