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