Отправить результат Google-Speech-Text на сервер - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь отправить транскрипт, сгенерированный в этом примере кода, из Google для преобразования речи в текст на сервер nodejs и отобразить его пользователю.

var http = require('http');
const recorder = require('node-record-lpcm16');
const speech = require('@google-cloud/speech');
const client = new speech.SpeechClient();

const encoding = 'LINEAR16';
const sampleRateHertz = 16000;
const languageCode = 'en-US';

const request = {
  config: {
    encoding: encoding,
    sampleRateHertz: sampleRateHertz,
    languageCode: languageCode,
  },
  interimResults: false, // if you want interim results, set this to true
};

// create a recognize stream
const recognizeStream = client
  .streamingRecognize(request)
  .on('error', console.error)
  .on('data', data =>
    //console.log('test');
    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'
    )
    writeToServer(data.results[0].alternatives[0].transcript);
  );

function writeToServer(data){
  http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.write(data);
    res.end();
  }).listen(8080);
}

// start recording and send the microphone input to the speech api.
// ensure SoX is installed, see https://www.npmjs.com/package/node-record-lpcm16#dependencies
recorder
  .record({
    sampleRateHertz: sampleRateHertz,
    threshold: 0,
    // other options, see https://www.npmjs.com/package/node-record-lpcm16#options
    verbose: false,
    recordProgram: 'rec', // try also "arecord" or "sox"
    silence: '1.0',
  })
  .stream()
  .on('error', console.error)
  .pipe(recognizeStream);

console.log('listening, press Ctrl+C to stop.');

Мне трудно получить доступ к стенограмме из клиента речи Google. Также приветствуются ссылки на то, как передать ввод mi c из веб-приложения вместо локального mi c, поскольку цель состоит в том, чтобы принять ввод mi c от пользователя через браузер и передать его API-интерфейсу google-speech-to-text.

1 Ответ

0 голосов
/ 24 июня 2020

Я рекомендую вам следующий рабочий процесс:

Запишите аудио пользователя -> отправьте его в свое веб-приложение -> расшифровку с помощью Google-Speech-To-Text -> отправьте ответ клиенту

Для рендеринга вашей страницы я рекомендовал ExpressJs, минимальную и гибкую Node.js структуру веб-приложений, которая предоставляет надежный набор функций для веб-приложений и мобильных приложений.

После настройки веб-приложения вы можете попробовать с помощью Recorder. Js записать пользователя mi c, а затем отправить его в свое веб-приложение.

Клиент:

var filename = new Date().toISOString();
//filename to send to server without extension 
//upload link 
var upload = document.createElement('a');
upload.href = “/transcriptaudio”;
upload.innerHTML = "Upload";
upload.addEventListener("click", function(event) {
    var xhr = new XMLHttpRequest();
    xhr.onload = function(e) {
        if (this.readyState === 4) {
            console.log("Server returned: ", e.target.responseText);
        }
    };
    var fd = new FormData();
    fd.append("audio_data", blob, filename);
    xhr.open("POST", "upload.php", true);
    xhr.send(fd);
})
li.appendChild(document.createTextNode(" ")) //add a space in between 
li.appendChild(upload) //add the upload link to li

Сервер:

app.post(‘/transcriptaudio’, function (req, res) {

audio = req.body.audio_data;

// create a recognize stream
const recognizeStream = client
  .streamingRecognize(audio)
  .on('error', console.error)
  .on('data', data =>
    //console.log('test');
    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'
    )
    res.send(data.results[0].alternatives[0].transcript);
  );

});
...