Я пытаюсь адаптировать 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)