2016-12-01 8 views
2
サイレント

場合はマイクチェック:_sendingClipがたAudioClipで、_deviceは、デバイス名ですユニティ - 私たちは、ユニティに記録オーディオの標準的な方法を使用し

_sendingClip = Microphone.Start(_device, true, 10, 16000);

ユーザーが起こることができ、話す停止したときに、私が知りたいのです

2秒、あるいは10

私は答えを見つけるためにさまざまなソースを見てきましたが、1を見つけることができなかった後:

(しかし、これはすでに5歳以上です)

考えられるのは、ユーザーが話しを止めると、音声が音声認識サーバーに遅れずに送信され、ユーザーがまだ話しているときに音声が途切れることがないということです。

ソリューションはコード形式である必要はありません。見た目の一般的な方向はすばらしいでしょう。

+0

ユーザーが話しをやめるのをどうやって知るのですか?おそらく、波の振幅がある閾値の下に沈むときです。 – bpgeck

答えて

2

あなたははAudioSourceに記録れたAudioClipを送信し、使用してそれを再生することができます:

それが再生されている
audioSource.clip = Microphone.Start(_device, true, 60, 16000); 
while (!(Microphone.GetPosition(null) > 0)) { } 
audioSource.Play(); 

は、あなたがオーディオからSpectrumDataを得ることができます。ユーザーが話しているとき、スペクトルデータはより多くのピークを表示します。 SpectrumDataオーディオの平均をチェックして、誰かが話しているかどうかを判断できます。あなたはおそらく録音に何らかの騒音があるので、何らかのレベルの最低レベルを設定するべきです。スペクトルデータの平均が決定されたレベルを上回っている場合、誰かが話している、それより低い場合には話しを止めた。

float[] clipSampleData = new float[1024]; 
bool isSpeaking=false; 

void Update(){ 
    audioSource.GetSpectrumData(clipSampleData, 0, FFTWindow.Rectangular); 
    float currentAverageVolume = clipSampleData.Average(); 

    if(currentAverageVolume>minimumLevel){ 
     isSpeaking=true 
    } 
    else if(isSpeaking){ 
     isSpeaking=false; 
     //volume below level, but user was speaking before. So user stopped speaking 
    } 
} 

このチェックをUpdateメソッドに入れることができます。スペクトルデータは最後のフレームのスペクトルデータになります。だからリアルタイムに近いでしょう。

最低レベルは、静かなものを録音するだけで、ユーザーが話す必要がある前に行うことも、設定された方法で行うこともできます。

このソリューションでは、ユーザーは自分自身の発言を聞き、オーディオソースの出力をaudiomixerに設定し、そのボリュームを-80に設定することができます。したがって、データは認識されますが、サウンドはユーザーに出力されません。 audioSourceで音量を0に設定すると、スペクトルデータは0になりますので、その場合はaudiomixerを使用してください。

0

オーディオを扱うときは、常にレイテンシが発生します。

あなたが録音して、話を止めるたびにSRSにクリップを送信するように頼んでいますか?または音声入力が受信されていない時間の「x」の後に?

がここで対象にまともな読み取りである(何かについて考える):https://support.unity3d.com/hc/en-us/articles/206485253-How-do-I-get-Unity-to-playback-a-Microphone-input-in-real-time-

申し訳ありませんが、私はより多くの助けになることはできません - あなたが解決策を見つけることを願っています!