2016-12-01 2 views
2

Мы используем стандартный метод записи звука в Unity:Unity - проверка микрофона, если немого

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

где _sendingClip является AudioClip и _device это имя устройства.

Я хотел бы знать, когда пользователь прекращает говорить, что может произойти через 2 секунды, или даже 10.

Я смотрел на различные источники, чтобы найти ответ, но не смог найти один:

Идея состоит в том, что когда пользователь перестает говорить, звук отправляется на сервер распознавания речи без задержки и без прерывания звука, когда пользователь все еще говорит.

Решения не обязательно должны быть в формате кода. Общее направление, где искать, было бы неплохо.

+0

Ну, как мы узнаем, что пользователь перестает говорить?Вероятно, когда амплитуда волн опускается ниже определенного порогового значения. – bpgeck

ответ

2

Вы можете отправить AudioClip записи на AudioSource и воспроизвести его с помощью:

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 
    } 
} 

Вы можете поместить эту проверку в метод обновления, а спектральные данные будут отображаться в спектре последнего кадра. Таким образом, он будет близок к реальному времени.

Минимальный уровень можно определить, просто записав что-то тихое, вы можете сделать это, прежде чем пользователь должен будет говорить или настроить способ.

С помощью этого решения пользователь сам услышит, что вы можете установить выходной сигнал аудиоисточника на аудиомиксер и поставить этот том на -80. Таким образом, он все равно распознает данные, но не выводит звук пользователю. Установка громкости в 0 на аудиоисточнике даст 0 спектральных данных, поэтому в этом случае используйте аудиомиксер.

0

При работе со звуком всегда будет латентность.

Вы запрашиваете запись и отправку клипа в SRS каждый раз, когда пользователь перестает разговаривать? или после «х» количество времени, когда голос не был принят? (Что-то думать о)

Вот достойные чтения на тему: https://support.unity3d.com/hc/en-us/articles/206485253-How-do-I-get-Unity-to-playback-a-Microphone-input-in-real-time-

К сожалению, я не могу быть больше помощи - надеюсь, что вы нашли решение!

Смежные вопросы