"Dal testo al parlato" mediante le funzioni esterne del API di eSpeack
Vai alla navigazione
Vai alla ricerca
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.48.15 ".
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.48.15"
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.52.0 ".
Library "libespeak-ng:1.52.0"
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