Я пытаюсь настроить сервер для приема аудио из клиентского браузера с помощью SocketIO
, затем обработать его через Google Speech-to-Text и, наконец, ответить клиенту с текстом.
Первоначально и в идеале я хотел настроить функционирование, аналогичное инструменту на этой странице: https://cloud.google.com/speech-to-text/
Я пытался использовать getUserMedia
и передавать его через SocketIO-Stream
, но не мог понятькак "труба" MediaStream
.
Вместо этого теперь я решил использовать MediaRecorder
на стороне клиента, а затем отправлять данные в виде большого двоичного объекта (см. В этом примере ).
Затем я применяю toString('base64')
для большого двоичного объекта и вызываю google-cloud / speech's client.recognize()
для большого двоичного объекта.
Клиентская часть (я использую VueJS):
new Vue({
el: '#app',
data: function () {
return ({
msgs: [],
socket: null,
recorder: null,
: []
})
},
mounted: function () {
this.socket = io.connect('localhost:3000/user');
console.log('Connected!')
this.socket.on('text', function (text) {
this.msgs.push(text)
})
},
methods: {
startRecording: function () {
if (this.recorder && this.recorder.state == 'recording') {
console.log("Stopping!")
this.recorder.stop()
} else {
console.log("Starting!")
navigator.mediaDevices.getUserMedia({ audio: true, video: false })
.then(this.handleSuccess);
}
},
handleSuccess: function (stream) {
this.recorder = new MediaRecorder(stream)
this.recorder.start(10000)
this.recorder.ondataavailable = (e) => {
this.chunks.push(e.data)
console.log(e.data)
}
this.recorder.onstop = (e) => {
const blob = new Blob(this.chunks, { 'type': 'audio/webm; codecs=opus' })
this.socket.emit('audio', blob)
}
}
}
})
Сторона сервера:
const speech = require('@google-cloud/speech');
const client = new speech.SpeechClient();
const io = require('socket.io').listen(3000)
const ss = require('socket.io-stream')
const encoding = 'LINEAR16';
const sampleRateHertz = 16000;
const languageCode = 'en-US';
const audio = {
content: null
}
const config = {
encoding: encoding,
sampleRateHertz: sampleRateHertz,
languageCode: languageCode,
}
async function main() {
const [response] = await client.recognize({
audio: audio,
config: config
})
const transcription = response.results
.map(result => result.alternatives[0].transcript)
.join('\n');
console.log(`Transcription: ${transcription}`);
}
io.of('/user').on('connection', function (socket) {
console.log('Connection made!')
socket.on('audio', function (data) {
audio.content = data.toString('base64')
main().catch(console.error)
});
});
Журнал функции main()
на стороне сервера всегда:
"Транскрипция:"
- пусто!
Он должен содержать текст из отправленного аудио.Заранее спасибо!