Использование Google NodeJS для преобразования речи в текст со звуком с клиентского микрофона - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь использовать библиотеку Google для преобразования речи в текстовый узел JS (https://github.com/googleapis/nodejs-speech)) и передавать аудио с микрофонного входа клиента с помощью navigator.mediaDevices.getUserMedia.

Я смог потоковый микрофон с помощью sox to nodejs-speech streamingRecognize, и он работал. Я также смог потоковое аудио со стороны клиента и сделать и направить его на динамик на стороне сервера . Однако, когда я пытаюсь передать его в потоковое распознавание, оно не распознает ни одного слова.

Серверный

var io = require("socket.io")(server);
const speech = require('@google-cloud/speech');

const request = {
    config: {
        encoding: encoding,
        sampleRateHertz: sampleRateHertz,

        languageCode: languageCode,
    },
    interimResults: true,
    //singleUtterance: false
};
let recognizeStream = speechClient
    .streamingRecognize(request)
    .on('data', data => {
        console.log(data);
        process.stdout.write(
            data.results[0] && data.results[0].alternatives[0] ?
            `Transcription: ${data.results[0].alternatives[0].transcript}\n` :
            `\n\nReached transcription time limit, press Ctrl+C\n`
        )
    });
io.on("connection", function (client) {
    client.on("userSpeaking", function (data) {
        if (recognizeStream !== null) {
            recognizeStream.write(new Uint8Array(data));
        }
    });
});

на стороне клиента

function convertFloat32ToInt16(buffer) {
    let l = buffer.length;
    let buf = new Int16Array(l);
    while (l--) {
        buf[l] = Math.min(1, buffer[l]) * 0x7FFF;
    }
    return buf.buffer;
}
AudioContext = window.AudioContext || window.webkitAudioContext;
context = new AudioContext();
processor = context.createScriptProcessor(bufferSize, 1, 1);
processor.connect(context.destination);
context.resume();

function microphoneProcess(e) {
  var left = e.inputBuffer.getChannelData(0);
  var left16 = convertFloat32ToInt16(left);
  socket.emit('userSpeaking', left16);
}
navigator.mediaDevices
  .getUserMedia({
    video: false,
    audio: true
  }, {
    type: 'audio',
    sampleRate: 16000,
    desiredSampleRate: 16000,
    audioBitsPerSecond: 16000,
    mimeType: 'audio/webm;codecs=opus'
  })
  .then((stream) => {
    globalStream = stream;
    input = context.createMediaStreamSource(stream);
    input.connect(processor);

    processor.onaudioprocess = function (e) {
      microphoneProcess(e);
    };
  })
  .catch(console.error);
...