Как я могу запустить "say --output-file" без зависания (и того хуже) с более чем 310 байтами ввода?

Для моего некоммерческого любопытства я заинтересован в превращении некоторых работ Льюиса Кэрролла в машинную речь. При отправке вывода на аудиоустройство sayкоманда может сделать это даже с очень большими объемами ввода:

$ 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

При отправке вывода в файл он также работает с очень небольшим количеством входного текста:

$ 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

При большем вводе это не работает:

$ 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

(висит!)

^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

Это только начало проблем. Дальнейшие попытки запуска sayтакже зависают, независимо от того, насколько малы входные данные или куда должны направляться выходные данные (например, say Hello). Что еще хуже, как только первая sayкоманда зависает, Chrome начинает играть на пляже. К счастью, есть простой способ вернуть систему к нормальной работе:

$ pkill speechsynthesisd say

(Обходной путь найден здесь .)

Я могу понять, что Apple хочет установить ограничения скорости (или что-то в этом роде) для синтеза речи, чтобы люди не создавали дешевые аудиокниги. (Что было бы хорошо, это не то, что я пытаюсь сделать.) Это был бы довольно ужасный способ реализовать ограничение скорости.

Я не понимаю, что это настолько плохо, что другое программное обеспечение (например, Chrome) испортилось.

Что-то подобное я проделывал еще в 2012 году (на паре килобайт текста) ни с чем подобным не сталкивался. У меня недостаточно истории, чтобы воспроизвести это.

Есть ли способ обойти это безобразие?

Запуск: macOS 10.13.6 (17G65)

Обновлять:

Как и @ashley, я могу преобразовать большой кусок словаря в речь:

$ 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

Внимательно изучив свой ввод, я обнаружил, что он был в формате DOS (строки заканчиваются на CR-LF), а не в собственном формате Unix для macOS (строки заканчиваются на LF). Я сделал копию в последнем формате, удалив шесть символов CR из начала моего файла ... и теперь sayмогу обрабатывать на шесть символов меньше, прежде чем зависнуть:

$ 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

(Я добавлю больше информации о своем вкладе в конце этого вопроса.)

Что касается других предложений @ashley:

  • Я попытался разбить ввод на более мелкие файлы и преобразовать их по отдельности. Это очень помогает в изучении того, с чем я играю. Мне нужно перепрыгнуть через много-много обручей, чтобы это сработало. (Я могу документировать это дальше, если это поможет.)

  • Я надеялся сделать все это из командной строки, не прибегая к аудиозахвату. Это может оказаться моим лучшим вариантом для создания одного большого аудиофайла.

  • Я могу воспроизвести эту проблему с голосом Alex — по умолчанию для меня и моим предпочтением на данный момент — но не с голосом Daniel (хотя я получаю 79699 вместо 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
    

    Это предлагает очевидный обходной путь... Я попробую через некоторое время.


Вот мой текущий ввод:

$ 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
Кажется, я получаю разные размеры выходных файлов для вас. Какой голос вы выбрали в Системных настройках > Речь > Системный голос?
У меня выбран английский (Великобритания) > Daniel . Повторюсь, зависания воспроизвести не могу, на этот раз с помощью lewis-carroll-lf.txtскопированного из вашего обновления. sayпервые 304 символа дают мне 69867байтовый .aacфайл, тогда как он, кажется, дает вам 81426байты. Итак: может быть, наше несоответствие голосу? Что вы получите, если переключитесь на Даниэля?

Ответы (1)

Я пробовал, но не могу воспроизвести эту проблему.

На моей машине (также работает 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

Я использую /usr/share/dict/words(см. /usr/share/dict/README), потому что у меня нет lewis-carroll.txt. Я не смог сделать sayзависание.

Возможно say, что-то захлебывается lewis-carroll.txt(но только при отправке вывода в файл, что кажется странным)?

Две идеи в голове, чтобы обойти это, если вышеизложенное не поможет...

  1. Отправляйте по одному предложению sayза раз, затем рекомбинируйте выходные файлы.

  2. Или sayотправьте на устройство вывода звука, но запишите его, например, с помощью Audio Hijack .

(Кстати, хорошо написанный вопрос: много важных деталей, представленных лаконично.)