/* An implementation of the eSpeak API using the espeak-ng API.
*
* Copyright (C) 2005 to 2013 by Jonathan Duddington
* email: jonsd@users.sourceforge.net
* Copyright (C) 2016 Reece H. Dunn
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see: .
*/
#include "config.h"
#include
#include
#include
#include
#include "speech.h"
#include "phoneme.h"
#include "synthesize.h"
#include "translate.h"
#include "event.h"
static espeak_ERROR status_to_espeak_error(espeak_ng_STATUS status)
{
switch (status)
{
case ENS_OK: return EE_OK;
case ENS_VOICE_NOT_FOUND: return EE_NOT_FOUND;
case ENS_MBROLA_NOT_FOUND: return EE_NOT_FOUND;
case ENS_MBROLA_VOICE_NOT_FOUND: return EE_NOT_FOUND;
case ENS_FIFO_BUFFER_FULL: return EE_BUFFER_FULL;
default: return EE_INTERNAL_ERROR;
}
}
#pragma GCC visibility push(default)
ESPEAK_API int espeak_Initialize(espeak_AUDIO_OUTPUT output_type, int buf_length, const char *path, int options)
{
espeak_ng_InitializePath(path);
espeak_ng_ERROR_CONTEXT context = NULL;
espeak_ng_STATUS result = espeak_ng_Initialize(&context);
if (result != ENS_OK) {
espeak_ng_PrintStatusCodeMessage(result, stderr, context);
espeak_ng_ClearErrorContext(&context);
if ((options & espeakINITIALIZE_DONT_EXIT) == 0)
exit(1);
}
switch (output_type)
{
case AUDIO_OUTPUT_PLAYBACK:
espeak_ng_InitializeOutput(ENOUTPUT_MODE_SPEAK_AUDIO, buf_length, NULL);
break;
case AUDIO_OUTPUT_RETRIEVAL:
espeak_ng_InitializeOutput(0, buf_length, NULL);
break;
case AUDIO_OUTPUT_SYNCHRONOUS:
espeak_ng_InitializeOutput(ENOUTPUT_MODE_SYNCHRONOUS, buf_length, NULL);
break;
case AUDIO_OUTPUT_SYNCH_PLAYBACK:
espeak_ng_InitializeOutput(ENOUTPUT_MODE_SYNCHRONOUS | ENOUTPUT_MODE_SPEAK_AUDIO, buf_length, NULL);
break;
}
option_phoneme_events = (options & (espeakINITIALIZE_PHONEME_EVENTS | espeakINITIALIZE_PHONEME_IPA));
return espeak_ng_GetSampleRate();
}
ESPEAK_API 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)
{
return status_to_espeak_error(espeak_ng_Synthesize(text, size, position, position_type, end_position, flags, unique_identifier, user_data));
}
ESPEAK_API espeak_ERROR espeak_Synth_Mark(const void *text, size_t size,
const char *index_mark,
unsigned int end_position,
unsigned int flags,
unsigned int *unique_identifier,
void *user_data)
{
return status_to_espeak_error(espeak_ng_SynthesizeMark(text, size, index_mark, end_position, flags, unique_identifier, user_data));
}
ESPEAK_API espeak_ERROR espeak_Key(const char *key_name)
{
return status_to_espeak_error(espeak_ng_SpeakKeyName(key_name));
}
ESPEAK_API espeak_ERROR espeak_Char(wchar_t character)
{
return status_to_espeak_error(espeak_ng_SpeakCharacter(character));
}
ESPEAK_API espeak_ERROR espeak_SetParameter(espeak_PARAMETER parameter, int value, int relative)
{
return status_to_espeak_error(espeak_ng_SetParameter(parameter, value, relative));
}
ESPEAK_API espeak_ERROR espeak_SetPunctuationList(const wchar_t *punctlist)
{
return status_to_espeak_error(espeak_ng_SetPunctuationList(punctlist));
}
ESPEAK_API espeak_ERROR espeak_SetVoiceByName(const char *name)
{
return status_to_espeak_error(espeak_ng_SetVoiceByName(name));
}
ESPEAK_API espeak_ERROR espeak_SetVoiceByProperties(espeak_VOICE *voice_selector)
{
return status_to_espeak_error(espeak_ng_SetVoiceByProperties(voice_selector));
}
ESPEAK_API espeak_ERROR espeak_Cancel(void)
{
return status_to_espeak_error(espeak_ng_Cancel());
}
ESPEAK_API espeak_ERROR espeak_Synchronize(void)
{
return status_to_espeak_error(espeak_ng_Synchronize());
}
ESPEAK_API espeak_ERROR espeak_Terminate(void)
{
return status_to_espeak_error(espeak_ng_Terminate());
}
ESPEAK_API void espeak_CompileDictionary(const char *path, FILE *log, int flags)
{
espeak_ng_ERROR_CONTEXT context = NULL;
espeak_ng_STATUS result = espeak_ng_CompileDictionary(path, dictionary_name, log, flags, &context);
if (result != ENS_OK) {
espeak_ng_PrintStatusCodeMessage(result, stderr, context);
espeak_ng_ClearErrorContext(&context);
}
}
#pragma GCC visibility pop