Come posso eseguire "say --output-file" senza che penda (e peggio) con più di 310 byte di input?

3

Per la mia curiosità non commerciale, sono interessato a trasformare parte del lavoro di Lewis Carroll in un discorso generato dalla macchina. Quando si invia l'output a un dispositivo audio, il comando say può farlo anche con grandi quantità di input:

$ 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

Quando si invia l'output a un file, sembra funzionare anche con piccole quantità di testo di input:

$ 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 altri input, non funziona:

$ 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

(si blocca!)

^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

Questo è solo l'inizio dei problemi. Ulteriori tentativi di eseguire say si bloccano, non importa quanto piccolo sia l'input o dove l'output dovrebbe andare (ad es. say Hello ). Peggio ancora, non appena si blocca il primo comando say , Chrome avvia il beach ball. Fortunatamente, c'è una semplice soluzione per riportare il sistema al normale funzionamento:

$ pkill speechsynthesisd say

(Soluzione alternativa trovata qui .)

Riesco a capire che Apple vuole inserire limiti di velocità (o qualcosa) sulla sintesi vocale, per evitare che le persone generino audiolibri economici. (Il che andrebbe bene, non è quello che sto cercando di fare.) Questo sarebbe un modo piuttosto orribile per implementare la limitazione della velocità.

Non capisco che questo non funzioni così male che altri software (come Chrome) sono incasinati.

Ho fatto qualcosa del genere nel 2012 (su un paio di kilobyte di testo) senza imbattersi in qualcosa di simile. Non ho abbastanza storia per riprodurlo.

C'è un modo per aggirare questo caos?

Esegui su: macOS 10.13.6 (17G65)

Aggiornamento:

Come @ashley, sono in grado di convertire una grande porzione del dizionario in parlato:

$ 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

Guardando più attentamente al mio input, ho scoperto che era in formato DOS (le linee terminavano con CR-LF) invece del formato Unix nativo di macOS (le linee terminavano con LF). Ho fatto una copia in quest'ultimo formato, rimuovendo sei caratteri CR dall'inizio del mio file ... e ora say può gestire sei caratteri in meno prima di essere appeso:

$ 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

(Aggiungerò ulteriori informazioni sul mio input alla fine di questa domanda.)

Per quanto riguarda gli altri suggerimenti di @ ashley:

  • Ho provato a suddividere l'input in file più piccoli e convertirli singolarmente. Questo è molto utile per esplorare ciò con cui sto giocando. Ho bisogno di passare attraverso molti, molti cerchi per farlo funzionare. (Posso documentarlo ulteriormente se aiuta.)

  • Speravo di fare tutto questo dalla riga di comando, senza ricorrere all'audio capture. Potrebbe essere la mia migliore opzione per creare un file audio di grandi dimensioni.

  • Posso riprodurre questo problema con la voce di Alex - l'impostazione predefinita per me, e la mia preferenza al momento - ma non la voce di Daniel (anche se ottengo 79699 invece di 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
    

    Questo suggerisce una ovvia soluzione ... Ci proverò tra poco.

Ecco il mio input corrente:

$ 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
    
posta user10543 07.10.2018 - 00:29
fonte

1 risposta

1

Ho provato, ma non riesco a riprodurre questo problema.

Sulla mia macchina (anche in esecuzione 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

Sto utilizzando /usr/share/dict/words (vedi /usr/share/dict/README ) perché non ho lewis-carroll.txt . Non riesco a bloccare say .

Forse say sta soffocando su qualcosa in lewis-carroll.txt (ma solo quando si invia l'output a un file, che sembra strano)?

Due idee in cima alla mia testa per aggirare questo problema, se quanto sopra non aiuta ...

  1. Invia una frase a say alla volta, quindi ricombina i file di output.

  2. Oppure, invia say al dispositivo di output audio, ma registralo con ad esempio Hijack audio .

(Domanda ben fatta, tra l'altro: molti dettagli rilevanti, presentati in modo conciso.)

    
risposta data 07.10.2018 - 22:29
fonte

Leggi altre domande sui tag