3 votes

Comment puis-je exécuter "say --output-file" sans qu'il se bloque (et pire) avec plus de 310 octets d'entrée ?

Pour ma curiosité non commerciale, je suis intéressé par la transformation d'une partie de l'œuvre de Lewis Carroll en discours généré par une machine. Lors de l'envoi de la sortie vers un appareil audio, les say La commande peut le faire même avec de très grandes quantités d'entrées :

$ 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

Lors de l'envoi de la sortie vers un fichier, il semble également fonctionner avec de très petites quantités de texte en entrée :

$ 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

Avec plus d'entrées, ça ne fonctionne pas :

$ 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

(hangs !)

^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

Ce n'est que le début des problèmes. D'autres tentatives d'exécuter say se bloque également, quelle que soit la taille de l'entrée ou l'endroit où la sortie est censée aller (par ex, say Hello ). Pire encore, dès que les premiers say se bloque, Chrome commence à faire de la plage. Heureusement, il existe une solution de contournement simple pour rétablir le fonctionnement normal du système :

$ pkill speechsynthesisd say

(Solution de contournement trouvée ici .)

Je peux comprendre qu'Apple veuille imposer des limites de débit (ou autre chose) à la synthèse vocale, pour empêcher les gens de générer des livres audio bon marché. (Ce qui serait bien ; ce n'est pas ce que j'essaie de faire.) Ce serait une façon assez horrible de mettre en œuvre la limitation du débit.

Je ne comprends pas que cette défaillance soit telle que d'autres logiciels (comme Chrome) soient perturbés.

J'ai fait quelque chose comme ça en 2012 (sur quelques kilooctets de texte) sans rencontrer ce genre de problème. Je n'ai pas assez d'historique pour reproduire cela.

Y a-t-il un moyen de contourner ce problème ?

Exécuter sur : MacOS 10.13.6 (17G65)

Mise à jour :

Comme @ashley, je suis capable de convertir une grande partie du dictionnaire en parole :

$ 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

En regardant plus attentivement mon entrée, j'ai découvert qu'elle était au format DOS (les lignes se terminent par CR-LF) au lieu du format Unix natif de MacOS (les lignes se terminent par LF). J'ai fait une copie dans ce dernier format, en supprimant six caractères CR du début de mon fichier ... et maintenant say peut gérer six caractères de moins avant de se suspendre :

$ 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

(J'ajouterai plus d'informations sur mon apport à la fin de cette question).

Quant aux autres suggestions de @ashley :

  • J'ai essayé de diviser l'entrée en petits fichiers et de les convertir individuellement. C'est très utile pour explorer ce avec quoi je joue. Je dois franchir de très nombreux obstacles pour que cela fonctionne. (Je peux documenter cela davantage si cela peut aider).

  • J'espérais pouvoir faire tout cela à partir de la ligne de commande, sans avoir recours à la capture audio. C'est peut-être ma meilleure option pour créer un gros fichier audio.

  • Je peux reproduire ce problème avec la voix d'Alex -- la voix par défaut pour moi, et ma préférence pour le moment -- mais pas avec la voix de Daniel (bien que j'obtienne 79699 au lieu 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

    Cela suggère une solution de contournement évidente..... Je vais l'essayer dans un petit moment.


Voici ma contribution actuelle :

$ 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

1 votes

Il semble que j'obtienne des tailles de fichiers de sortie différentes des vôtres. Quelle voix avez-vous sélectionnée dans Préférences système > Parole > Voix système ?

1 votes

J'ai Anglais (Royaume-Uni) > Daniel sélectionné. Encore une fois, je ne peux pas reproduire les blocages, cette fois en utilisant lewis-carroll-lf.txt copié à partir de votre mise à jour. say sur les 304 premiers caractères me donne un 69867 octet .aac alors qu'il semble vous donner 81426 des octets. Alors : notre décalage est-il la voix, peut-être ? Qu'est-ce que vous obtenez si vous passez à Daniel ?

1voto

Ashley Points 4027

J'ai essayé, mais je n'arrive pas à reproduire ce problème.

Sur ma machine (qui fonctionne également sous 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

J'utilise /usr/share/dict/words (voir /usr/share/dict/README ) parce que je n'ai pas lewis-carroll.txt . J'ai été incapable de faire say hang.

Peut-être say s'étouffe avec quelque chose dans lewis-carroll.txt (mais uniquement lors de l'envoi de la sortie vers un fichier, ce qui semble étrange) ?

Deux idées qui me viennent à l'esprit pour contourner ce problème, si ce qui précède ne vous aide pas...

  1. Envoyez une phrase à say à la fois, puis recombiner les fichiers de sortie.

  2. Ou, avoir say envoyer au périphérique de sortie audio, mais enregistrer cela avec eg Audio Hijack .

(Question bien rédigée, d'ailleurs : beaucoup de détails pertinents, présentés de manière concise).

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X