¿Cómo puedo ejecutar “say --output-file” sin que se cuelgue (y peor) con más de 310 bytes de entrada?

3

Por mi curiosidad no comercial, estoy interesado en convertir parte del trabajo de Lewis Carroll en un discurso generado por una máquina. Al enviar la salida a un dispositivo de audio, el comando say puede hacer esto incluso con grandes cantidades de entrada:

$ wc ~/Downloads/lewis-carroll.txt 
    7066   55439  311589 /Users/xxxx/Downloads/lewis-carroll.txt

$ date; time say -f ~/Downloads/lewis-carroll.txt; date
Wed Oct  3 00:24:38 EDT 2018

real    368m11.986s
user    0m0.009s
sys 0m0.011s
Wed Oct  3 06:32:50 EDT 2018

Al enviar la salida a un archivo, parece que también funciona con cantidades muy pequeñas de texto de entrada:

$ date; head -c 310 ~/Downloads/lewis-carroll.txt | time say -o lewis-carroll.aac; date; ls -l lewis-carroll.aac
Thu Oct  4 08:46:18 EDT 2018
        0.17 real         0.08 user         0.02 sys
Thu Oct  4 08:46:18 EDT 2018
-rw-r--r--  1 xxxx  staff  81426 Oct  4 08:46 lewis-carroll.aac

Con más entradas, no funciona:

$ date; time head -c 311 ~/Downloads/lewis-carroll.txt | say -o lewis-carroll.aac; date; ls -l lewis-carroll.aac
Thu Oct  4 08:46:40 EDT 2018

(se cuelga!)

^C

real    0m30.243s
user    0m0.090s
sys 0m0.028s
Thu Oct  4 08:47:11 EDT 2018
-rw-r--r--  1 xxxx  staff  80865 Oct  4 08:46 lewis-carroll.aac

Eso es solo el comienzo de los problemas. Los intentos adicionales de ejecutar say también se cuelgan, sin importar qué tan pequeña sea la entrada o dónde se supone que debe ir la salida (por ejemplo, say Hello ). Peor aún, tan pronto como se cuelga el primer comando say , Chrome comienza a hacer beachball. Afortunadamente, hay una solución directa para que el sistema vuelva a funcionar normalmente:

$ pkill speechsynthesisd say

(La solución encontrada aquí .)

Puedo entender que Apple quiera poner límites de frecuencia (o algo) en la síntesis de voz para evitar que las personas generen audiolibros baratos. (Lo que estaría bien; eso no es lo que estoy tratando de hacer). Esta sería una manera bastante horrible de implementar la limitación de velocidad.

No entiendo este error tan mal que otro software (como Chrome) se desordena.

Hice algo como esto en 2012 (con un par de kilobytes de texto) sin encontrarme nada como esto. No tengo suficiente historia para reproducir eso.

¿Hay alguna manera de evitar este lío?

Ejecutar en: macOS 10.13.6 (17G65)

Actualización:

Al igual que @ashley, puedo convertir una gran parte del diccionario a voz:

$ date; time head -c 2000 /usr/share/dict/words | say -o words.aac; date; ls -l words.aac
Mon Oct  8 09:54:50 EDT 2018

real    0m2.552s
user    0m0.555s
sys 0m0.111s
Mon Oct  8 09:54:53 EDT 2018
-rw-r--r--  1 xxxx  staff  543542 Oct  8 09:54 words.aac

Mirando más detenidamente mi entrada, descubrí que estaba en formato DOS (las líneas terminan con CR-LF) en lugar del formato Unix nativo de macOS (las líneas terminan con LF). Hice una copia en el último formato, eliminando seis caracteres CR del principio de mi archivo ... y ahora say puede manejar seis caracteres menos antes de colgar:

$ date; head -c 304 ~/Downloads/lewis-carroll-lf.txt | time say -o lewis-carroll.aac; date; ls -l lewis-carroll.aac
Mon Oct  8 09:49:51 EDT 2018
        0.18 real         0.09 user         0.02 sys
Mon Oct  8 09:49:52 EDT 2018
-rw-r--r--  1 xxxx  staff  81426 Oct  8 09:49 lewis-carroll.aac
$ date; head -c 305 ~/Downloads/lewis-carroll-lf.txt | time say -o lewis-carroll.aac; date; ls -l lewis-carroll.aac
Mon Oct  8 09:49:55 EDT 2018
Command terminated abnormally.
       29.72 real         0.09 user         0.02 sys
Mon Oct  8 09:50:25 EDT 2018
-rw-r--r--  1 xxxx  staff  80865 Oct  8 09:49 lewis-carroll.aac

(Añadiré más información sobre mi entrada al final de esta pregunta).

En cuanto a las otras sugerencias de @ ashley:

  • He intentado dividir la entrada en archivos más pequeños y convertirlos individualmente. Esto es muy útil para explorar con qué estoy jugando. Necesito saltar a través de muchos, muchos aros para hacer que esto funcione. (Puedo documentar esto aún más si ayuda).

  • Tenía la esperanza de hacer todo esto desde la línea de comandos, sin recurrir a la captura de audio. Puede que termine siendo mi mejor opción para crear un gran archivo de audio.

  • Puedo reproducir este problema con la voz de Alex, la opción predeterminada para mí y mi preferencia en este momento, pero no con la voz de Daniel (aunque obtengo 79699 en lugar de 69867):

    $ date; head -c 305 ~/Downloads/lewis-carroll-lf.txt | time say -v Daniel -o lewis-carroll.aac; date; ls -l lewis-carroll.aac
    Mon Oct  8 19:53:11 EDT 2018
            0.68 real         0.08 user         0.03 sys
    Mon Oct  8 19:53:11 EDT 2018
    -rw-r--r--  1 xxxx  staff  79699 Oct  8 19:53 lewis-carroll.aac
    $ date; head -c 305 ~/Downloads/lewis-carroll-lf.txt | time say -v Alex -o lewis-carroll.aac; date; ls -l lewis-carroll.aac
    Mon Oct  8 19:53:21 EDT 2018
    Command terminated abnormally.
           21.75 real         0.08 user         0.02 sys
    Mon Oct  8 19:53:43 EDT 2018
    -rw-r--r--  1 xxxx  staff  80865 Oct  8 19:53 lewis-carroll.aac
    

    Esto sugiere una solución obvia ... Lo intentaré en un momento.

