[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 13:55:32 EDT 2019


Haciendo más pruebas, he llegado a la conclusión, de que lo que está mal es la función de read_in_chunks ... ya que nunca lee nada y siempre acaba dentro del if not chunk: break ... y no entiendo porque narices. 

En todos los ejemplos que encuentro por la red para leer un fichero binario por porciones, siempre usan mas o menos el mismo estilo de código para la función, pero esta parece que nunca lee nada. 

¿Que estoy haciendo rematadamente mal, que no soy capaz de leer un fichero binario a trozos? ... :-( 

> De: "Raúl Alexis Betancor Santana" <rabs en dimension-virtual.com>
> Para: "python-es" <python-es en python.org>
> Enviados: Jueves, 4 de Julio 2019 13:55:56
> Asunto: Re: [Python-es] Leer fichero al mismo tiempo que se está escribiendo por
> otro proceso.

> 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

> _______________________________________________
> 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/39935014/attachment.html>


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