Команда say
OS X полезна для некоторых задач (например, Skype, уведомляющих меня, когда контакт подключается к сети), но она произносит некоторые имена неправильно. Есть ли способ научить say
произносить слово по-другому?
Например, попробуйте:
say "Hi, Joel Spolsky"
"Ол" звучит как "мяч", а не "старый". Я хотел бы добавить исключение, которое говорит: «Произносите Спольски, как это», а не пытаться учить новым языковым правилам. Бьюсь об заклад, есть способ, так как он может произносить "iphone", как хочет Apple.
Обновление - после некоторых исследований вот что я узнал:
- Преобразование текста в речь делится между превращением текста в фонемы, а затем фонемы превращаются в звук с помощью голоса. Изменение голоса не влияет на фонемы.
- Диспетчер синтеза речи имеет некоторые функции для преобразования текста в фонемы и метод регистрации речевого словаря, который будет добавлять новые карты текстовых фонем. Тем не менее, речевой словарь Apple должен быть в двоичном виде - я не нашел никакого plist XML.
- Используя
dtrace
во время работыsay
, я нашел несколько интересных файлов, открытых в /System/Library/PrivateFrameworks/SpeechDictionary.framework/Resources. Вероятно, это речевой словарь, но все они двоичные, кроме гомофонов, то есть XML. Добавление записей в Homophones ничего не делает - это, вероятно, используется в преобразовании речи в текст. Они также имеют код, подписанный Apple - их изменение может помешать работе некоторых программ.- PrefixDictionary
- CartNames
- CartLite
- SymbolDictionary
- Омофоны
- Есть способы добавить текстовые версии элементов интерфейса приложения, чтобы VoiceOver работал, многие из которых разработчик получает бесплатно, но есть некоторые хитрости. Стандарт здесь, кажется, должен использовать фонетическое правописание по мере необходимости.
Мои догадки:
say
легкий слой кода поверх менеджера синтеза речи. Разработчикам Apple было бы легко добавить параметр командной строки, чтобы указать путь к списку речевого словаря для сопоставления альтернативных фонем, но они этого не сделали. Это может быть полезным проектом с открытым исходным кодом, чтобы написать лучшееsay
.- Skype, вероятно, использует Speech Synthesis Manager напрямую, не оставляя зацепок, чтобы изменить способ произнесения имен моего друга, кроме фонетического произношения, что глупо.
- Самый простой способ сделать версию
say
из командной строки - это то, как предложил JRobert.
Вот моя быстрая реализация, использующая предложение орфографии Дуга Харриса:
#!/bin/sh
echo $@ | tr '[A-Z]' '[a-z]' |
sed "s/spolsky/spowlsky/g" |
/usr/bin/say
Наконец, некоторые забавные вещи из командной строки:
# Apple is weird
sqlite3 /System/Library/PrivateFrameworks/SpeechDictionary.framework/Resources/Tuples .dump
# Get too much information about what files are being opened
sudo dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'
# Just fun
say -v bad "Joel Spolsky Spolsky Spolsky Spolsky Spolsky, Joel Spolsky Spolsky Spolsky Spolsky Spolsky"
echo "scale=1000; 4*a(1)" | bc -l | say