Aquí está mi entrada actual:

$ head -n 11 ~/Downloads/lewis-carroll-lf.txt
Alice was beginning to get very tired of sitting by her sister on the
bank, and of having nothing to do: once or twice she had peeped into the
book her sister was reading, but it had no pictures or conversations in
it, 'and what is the use of a book,' thought Alice 'without pictures or
conversations?'

So she was considering in her own mind (as well as she could, for the
hot day made her feel very sleepy and stupid), whether the pleasure
of making a daisy-chain would be worth the trouble of getting up and
picking the daisies, when suddenly a White Rabbit with pink eyes ran
close by her.
$ head -n 11 ~/Downloads/lewis-carroll-lf.txt | od -c
0000000    A   l   i   c   e       w   a   s       b   e   g   i   n   n
0000020    i   n   g       t   o       g   e   t       v   e   r   y    
0000040    t   i   r   e   d       o   f       s   i   t   t   i   n   g
0000060        b   y       h   e   r       s   i   s   t   e   r       o
0000100    n       t   h   e  \n   b   a   n   k   ,       a   n   d    
0000120    o   f       h   a   v   i   n   g       n   o   t   h   i   n
0000140    g       t   o       d   o   :       o   n   c   e       o   r
0000160        t   w   i   c   e       s   h   e       h   a   d       p
0000200    e   e   p   e   d       i   n   t   o       t   h   e  \n   b
0000220    o   o   k       h   e   r       s   i   s   t   e   r       w
0000240    a   s       r   e   a   d   i   n   g   ,       b   u   t    
0000260    i   t       h   a   d       n   o       p   i   c   t   u   r
0000300    e   s       o   r       c   o   n   v   e   r   s   a   t   i
0000320    o   n   s       i   n  \n   i   t   ,       '   a   n   d    
0000340    w   h   a   t       i   s       t   h   e       u   s   e    
0000360    o   f       a       b   o   o   k   ,   '       t   h   o   u
0000400    g   h   t       A   l   i   c   e       '   w   i   t   h   o
0000420    u   t       p   i   c   t   u   r   e   s       o   r  \n   c
0000440    o   n   v   e   r   s   a   t   i   o   n   s   ?   '  \n  \n
0000460    S   o       s   h   e       w   a   s       c   o   n   s   i
0000500    d   e   r   i   n   g       i   n       h   e   r       o   w
0000520    n       m   i   n   d       (   a   s       w   e   l   l    
0000540    a   s       s   h   e       c   o   u   l   d   ,       f   o
0000560    r       t   h   e  \n   h   o   t       d   a   y       m   a
0000600    d   e       h   e   r       f   e   e   l       v   e   r   y
0000620        s   l   e   e   p   y       a   n   d       s   t   u   p
0000640    i   d   )   ,       w   h   e   t   h   e   r       t   h   e
0000660        p   l   e   a   s   u   r   e  \n   o   f       m   a   k
0000700    i   n   g       a       d   a   i   s   y   -   c   h   a   i
0000720    n       w   o   u   l   d       b   e       w   o   r   t   h
0000740        t   h   e       t   r   o   u   b   l   e       o   f    
0000760    g   e   t   t   i   n   g       u   p       a   n   d  \n   p
0001000    i   c   k   i   n   g       t   h   e       d   a   i   s   i
0001020    e   s   ,       w   h   e   n       s   u   d   d   e   n   l
0001040    y       a       W   h   i   t   e       R   a   b   b   i   t
0001060        w   i   t   h       p   i   n   k       e   y   e   s    
0001100    r   a   n  \n   c   l   o   s   e       b   y       h   e   r
0001120    .  \n                                                        
0001122
    
pregunta user10543 07.10.2018 - 00:29

1 respuesta

1

Lo he intentado, pero no puedo reproducir este problema.

En mi máquina (que también ejecuta 10.13.6 17G65):

$ date; time head -c 2000 /usr/share/dict/words | say -o words.aac; date; ls -l words.aac
Sun  7 Oct 2018 21:17:52 BST
real    0m2.630s
user    0m0.519s
sys 0m0.152s
Sun  7 Oct 2018 21:17:55 BST
-rw-r--r--  1 ashley  staff  532880  7 Oct 21:17 words.aac

Estoy usando /usr/share/dict/words (ver /usr/share/dict/README ) porque no tengo lewis-carroll.txt . No he podido hacer que say se bloquee.

¿Quizás say se está atragantando con algo en lewis-carroll.txt (pero solo cuando se envía la salida a un archivo, lo que parece extraño)?

Dos ideas de la parte superior de mi cabeza para solucionar esto, si lo anterior no ayuda ...

  1. Envía una oración a say a la vez, luego combina los archivos de salida.

  2. O bien, haga que say envíe al dispositivo de salida de audio, pero grabe eso con, por ejemplo, Secuestro de audio .

(Pregunta bien escrita, por cierto: muchos detalles relevantes, presentados de manera concisa.)

    
respondido por el Ashley 07.10.2018 - 22:29

Lea otras preguntas en las etiquetas