"Dal testo al parlato" mediante le funzioni esterne del API di eSpeack
Da Gambas-it.org - Wikipedia.
Le funzioni del API di eSpeak consentono la sintetizzazione vocale di un testo "dal testo al parlato" (text-to-speech) per l'inglese e per altre lingue.
Per fruire delle funzioni e delle altre risorse di eSpeack è necessario installare nel sistema la libreria condivisa: "libespeak.so.1.1.48 ".
Inoltre, eSpeack utilizza la libreria sonora PortAudio, pertanto è necessario avere installata nel sistema anche quest'altra libreria.
Mostriamo di seguito un semplice codice per ottenere la sintetizzazione vocale di un breve testo in italiano:
Library "libespeak:1.1.48" Private Const espeakSSML As Byte = 16 Private Const espeakPHONEMES As Short = 256 Private Const espeakENDPAUSE As Short = 4096 Private Const espeakKEEP_NAMEDATA As Short = 8192 Private Enum AUDIO_OUTPUT_PLAYBACK = 0, AUDIO_OUTPUT_RETRIEVAL, AUDIO_OUTPUT_SYNCHRONOUS, AUDIO_OUTPUT_SYNCH_PLAYBACK Private Enum EE_INTERNAL_ERROR = -1, EE_OK, EE_BUFFER_FULL, EE_NOT_FOUND Private Enum POS_CHARACTER = 1, POS_WORD, POS_SENTENCE Private Enum espeakCHARS_AUTO = 0, espeakCHARS_UTF8, espeakCHARS_8BIT, espeakCHARS_WCHAR, espeakCHARS_16BIT Private Enum espeakRATE = 1, espeakVOLUME, espeakPITCH, espeakRANGE, espeakPUNCTUATION, espeakCAPITALS, espeakWORDGAP Private Enum espeakPUNCT_NONE = 0, espeakPUNCT_ALL, espeakPUNCT_SOME Private Enum NONE = 0, SOUND_ICON, SPELLING, RAISING_PITCH ' int espeak_Initialize(espeak_AUDIO_OUTPUT output, int buflength, const char *path, int options) ' Inizializza la libreria 'libespeak'. Ritorna la frequenza di camionamento in Hz, oppure -1 (EE_INTERNAL_ERROR) Private Extern espeak_Initialize(audio_output As Byte, buflength As Integer, path As String, options As Integer) As Integer ' espeak_ERROR espeak_SetVoiceByName(const char *name) ' Searches for a voice with a matching "name" field. For example, "en" for English, "de" for German, "it" for Italian. Private Extern espeak_SetVoiceByName(name As String) As Integer ' espeak_ERROR espeak_SetParameter(espeak_PARAMETER parameter, int value, int relative) ' Sets the value of the specified parameter. relative = 0 sets the absolute value of the parameter. relative = 1 sets a relative value of the parameter. Private Extern espeak_SetParameter(parameter As Byte, value As Integer, relative As Integer) As Integer ' espeak_ERROR espeak_Synth(const void *text, size_t size, unsigned int position, espeak_POSITION_TYPE position_type, unsigned int end_position, unsigned int flags, unsigned int* unique_identifier, void* user_data) ' Synthesize speech for the specified text. Private Extern espeak_Synth(text As String, size As Integer, posiztion As Integer, position_type As Pointer, end_position As Integer, flags As Integer, unique_identifier As Pointer, user_data As Pointer) As Integer ' espeak_ERROR espeak_Synchronize(void) ' This function returns when all data have been spoken. Private Extern espeak_Synchronize() As Integer ' espeak_ERROR espeak_Terminate(void) ' last function to be called. Private Extern espeak_Terminate() As Integer ' const char *espeak_Info(const char **path_data) ' Returns the version number string. 'path_data' returns the path to espeak_data. Private Extern espeak_Info(path_data As Pointer) As String Public Sub Main() Dim testo, data_path, nomevoce, versione_lib As String Dim freqcamp, err, size As Integer Dim percorso_dati As Pointer ' Imposta il testo da pronunciare: testo = "www.Gambas-it.org è il sito della comunità italiana dei programmatori Gambas." data_path = Null nomevoce = "it" ' Inizializza la libreria: freqcamp = espeak_Initialize(AUDIO_OUTPUT_SYNCH_PLAYBACK, 0, data_path, 0) If freqcamp = EE_INTERNAL_ERROR Then Error.Raise("Errore nell'inizializzazione della libreria 'libespeak' !") Else Print "Frequenza di campionamento = " & freqcamp & " Hertz" Endif versione_lib = espeak_Info(VarPtr(percorso_dati)) Print "Versione della libreria: " & versione_lib Print "Percorso dei dati della libreria: " & String@(percorso_dati) err = espeak_SetVoiceByName(nomevoce) If err <> EE_OK Then Error.Raise("Errore nell'impostazione della lingua !") ' Imposta alcuni parametri di lettura: err = espeak_SetParameter(espeakRATE, 140, 0) ' Velocità del parlato in parole-per minuto (valori: 80 - 450) If err <> EE_OK Then Error.Raise("Errore nell'impostazione del parametro 'espeakRATE' !") err = espeak_SetParameter(espeakVOLUME, 100, 0) ' Volume (valori 0- 200) If err <> EE_OK Then Error.Raise("Errore nell'impostazione del parametro 'espeakVOLUME' !") err = espeak_SetParameter(espeakPITCH, 50, 0) ' Tono (valori: 0 - 100) If err <> EE_OK Then Error.Raise("Errore nell'impostazione del parametro 'espeakPITCH' !") err = espeak_SetParameter(espeakRANGE, 50, 0) ' Gamma tonale (valori: 0 - 100; 0 = monotono) If err <> EE_OK Then Error.Raise("Errore nell'impostazione del parametro 'espeakRANGE' !") err = espeak_SetParameter(espeakPUNCTUATION, espeakPUNCT_NONE, 0) ' Imposta quali caratteri di punteggiatura sono da annunciare If err <> EE_OK Then Error.Raise("Errore nell'impostazione del parametro 'espeakPUNCTUATION' !") err = espeak_SetParameter(espeakCAPITALS, NONE, 0) ' Annuncia eventualmente una lettera maiuscola If err <> EE_OK Then Error.Raise("Errore nell'impostazione del parametro 'espeakCAPITALS' !") err = espeak_SetParameter(espeakWORDGAP, 6, 0) ' Pausa tra le parole (unità di 10mS come velocità prestabilita = 1 ) If err <> EE_OK Then Error.Raise("Errore nell'impostazione del parametro 'espeakWORDGAP' !") size = Len(testo) ' Attiva il motore di sintetizzazione vocale di "eSpeack": err = espeak_Synth(testo, size + 1, 0, POS_CHARACTER, 0, espeakCHARS_AUTO, Null, Null) If err <> EE_OK Then Error.Raise("Errore nell'operazione di sintetizzazione vocale del testo !") err = espeak_Synchronize() If err < EE_OK Then Error.Raise("Errore alla funzione 'espeak_Synchronize' !") ' Chiude la libreria: err = espeak_Terminate() End
Uso della libreria "libespeak-ng.so"
E' possibile usare anche la libreria condivisa: "libespeak-ng.so.1.1.51 ".
Library "libespeak-ng:1.1.51" Private Const espeakSSML As Byte = 16 Private Const espeakPHONEMES As Short = 256 Private Const espeakENDPAUSE As Short = 4096 Private Const espeakKEEP_NAMEDATA As Short = 8192 Private Enum AUDIO_OUTPUT_PLAYBACK = 0, AUDIO_OUTPUT_RETRIEVAL, AUDIO_OUTPUT_SYNCHRONOUS, AUDIO_OUTPUT_SYNCH_PLAYBACK Private Enum EE_INTERNAL_ERROR = -1, EE_OK, EE_BUFFER_FULL, EE_NOT_FOUND Private Enum POS_CHARACTER = 1, POS_WORD, POS_SENTENCE Private Enum espeakCHARS_AUTO = 0, espeakCHARS_UTF8, espeakCHARS_8BIT, espeakCHARS_WCHAR, espeakCHARS_16BIT Private Enum espeakRATE = 1, espeakVOLUME, espeakPITCH, espeakRANGE, espeakPUNCTUATION, espeakCAPITALS, espeakWORDGAP ' int espeak_Initialize(espeak_AUDIO_OUTPUT output, int buflength, const char *path, int options) ' Inizializza la libreria 'libespeak'. Ritorna la frequenza di camionamento in Hz, oppure -1 (EE_INTERNAL_ERROR) Private Extern espeak_Initialize(audio_output As Byte, buflength As Integer, path As String, options As Integer) As Integer ' espeak_ERROR espeak_SetVoiceByName(const char *name) ' Searches for a voice with a matching "name" field. For example, "en" for English, "de" for German, "it" for Italian. Private Extern espeak_SetVoiceByName(name As String) As Integer ' espeak_ERROR espeak_SetParameter(espeak_PARAMETER parameter, int value, int relative) ' Sets the value of the specified parameter. relative = 0 sets the absolute value of the parameter. relative = 1 sets a relative value of the parameter. Private Extern espeak_SetParameter(parameter As Byte, value As Integer, relative As Integer) As Integer ' espeak_ERROR espeak_Synth(const void *text, size_t size, unsigned int position, espeak_POSITION_TYPE position_type, unsigned int end_position, unsigned int flags, unsigned int* unique_identifier, void* user_data) ' Synthesize speech for the specified text. Private Extern espeak_Synth(text As String, size As Integer, posiztion As Integer, position_type As Pointer, end_position As Integer, flags As Integer, unique_identifier As Pointer, user_data As Pointer) As Integer ' espeak_ERROR espeak_Synchronize(void) ' This function returns when all data have been spoken. Private Extern espeak_Synchronize() As Integer ' espeak_ERROR espeak_Terminate(void) ' last function to be called. Private Extern espeak_Terminate() As Integer ' const char *espeak_Info(const char **path_data) ' Returns the version number string. 'path_data' returns the path to espeak_data. Private Extern espeak_Info(path_data As Pointer) As String Public Sub Main() Dim data_path, versione_lib, nomevoce, testo As String Dim freqcamp, err, size As Integer Dim percorso_dati As Pointer ' Imposta il testo da pronunciare: testo = "www.Gambas-it.org è il sito della comunità italiana dei programmatori Gambas." data_path = Null nomevoce = "it" ' Inizializza la libreria: freqcamp = espeak_Initialize(AUDIO_OUTPUT_SYNCH_PLAYBACK, 0, data_path, 0) If freqcamp = EE_INTERNAL_ERROR Then Error.Raise("Errore nell'inizializzazione della libreria 'libespeak' !") Else Print "Frequenza di campionamento = " & freqcamp & " Hertz" Endif versione_lib = espeak_Info(VarPtr(percorso_dati)) Print "Versione della libreria: " & versione_lib Print "Percorso dei dati della libreria: " & String@(percorso_dati) err = espeak_SetVoiceByName(nomevoce) If err <> EE_OK Then Error.Raise("Errore nell'impostazione della lingua !") ' Imposta alcuni parametri di lettura: err = espeak_SetParameter(espeakRATE, 140, 0) ' Velocità del parlato in parole-per minuto (valori: 80 - 450) If err <> EE_OK Then Error.Raise("Errore nell'impostazione del parametro 'espeakRATE' !") err = espeak_SetParameter(espeakVOLUME, 100, 0) ' Volume (valori 0- 200) If err <> EE_OK Then Error.Raise("Errore nell'impostazione del parametro 'espeakVOLUME' !") err = espeak_SetParameter(espeakPITCH, 50, 0) ' Tono (valori: 0 - 100) If err <> EE_OK Then Error.Raise("Errore nell'impostazione del parametro 'espeakPITCH' !") err = espeak_SetParameter(espeakRANGE, 50, 0) ' Gamma tonale (valori: 0 - 100; 0 = monotono) If err <> EE_OK Then Error.Raise("Errore nell'impostazione del parametro 'espeakRANGE' !") err = espeak_SetParameter(espeakWORDGAP, 6, 0) ' Pausa tra le parole (unità di 10mS come velocità prestabilita = 1 ) If err <> EE_OK Then Error.Raise("Errore nell'impostazione del parametro 'espeakWORDGAP' !") size = Len(testo) ' Attiva il motore di sintetizzazione vocale di "eSpeack": err = espeak_Synth(testo, size + 1, 0, POS_CHARACTER, 0, espeakCHARS_AUTO, Null, Null) If err <> EE_OK Then Error.Raise("Errore nell'operazione di sintetizzazione vocale del testo !") err = espeak_Synchronize() If err < EE_OK Then Error.Raise("Errore alla funzione 'espeak_Synchronize' !") ' Chiude la libreria: err = espeak_Terminate() End
Riferimenti
- Il sito eSpeak text to speech
- Il sito del API di eSpeack