O say
comando do OS X é útil para algumas tarefas (como as do Skype 'notificar-me quando um contato fica online), mas está pronunciando alguns nomes incorretamente. Existe uma maneira de ensinar say
a pronunciar uma palavra de maneira diferente?
Por exemplo, tente:
say "Hi, Joel Spolsky"
O 'ol' soa mais como 'bola' do que 'velho'. Gostaria de adicionar uma exceção que diga "Pronuncie Spolsky assim", em vez de tentar ensinar novas regras linguísticas. Aposto que existe uma maneira, pois pode pronunciar "iphone" como a Apple quer.
Atualização - Após algumas pesquisas, eis o que aprendi:
- A conversão de texto em fala é dividida entre transformar o texto em fonemas e, em seguida, os fonemas são transformados em áudio usando uma voz. Mudar a voz não afeta os fonemas.
- O Gerenciador de síntese de fala possui algumas funções para transformar texto em fonemas e um método para registrar um dicionário de fala que adicionará novos mapas de fonema de texto. No entanto, o dicionário de fala da Apple deve estar em formato binário - não encontrei nenhum XML básico.
- Usando
dtrace
durante a execuçãosay
, encontrei alguns arquivos interessantes abertos em /System/Library/PrivateFrameworks/SpeechDictionary.framework/Resources. Este é provavelmente o dicionário de fala, mas todos são binários, exceto Homophones, que é XML. Adicionar entradas ao Homophones não faz nada - provavelmente é usado na fala para texto. Eles também são assinados por código pela Apple - alterá-los pode impedir o funcionamento de alguns programas.- PrefixDictionary
- CartNames
- CartLite
- SymbolDictionary
- Homofones
- Existem maneiras de adicionar versões de texto dos elementos da interface do aplicativo para que o VoiceOver funcione, muitos dos quais um desenvolvedor obtém de graça, mas existem alguns trechos . O padrão aqui parece ser o de usar uma ortografia fonética, conforme necessário.
Minhas suposições são:
say
é uma leve camada de código na parte superior do Speech Synthesis Manager. Seria fácil para os desenvolvedores da Apple adicionar uma opção de linha de comando para seguir o caminho de um dicionário de fala para mapeamento alternativo de fonemas, mas eles não o fizeram. Pode ser um projeto de código aberto útil para escrever um melhorsay
.- O Skype provavelmente usa o Speech Synthesis Manager diretamente, sem deixar ganchos para alterar a maneira como os nomes dos meus amigos são pronunciados, além de soletrá-los foneticamente, o que é bobagem.
- A maneira mais fácil de criar uma versão em linha de comando
say
é como JRobert sugeriu.
Aqui está minha rápida implementação, usando a sugestão de ortografia de Doug Harris:
#!/bin/sh
echo $@ | tr '[A-Z]' '[a-z]' |
sed "s/spolsky/spowlsky/g" |
/usr/bin/say
Finalmente, algumas coisas divertidas da linha de comando:
# 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
say -v alex 'Spolsky' ; say -v vicki 'Spolsky'; say -v bad 'Spolsky Spolsky Spolsky Spolsky Spolsky Spols'
. A lista de vozes pode ser encontrada em Preferências do Sistema -> Fala -> Texto em Fala. O problema está na tradução do fonema, não na síntese da voz. Se você estiver chamando a biblioteca diretamente, poderá definir fonemas personalizados: developer.apple.com/mac/library/documentation/Carbon/Reference/… Pesquisando em meu disco para ver se os desenvolvedores da Apple usaram um .plist ...
say
está usando-v
?