How read correctly with speechrecognition python library pcm 16 bit audio object

104 Views Asked by At

I have a kivy app on my android system that send 16bit pcm audio data to a flask server:

def listen_for_speech(self): 
    AudioRecord = autoclass('android.media.AudioRecord')
    AudioFormat = autoclass('android.media.AudioFormat')
    AudioSource = autoclass('android.media.MediaRecorder$AudioSource')

    autoclass('org.kivy.android.PythonActivity').mActivity


    sample_rate = 16000  
    channel_config = AudioFormat.CHANNEL_IN_MONO
    audio_format = AudioFormat.ENCODING_PCM_16BIT
    buffer_size = AudioRecord.getMinBufferSize(sample_rate, channel_config, audio_format)
    print(buffer_size)
    print(audio_format)
    print(channel_config)

    audio_record = AudioRecord(
    AudioSource.MIC,
        sample_rate,
        channel_config,
        audio_format,
        buffer_size
    )

    audio_buffer = bytearray(buffer_size)
    audio_record.startRecording()

    while True:

        audio_record.read(audio_buffer, 0, buffer_size)


        audio_data = bytes(audio_buffer)
        sio.emit('sentence', audio_data)
        time.sleep(5)

Server flask:

from flask import Flask, request 
from flask_socketio import SocketIO, emit 
from time import sleep 
import speech_recognition as sr 
import io

app = Flask(name)
socketio = SocketIO(app)
@app.route('/') 
def index(): 
    return "Server Flask"
@socketio.on('sentence')
def process_sentence(audio_data): 
    recognizer = sr.Recognizer()
    sample_rate = 16000
    audio = sr.AudioData(audio_data, sample_rate, sample_width=2)
    text = recognizer.recognize_google(audio, language="it-IT")
    print(text)
if name == 'main': socketio.run(app, host='0.0.0.0', port=8000)

When the data arrives on the server recognize_google function throw exception:
speech_recognition.exceptions.UnknownValueError

I tried also with wave library to force wav format, but seems they not in the correct format for wave library:

def process_sentence(audio_data):
    recognizer = sr.Recognizer()
    sample_rate = 16000 
    audio_io = io.BytesIO(audio_data)
    with wave.open(audio_io, 'rb') as wave_file:
        sample_width = wave_file.getsampwidth()
        sample_rate = wave_file.getframerate()

        audio_frames = wave_file.readframes(wave_file.getnframes())
    audio = sr.AudioData(audio_frames, sample_rate, sample_width=sample_width)
    
    
    text = recognizer.recognize_google(audio, language="it-IT")
    print(text)

And the error was:
raise Error('file does not start with RIFF id')

wave.Error: file does not start with RIFF id

An example of the audio_data variable arrived on server:

b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x01U\x01\x91\x01\xae\x03s\x02C\xff\xfa\xff\xb4\x01\x15\x00\x86\xff$\x03L\x01k\xff~\xff?\xff.\x00\xca\xff\xb6\x02\xf2\xfe\xf3\xfes\x01\xcb\x02l\x00I\xfd\xe5\x02g\x020\x01\xc5\x01\x8a\x01\xb5\xff\xf2\x02\xa5\x01\xb7\x005\x02+\x02\x98\x02\xb5\x01\x9a\xff\xb0\xff\xce\xfd-\x010\x02\x82\x00!\x04\x1e\xffC\xfdO\x00\x11\x03\xaf\x005\x00R\x01\xff\xfe\xfd\x00\xc7\xff\x08\xff.\x01M\xfe\xd2\xfe\xd1\x01\x89\x01V\x01A\x02\x08\xff\xd4\xfe\x1f\xffU\x00\x84\x052\x03\x98\x017\x02{\x00\x87\xff\x01\x06!\x05\xd9\x03J\x04\x0f\x01\xf1\x005\x03{\x04T\x05%\x03\x9f\x00=\x02\xc6\x02s\x03\xa7\x05(\x02V\xfb\xd1\xfe\x1b\x01"\x01\xc0\x01\xa4\x02\xb8\xfbz\xfb\xd4\xfa|\xfb\xe9\x00J\x00/\xfd\xc6\xf9\xcf\xf8\x87\xf9\xb0\xff\xff\xd6\xfa\x97\xf9"\xf6\xd2\xfc\xec\xfdp\xfc=\xfd\x96\xf9\xa9\xf6\t\xfb\xa2\x01\x08\xff\x8d\xfdn\xf9J\xfd\xa8\xfe\xf7\xfe\xec\xff\xa2\xffX\xfa;\xfcY\xff\xc3\xff\x03\x02\x10\x00\xef\xfd"\xfd\xfc\xfb\x04\xfe\x91\x01\xd8\xff\x0b\x00\x92\xfd\xdd\xfa\xc0\xfe*\x03\xca\x03\x12\x00\x13\xfd<\xfcz\x00\xbe\x07i\x03\xd9\xff\xf4\xfce\xfb"\x04\xec\x05\xc6\x05@\x02\xd6\xfbF\xfd\xaa\x01\xa9\x06#\x04\x1c\x02\xa0\xff\xed\xfa\x05\x02\x10\x05\xda\x04r\x01\x8b\xff\xb2\x01\xcc\x00\x8e\x07"\x08\xed\x04T\x00\x12\xfe\xc8\xfc\x93\x01\xf5\x06\xb7\x02'\xff\x1f\xf9\x7f\xf9\xe1\xfe\xe3\x02Q\x01\xbf\xfez\xfa\xbd\xfb\xdd\x00\xe7\xff\x0b\x01\x86\x01\xfe\xfb\xac\xfd%\x04\x85\x03\xa3\x00\xf4\x02\xd4\xff\xfe\xfdA\x04\xae\x07\x1f\x03\x8f\x03\xd8\x04\xcb\x04\xcb\x03\xcf\x06\xb0\x07\xf4\x031\x07\t\x067\x03\xad\x05\xc9\x07\xe9\x01\x08\xfd\xe3\x01\xeb\x03\x7f\x03\xb2\x04\xc0\xffi\xfc\xde\xf9\xb5\xfcV\x01\x80\x01\xa9\xfe\xa8\xf8X\xf8\x9a\xfeY\x00u\xfe{\xf9\x02\xf7\xce\xfaT\xfe\x83\xfd\xd5\xfc\xc1\x02d\xfd\xd3\xf6\x1e\xfb\xe5\xfeU\x01\xc1\xfdp\xfe.\xf8\xb2\xf7w\xff\xd3\x01I\xff\xa4\xfe7\xfe.\xfb\xbe\xfb)\x00Y\x03\xfc\xff\xb5\xfe\xe7\xf99\xfc&\x00Z\x07\xa9\xff9\xfc\x0f\xfd\x00\xfdG\x00\xf2\x03^\x06\xb5\xfd\xfb\xa5\xfc\xb6\xfc\xee\x00\x1e\x05\x84\x01\x9d\xfa<\x00\x0f\xfc\x9e\xf8\xe6\x03)\x05\xd6\xfd\xe8\x00\x8d\xff\xdc\xf9x\x04R\n#\x01j\xfb\xe2\xfd\xc3\xfe\x9b\x01\xe6\x02\xcf\x08a\xffg\xf7\xea\xfc\xa4\xfbJ\x01n\x07\xc1\x03\xdb\xfe\x05\x01\xb1\xfc\xba\xfdr\x03-\x06l\xfe\xe6\x03\xa9\xfc\x86\xf7\xc2\x003\x08\xe9\x020\xfd\x06\xfc' 
0

There are 0 best solutions below