[Python-es] Leer fichero al mismo tiempo que se está escribiendo por otro proceso.

Raúl Alexis Betancor Santana rabs en dimension-virtual.com
Jue Jul 4 08:55:56 EDT 2019


No puedo, los ficheros los genera Asterisk y no voy a estar tocando el código para eso. 

He probado añadiendo un delay de 250ms al inicio de la lectura, para darle tiempo a que haga un flush a disco, pero tampoco me vá. 

En realidad lo que me mosquea, es que un ejemplo que tengo en Node.js y que hace exactamente lo mismo, funciona perfectamente, pero el código de python se me queda en el for response in responses: ... osea, no llega nunca a recibir respuesta de GCS o el generador del read_in_chunks no está resolviendo o algo raro. 

Ahora lo estoy intentando con ARI, porque llevo días intentandolo con un script en python que ejecutaba desde el EAGI y tampoco había forma, o escuchaba el stream de audio y lo interpretaba o reproducía una locución del IVR, pero no ambas cosas al mismo tiempo y hacerlo vía threads, se me complicaba la cosa, hacerlo vía multiprocess y pipes, tenía el problema de que tenía que estar leyendo desde el proceso hijo el FD 3 del proceso padre, un coñazo. 

Si ha alguien se le ocurre como resolver esto ... estoy abierto a ideas. 

> De: "Daπid" <davidmenhur en gmail.com>
> Para: "python-es" <python-es en python.org>
> Enviados: Jueves, 4 de Julio 2019 11:57:11
> Asunto: Re: [Python-es] Leer fichero al mismo tiempo que se está escribiendo por
> otro proceso.

> Creo que has encontrado la solución, pero la has puesto en el lugar equivocado.

> #audio_file = io.open(stream_file+'.sln16','rb',buffering=0)

> El proceso que está escribiendo al archivo está probablemente usando un buffer,
> lo que quiere decir que sólo escribe al disco duro de vez en cuando, cuando
> haya acumulado una cierta cantidad de datos. Si tienes acceso al programa que
> escribe el archivo, tienes que o bien desactivar el buffer (¡cuidado con el
> rendimiento!), usar uno más pequeño, o vaciarlo explícitamente con un flush()
> más a menudo.

> On Thu, 4 Jul 2019 at 12:28, Raúl Alexis Betancor Santana < [
> mailto:rabs en dimension-virtual.com | rabs en dimension-virtual.com ] > wrote:

>> Buenas, estoy intentando hechar a andar el Google Cloud Speech, he intento leer
>> en stream de un fichero que está siendo escrito por otro proceso, que contiene
>> la grabación del audio, para enviarla al GCS, pero sin éxito.

>> ¿Alguien me puede comentar que estoy haciendo mal?, con el ejemplo que da GCS
>> para hacer lo mismo con un fichero directamente, que lo que hace es leerlo
>> completo en memoria y enviarlo, no me da problemas y transcribe bien el texto.

>> Basandome en el código de ejemplo de GCS para streaming

>> def read_in_chunks(file_object,chunk_size):
>> """Lazy function (generator) to read a file piece by piece.
>> while True:
>> chunk = file_object.read(chunk_size)
>> if not chunk:
>> return
>> data = [chunk]
>> yield b''.join(data)

>> def transcribe_streaming(stream_file,language,timeout):
>> """Streams transcription of the given audio file."""
>> from google.cloud import speech
>> from google.cloud.speech import enums
>> from google.cloud.speech import types
>> import io
>> client = speech.SpeechClient()

>> #audio_file = io.open(stream_file+'.sln16','rb',buffering=0)
>> audio_file = io.open(stream_file+'.sln16','rb')
>> # In practice, stream should be a generator yielding chunks of audio data.
>> requests = (types.StreamingRecognizeRequest(audio_content=chunk)
>> for chunk in read_in_chunks(audio_file,3200))

>> config = types.RecognitionConfig(
>> encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
>> sample_rate_hertz=16000,
>> language_code=language)
>> #streaming_config =
>> types.StreamingRecognitionConfig(config=config,single_utterance=True)
>> streaming_config = types.StreamingRecognitionConfig(config=config)

>> # streaming_recognize returns a generator.
>> responses = client.streaming_recognize(streaming_config, requests)
>> for response in responses:
>> # Once the transcription has settled, the first result will contain the
>> # is_final result. The other results will be for subsequent portions of
>> # the audio.
>> for result in response.results:
>> if result.is_final:
>> print('Finished: {}'.format(result.is_final))
>> print('Stability: {}'.format(result.stability))
>> alternatives = result.alternatives
>> ### The alternatives are ordered from most likely to least.
>> for alternative in alternatives:
>> print('Confidence: {}'.format(alternative.confidence))
>> print(u'Transcript: {}'.format(alternative.transcript))
>> (null)
>> _______________________________________________
>> Python-es mailing list
>> [ mailto:Python-es en python.org | Python-es en python.org ]
>> [ https://mail.python.org/mailman/listinfo/python-es |
>> https://mail.python.org/mailman/listinfo/python-es ]

> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20190704/8a697659/attachment.html>


Más información sobre la lista de distribución Python-es