"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 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(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