Page 323 - 3-2
P. 323

# the final bit of the buffer and exit the loop.
                    if None in data:
                        stop = True
                        data.remove(None)


                    yield b''.join(data)




            def _fill_buffer(buff, in_data, frame_count, time_info, status_flags):
                """Continuously collect data from the audio stream, into the buffer."""
                buff.put(in_data)
                return None, pyaudio.paContinue




            # [START audio_stream]
            @contextlib.contextmanager
            def record_audio(rate, chunk):
                """Opens a recording stream in a context manager."""
                # Create a thread-safe buffer of audio data
                buff = queue.Queue()


                audio_interface = pyaudio.PyAudio()
                audio_stream = audio_interface.open(
                    format=pyaudio.paInt16,
                    # The API currently only supports 1-channel (mono) audio
                    # https://goo.gl/z757pE
                    channels=1, rate=rate,
                    input=True, frames_per_buffer=chunk,
                    # Run the audio stream asynchronously to fill the buffer object.
                    # This is necessary so that the input device's buffer doesn't overflow
                    # while the calling thread makes network requests, etc.
                    stream_callback=functools.partial(_fill_buffer, buff),
                )


                yield _audio_data_generator(buff)


                audio_stream.stop_stream()
                audio_stream.close()
                # Signal the _audio_data_generator to finish
                buff.put(None)
                audio_interface.terminate()
            # [END audio_stream]




            def request_stream(data_stream, rate, interim_results=True):


                                                         - 323 -
   318   319   320   321   322   323   324   325   326   327   328