Il say
comando di OS X è utile per alcune attività (come Skype 'avvisami quando un contatto diventa online), ma sta pronunciando alcuni nomi in modo errato. C'è un modo per insegnare say
a pronunciare una parola in modo diverso?
Ad esempio, prova:
say "Hi, Joel Spolsky"
Il "vecchio" suona come "palla" piuttosto che "vecchio". Vorrei aggiungere un'eccezione che dice "Pronuncia Spolsky in questo modo", piuttosto che cercare di insegnare nuove regole linguistiche. Scommetto che esiste un modo poiché può pronunciare "iphone" come vuole Apple.
Aggiornamento - Dopo alcune ricerche, ecco cosa ho imparato:
- La sintesi vocale viene suddivisa tra la trasformazione del testo in fonemi e quindi i fonemi vengono trasformati in audio mediante una voce. La modifica della voce non influisce sui fonemi.
- Il Gestore sintesi vocale ha alcune funzioni per trasformare il testo in fonemi e un metodo per registrare un dizionario vocale che aggiungerà nuove mappe di testo-fonemi. Tuttavia, il dizionario vocale di Apple deve essere in forma binaria: non ho trovato alcun XML plist.
- Usando
dtrace
durante l'esecuzionesay
, ho trovato alcuni file interessanti aperti in /System/Library/PrivateFrameworks/SpeechDictionary.framework/Resources. Questo è probabilmente il dizionario vocale, ma sono tutti binari, ad eccezione di Homophones, che è XML. L'aggiunta di voci agli omofoni non fa nulla: è probabilmente usata nel discorso-testo. Inoltre, sono firmati da Apple e la loro modifica potrebbe impedire il funzionamento di alcuni programmi.- PrefixDictionary
- CartNames
- CartLite
- SymbolDictionary
- omofoni
- Esistono modi per aggiungere versioni di testo degli elementi dell'interfaccia dell'applicazione in modo che VoiceOver funzioni, molti dei quali uno sviluppatore ottiene gratuitamente, ma ci sono bit complicati . Lo standard qui sembra essere quello di utilizzare un'ortografia fonetica, se necessario.
Le mie ipotesi sono:
say
è un leggero strato di codice in cima al Gestore sintesi vocale. Sarebbe facile per gli sviluppatori Apple aggiungere un'opzione della riga di comando per prendere il percorso di un pianificatore del dizionario vocale per la mappatura alternativa dei fonemi, ma non è così. Potrebbe essere un utile progetto open source per scrivere megliosay
.- Skype probabilmente usa direttamente Speech Synthesis Manager, senza lasciare hook per cambiare il modo in cui i nomi dei miei amici sono pronunciati, oltre a scriverli foneticamente, il che è sciocco.
- Il modo più semplice per creare una versione da riga di comando
say
è come suggerito da JRobert.
Ecco la mia rapida implementazione, usando il suggerimento ortografico di Doug Harris:
#!/bin/sh
echo $@ | tr '[A-Z]' '[a-z]' |
sed "s/spolsky/spowlsky/g" |
/usr/bin/say
Infine, alcune divertenti cose da riga di 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'
. L'elenco delle voci è disponibile in Preferenze di Sistema -> Voce -> Sintesi vocale. Il problema è nella traduzione dei fonemi, non nella sintesi vocale. Se stai chiamando direttamente la libreria, puoi impostare fonemi personalizzati: developer.apple.com/mac/library/documentation/Carbon/Reference/… Cercando sul mio disco per vedere se gli sviluppatori Apple hanno usato un .plist ...
say
con cui stai usando-v
?