Я работаю над распознаванием речи Java, используя sphynx4
, и в настоящее время у меня есть проблема.
У меня есть приложение, которое распознает вход микрофона, используя класс LiveSpeechRecognizer Sphynx4, который отлично работает. Проблема в том, что после того, как я добавил класс, который также слушает микрофон, преобразует и визуализирует вывод.
По отдельности оба класса работают нормально. Но при объединении в одном приложении я получаю сообщение об ошибке:
LineUnavailableException: строка с форматом PCM_SIGNED 44100,0 Гц, 8 бит, моно, 1 байт/кадр, не поддерживается.
Я проверил проблему, и, похоже, она вызвана одновременным доступом к микрофону. У меня была идея использовать StreamSpeechRecognizer вместо Live, но мне не удалось получить поток с микрофонного входа. Пробовал AudioInputStream для этой цели.
Не могли бы вы предложить, как я могу настроить свой код, чтобы оба: SpeechRecognition и Oscilloscope использовали микрофон одновременно?
Заранее спасибо.
УПД:
Это моя попытка разделить вход микрофона для использования в обоих приложениях.
....
byte[] data = new byte[dataCaptureSize];
line.read(data, 0, data.length);
ByteArrayOutputStream out = new ByteArrayOutputStream();
out.write(data);
byte audioData[] = out.toByteArray();
InputStream byteArrayInputStream = new ByteArrayInputStream(audioData);
AudioInputStream audioInputStream = new AudioInputStream(byteArrayInputStream,
inputFormat,
audioData.length / inputFormat.getFrameSize());
....
Вот как я конвертирую его во входной поток, который затем передается в StreamSpeechRecognizer
, а массив байтов преобразуется с помощью быстрого преобразования Фурье и передается на график. Это не работает, так как он просто постоянно останавливает график, поэтому отображаемые данные не являются фактическими.
Я попытался запустить распознавание в отдельном потоке, но это совсем не увеличило производительность.
Мой код разделения на потоки приведен ниже:
Thread recognitionThread = new Thread(new RecognitionThread(configuration,data));
recognitionThread.join();
recognitionThread.run();
UPD 2: Вход с микрофона. Приведенный выше AudioInputStream передается в StreamSpeechRecognizer:
StreamSpeechRecognizer nRecognizer = new StreamSpeechRecognizer(configuration);
nRecognizer.startRecognition(audioStream);
А массив байтов передается преобразованным с помощью БПФ и передается в граф: ` double[] arr = FastFourierTransform.TransformRealPart(data);
for (int i = 0; i < arr.length; i++) {
series1.getData().add(new XYChart.Data<>(i*22050/(arr.length), arr[i]));
`
ByteArrayOutputStream
,InputStream
иAudioInputStream
при каждом чтении. Я не могу сказать, как эти потоки используются из показанного кода, но логически данные микрофона должны постепенно добавляться к ним, если они, в свою очередь, считываются в другом месте другими разделами программы, которую вы пытаетесь реализовать. В чем смысл разделения треда? Можно заполнить несколько потоков в одном потоке. - person Phil Freihofner   schedule 12.05.2020StreamSpeechRecognizer recognize()
- person Andrey Hrynyuk   schedule 13.05.2020