Google Speech API из клиентского микропотока: формат данных - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь адаптировать Java codeLabs к Python / SocketIO (Flask Socket IO на стороне сервера). Мой сокет работает, я могу передавать как частоту дискретизации (и для извлечения на стороне сервера), так и аудиоданные.

Проблема в том, что формат моих аудиоданных неверен. Я отправляю это так:

// Create a node that sends raw bytes across the websocket
var scriptNode = context.createScriptProcessor(4096, 1, 1);

// Need the maximum value for 16-bit signed samples, to convert from float.
const MAX_INT = Math.pow(2, 16 - 1) - 1;

scriptNode.addEventListener('audioprocess', function(e) {
  var floatSamples = e.inputBuffer.getChannelData(0);
  // The samples are floats in range [-1, 1]. Convert to 16-bit signed
  // integer.
  socket.emit('audiodata', Int16Array.from(floatSamples.map(function(n) {
    return n * MAX_INT;
})));

Это код из codeLabs, но я использую socket.emit вместо socket.send.

Код Python для обработки и отправки его в Speech API:

credentials = service_account.Credentials.from_service_account_file(CONFIG[u"service_account"])
client = speech.SpeechClient(credentials=credentials)
config = types.RecognitionConfig(
  encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
  sample_rate_hertz=44100,
  language_code=u"fr"
)
streaming_config = types.StreamingRecognitionConfig(
  config=config,
  interim_results=True,
  single_utterance=False)

@socketio.on(u'audiodata')
def handle_audio_data_msg(audio_data_msg):
    print u'Received raw audio.'
    print audio_data_msg
    for response in client.streaming_recognize(streaming_config, [audio_data_msg]):
        print response
    emit(u'audiodatareceived', {u"AudioData": u"Acquired"})

Я получил TypeError: descriptor 'SerializeToString' requires a 'google.protobuf.pyext._message.CMessage' object but received a 'dict'
поэтому я попытался на передней стороне пройти Int16Array.from(...).buffer, но я получил TypeError: descriptor 'SerializeToString' requires a 'google.protobuf.pyext._message.CMessage' object but received a 'str'

Так что я не уверен, как мне передавать данные ... Любая помощь приветствуется!

[править] Я переписал свой обработчик, потому что я думаю, что я не использовал правильный тип, теперь это так:

@socketio.on(u'audiodata')
def handle_audio_data_msg(audio_data_msg):
    print u'Received raw audio.'
    request = types.StreamingRecognizeRequest(audio_content=audio_data_msg)
    response = client.streaming_recognize(streaming_config, [request])
    for item in response:
        print u"error", item.get(u"error")
        print u"results", item.get(u"results")
        print u"resultIndex", item.get(u"resultIndex")
        print u"endpointerType", item.get(u"endpointerType")

    emit(u'audiodatareceived', {u"AudioData": u"Acquired"})

Я не получаю никакой ошибки, но не получаю ответа (пустой список), поэтому ничего не напечатано ...

[edit2] : Я понял, что тип моего ввода - это не двоичные данные, а str. Может ли проблема прийти отсюда? Я пытаюсь создать экземпляр моего приложения Flask Socket IO следующим образом, но все равно тип str.
socketio = SocketIO(app, binary=True)

...