<div dir="ltr"><div>Buenas,<br></div><div><br></div><div>El código que has mandado tiene pinta de ser un corta y pega de tu código real, por lo que nadie mas que tu va a poder reproducirlo. Así que lo único que veo viable es hablarte de las herramientas que usaría para investigarlo y que lo hagas tu mismo por tu cuenta.</div><div><br></div><div>Usa un depurador</div><div>--------------------------</div><div>Python viene con pdb incluido, aquí tienes un depurador para usarlo <a href="https://www.pybonacci.org/2013/06/14/como-depurar-un-programa-python-con-pdb/">https://www.pybonacci.org/2013/06/14/como-depurar-un-programa-python-con-pdb/</a> Si usas algún IDE (por ejemplo pycharm) esto lo podrás hacer de una forma más visual. Con esto podrás ver si te está lanzando alguna excepción que estés enmascarando o ponerte a ejecutar código para ver información del fichero con os.stat() o lo que sea.<br></div><div><br></div><div>Evalúa las llamadas al sistema</div><div>----------------------------------------------</div><div>Dices tener un código en node.js que funciona, pero en python no. Es posible que analizando llamadas al sistema de uno y otro código encuentres alguna diferencia que te sea inspiradora para encontrar tu problema. Puedes usar el comando de linux strace o el truss de freebsd u otros unix para encontrar las llamadas que se hacen.<br></div><div><br></div><div>Prueba un cambio de paradigma</div><div>-----------------------------------------------</div><div>Quieres leer un fichero que está constantemente cambiando por lo que usar llamadas a sistema como kqueue en freebsd o inotify en linux pueden ayudarte a recibir eventos cuando el fichero cambie y leerlo entonces. Hay librerias dependiendo de tu SO (algunas son multiplataforma) para hacer un poco más fácil esta tarea (por ejemplo pyinotify para linux). Con esto evitas tener que hacer pollings para ver si hay nuevos datos o no y solo lees cuando sabes que tienes nuevos datos en el fichero.</div><div><br></div><div>Espero que algo de esto te sirva.</div><div><br></div><div>Un saludo,</div><div><br></div><div>Javi<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">El jue., 4 jul. 2019 a las 21:17, Raúl Alexis Betancor Santana (<<a href="mailto:rabs@dimension-virtual.com">rabs@dimension-virtual.com</a>>) escribió:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div style="font-family:arial,helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)"><div>El archivo no está vacío ... le he puesto un sleep de 2s para hacer pruebas ANTES de abrir el fichero, y veo que en el FS tiene tamaño, así que de vacio nada. Lo que no entiendo es porqué no lee absolutamente nada.<br></div><div><br></div><hr id="gmail-m_3118773258812618780zwchr"><div><blockquote style="border-left:2px solid rgb(16,16,255);margin-left:5px;padding-left:5px;color:rgb(0,0,0);font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt"><b>De: </b>"Daπid" <<a href="mailto:davidmenhur@gmail.com" target="_blank">davidmenhur@gmail.com</a>><br><b>Para: </b>"python-es" <<a href="mailto:python-es@python.org" target="_blank">python-es@python.org</a>><br><b>Enviados: </b>Jueves, 4 de Julio 2019 19:29:52<br><b>Asunto: </b>Re: [Python-es] Leer fichero al mismo tiempo que se está escribiendo por otro proceso.<br></blockquote></div><div><blockquote style="border-left:2px solid rgb(16,16,255);margin-left:5px;padding-left:5px;color:rgb(0,0,0);font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt"><div dir="auto">El archivo está vacío, así que chunk es una cadena vacía. Esa función asume que el archivo no está creciendo, así que cuando no lee más, el archivo está terminado.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, 4 Jul 2019, 7:56 pm Raúl Alexis Betancor Santana, <<a href="mailto:rabs@dimension-virtual.com" target="_blank">rabs@dimension-virtual.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div style="font-family:arial,helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)"><div>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.<br></div><br><div>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.<br></div><br><div>¿Que estoy haciendo rematadamente mal, que no soy capaz de leer un fichero binario a trozos? ... :-(<br></div><br><hr id="gmail-m_3118773258812618780m_1826903648798655715zwchr"><div><blockquote style="border-left:2px solid rgb(16,16,255);margin-left:5px;padding-left:5px;color:rgb(0,0,0);font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt"><b>De: </b>"Raúl Alexis Betancor Santana" <<a href="mailto:rabs@dimension-virtual.com" rel="noreferrer" target="_blank">rabs@dimension-virtual.com</a>><br><b>Para: </b>"python-es" <<a href="mailto:python-es@python.org" rel="noreferrer" target="_blank">python-es@python.org</a>><br><b>Enviados: </b>Jueves, 4 de Julio 2019 13:55:56<br><b>Asunto: </b>Re: [Python-es] Leer fichero al mismo tiempo que se está escribiendo por otro proceso.<br></blockquote></div><div><blockquote style="border-left:2px solid rgb(16,16,255);margin-left:5px;padding-left:5px;color:rgb(0,0,0);font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt"><div style="font-family:arial,helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)"><div>No puedo, los ficheros los genera Asterisk y no voy a estar tocando el código para eso.<br></div><br><div>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á.<br></div><br><div>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.<br></div><br><div>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.<br></div><br><div>Si ha alguien se le ocurre como resolver esto ... estoy abierto a ideas.<br></div><br><hr id="gmail-m_3118773258812618780m_1826903648798655715zwchr"><div><blockquote style="border-left:2px solid rgb(16,16,255);margin-left:5px;padding-left:5px;color:rgb(0,0,0);font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt"><b>De: </b>"Daπid" <<a href="mailto:davidmenhur@gmail.com" rel="noreferrer" target="_blank">davidmenhur@gmail.com</a>><br><b>Para: </b>"python-es" <<a href="mailto:python-es@python.org" rel="noreferrer" target="_blank">python-es@python.org</a>><br><b>Enviados: </b>Jueves, 4 de Julio 2019 11:57:11<br><b>Asunto: </b>Re: [Python-es] Leer fichero al mismo tiempo que se está escribiendo por otro proceso.<br></blockquote></div><div><blockquote style="border-left:2px solid rgb(16,16,255);margin-left:5px;padding-left:5px;color:rgb(0,0,0);font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt"><div dir="ltr"><div>Creo que has encontrado la solución, pero la has puesto en el lugar equivocado.</div><br><div>#audio_file = io.open(stream_file+'.sln16','rb',buffering=0) <br></div><br><div>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.<br></div><br><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, 4 Jul 2019 at 12:28, Raúl Alexis Betancor Santana <<a href="mailto:rabs@dimension-virtual.com" rel="noreferrer" target="_blank">rabs@dimension-virtual.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">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.<br>
<br>
¿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.<br>
<br>
Basandome en el código de ejemplo de GCS para streaming <br>
<br>
def read_in_chunks(file_object,chunk_size):<br>
   """Lazy function (generator) to read a file piece by piece.<br>
   while True:<br>
     chunk = file_object.read(chunk_size)<br>
     if not chunk:<br>
       return<br>
     data = [chunk]<br>
     yield b''.join(data)<br>
<br>
def transcribe_streaming(stream_file,language,timeout): <br>
"""Streams transcription of the given audio file.""" <br>
from google.cloud import speech <br>
from google.cloud.speech import enums <br>
from google.cloud.speech import types <br>
import io <br>
client = speech.SpeechClient() <br>
<br>
#audio_file = io.open(stream_file+'.sln16','rb',buffering=0) <br>
audio_file = io.open(stream_file+'.sln16','rb') <br>
# In practice, stream should be a generator yielding chunks of audio data. <br>
requests = (types.StreamingRecognizeRequest(audio_content=chunk) <br>
for chunk in read_in_chunks(audio_file,3200)) <br>
<br>
config = types.RecognitionConfig( <br>
encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16, <br>
sample_rate_hertz=16000, <br>
language_code=language) <br>
#streaming_config = types.StreamingRecognitionConfig(config=config,single_utterance=True) <br>
streaming_config = types.StreamingRecognitionConfig(config=config) <br>
<br>
# streaming_recognize returns a generator. <br>
responses = client.streaming_recognize(streaming_config, requests) <br>
for response in responses: <br>
   # Once the transcription has settled, the first result will contain the <br>
   # is_final result. The other results will be for subsequent portions of <br>
   # the audio. <br>
   for result in response.results: <br>
      if result.is_final: <br>
         print('Finished: {}'.format(result.is_final)) <br>
         print('Stability: {}'.format(result.stability)) <br>
         alternatives = result.alternatives <br>
         ### The alternatives are ordered from most likely to least. <br>
         for alternative in alternatives: <br>
            print('Confidence: {}'.format(alternative.confidence)) <br>
            print(u'Transcript: {}'.format(alternative.transcript))<br>
(null)<br>
_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" rel="noreferrer" target="_blank">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a><br>
</blockquote></div>
<br>_______________________________________________<br>Python-es mailing list<br><a href="mailto:Python-es@python.org" rel="noreferrer" target="_blank">Python-es@python.org</a><br><a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a><br></blockquote></div></div><br>_______________________________________________<br>Python-es mailing list<br><a href="mailto:Python-es@python.org" rel="noreferrer" target="_blank">Python-es@python.org</a><br><a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a><br></blockquote></div></div></div>_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" rel="noreferrer" target="_blank">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a><br>
</blockquote></div>
<br>_______________________________________________<br>Python-es mailing list<br><a href="mailto:Python-es@python.org" target="_blank">Python-es@python.org</a><br><a href="https://mail.python.org/mailman/listinfo/python-es" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a><br></blockquote></div></div></div>_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" target="_blank">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-es</a><br>
</blockquote></div>