前提・実現したいこと
卒業研究でVR集団面接トレーニングをUnityで開発しています。
音声認識で、音の大きさを判別するプログラムをC#で書きたいのですが、書き方がわかりません。
参考になるプログラムを見つけましたが、C++で書かれているため言語が違います。
収録した音に二乗平均を求める squareAve 関数を用いて音の大きさを計算し、その大きさによって「大きい音」「小さい音」判別するプログラムをC#で書きたいです。
参考にするプログラム
Recognitionクラスの仕様 本プログラムで使うことのできる Recognition クラスについて、またその内部で実装しているメソッドについて。実際の使い方や振舞いについてはソースコード内のコメントを見ていただいた方がわかりやすいと思われるが詳細はこちらを参照していただきたい。内部で利用している定数として SRATE:サンプリングレート 16000 がある。これは音声の 1 秒間あたりのサンプル数である。この Recognition クラスは recog.h を include することで利用できる。 Recognition 音声認識、マイク音声の取得を行うクラス。コンストラクタでは、int 型の引数をとることができ、1 を指定すれば音声認識のみ利用可能。2 を指定すればマイクから音を収録する機能のみ利用可能。何も指定しなければ両方を利用することができる。 void recording with microphone(int time) マイクから音を拾うメソッド。返却値はない。引数の time で指定した時間 (sec) の音をマイクから収録する。収録した音声を利用する場合は後述の get wave メソッドを用いる。 short* get wave(void) マイクから拾った音データを返却するメソッド。引数はない。返却値は音データの先頭ポインタ。以降 time で指定した時間 (sec) × SRATE(サンプリングレート 16000) の長さだけデータが続く。こちらを用いることで取 得した音声そのものを扱うことができる。 double squareAve(short *rec, int time) 第一引数に音データ系列のポインタ(short*)、第二引数に時間 (sec) を指定することで、音データ系列のポイ ンタから指定した時間分の二乗平均を求めることができる。返却値は double である。
参考にするソースコード
C++
1#include "recog.hpp" 2#include <math.h> 3 4double squareAve(short *rec, int time){ 5 double sum = 0; 6 long double ave = 0.0; 7 int cnt = 0; 8 double tmp = 0; 9 long int loop = SRATE*time; 10 while (cnt < loop){ 11 tmp = *(rec + cnt); 12 ave += (tmp * tmp) / (loop); 13 cnt++; 14 } 15 16 return ave; 17} 18 19Recognition recog(2); 20 21recog.recording_with_microphone(1); 22//2乗平均を求める 23long double kekka = squareAve(recog.get_wave(), 1); 24printf("%f\n", kekka); 25if (kekka > 1000000){ 26 printf("大きい音です。\n"); 27} 28else if (kekka > 250000){ 29 printf("普通の大きさです。\n"); 30} 31else{ 32 printf("小さい音です。\n"); 33}
質問中にある通り「収録した音に二乗平均を求める squareAve 関数を用いて音の大きさを計算し、その大きさによって「大きい音」「小さい音」判別する」ロジックをC#で記述することになりますが、具体的にどの部分がわからないのでしょうか?
あなたの回答
tips
プレビュー