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