#java #voice-recognition
#java #распознавание голоса
Вопрос:
Я создаю голосового помощника. У меня есть работающий аудиомагнитофон, который я могу легко останавливать и запускать.
Я просто хочу иметь возможность определять, когда пользователь на самом деле говорит (это не беззвучно), чтобы я записывал только то, что они говорят, останавливая запись, когда они перестают говорить.
Я изо всех сил пытался найти способ сделать это. У кого-нибудь есть какие-нибудь идеи?
Редактировать: Пока я обнаружил, что Sphinx4 способен распознавать голосовой ввод, но в лучшем случае он был ненадежным, и я не смог использовать его для запуска моего диктофона.
Комментарии:
1. Я создаю голосового помощника для проекта колледжа, поэтому распознавание голоса отчасти важно! Я пытался в течение нескольких дней… Я отредактирую его, чтобы показать, что я уже сделал.
Ответ №1:
У меня также был похожий проект, и я использую Sphinx4. Как сказано в OP, использование Sphinx4 для определения того, когда пользователь говорит (и, что не менее важно, когда они прекращают говорить), было проблемой. Как они сказали, это было в лучшем случае «неровным». К счастью, я придумал решение, которое, надеюсь, поможет другим, кто столкнется с этим.
Я обнаружил два надежных способа, которые работали со Sphinx:
1-е решение: получите исходный код Sphinx4 и скопируйте классы из package edu.cmu.sphinx.api
в свой проект. Там было около 9 файлов, начинающихся с AbstractSpeechRecognizer
и заканчивающихся на StreamSpeakRecognizer
. Поскольку в OP говорится о распознавании голоса, предполагается, что они inputstream
поступают с микрофона, что делает классы LiveSpeechRecognizer
и Microphone
важными. Измените импорт в вашей основной java-активности и импортируйте этот пакет (или отдельные классы по мере необходимости).
Отсюда есть несколько вариантов. В итоге я написал метод в LiveSpeechRecognizer
и Microphone
, который использовал результаты из [LiveSpeechRecognizer].getResult()
и поместил туда разделяемое логическое значение для распознавания при обнаружении голоса. LiveSpeechRecognizer
возвращает результаты всякий раз, когда кто-то заканчивает говорить, поэтому в основном вы просто устанавливаете логическое значение при обнаружении первого звука и обнаруживаете голос после поступления следующих результатов. Добавьте таймер (я использовал Java Executor
) в отдельный поток, чтобы определить, сколько времени прошло с момента обнаружения последних слов (т. Е. 2 секунды). Таким образом, если что-то пойдет не так с микрофоном или они произнесут действительно короткое предложение, он все равно обнаружит «конец».
В этом решении расширение sphinx.api
не является строго необходимым, однако я обнаружил результаты намного быстрее при непосредственном изменении Microphone
вместо ожидания результатов основного действия.
2-е решение: Вы также могли бы изменить источник для Sphinx4, чтобы при обнаружении «шума» ниже определенного уровня это означало, что пользователь перестал говорить. Sphinx постоянно контролирует микрофон с помощью Java TargetDataLine
. Возитесь с порогом, при котором он отфильтровывает шум, и внедряйте прослушиватель, когда он слишком сильно меняется. Этот подход абсолютно ужасен для распознавания голоса, но OP хотел определить, когда человек начинает и прекращает говорить, что это и сделает.