From c321703a7e71fce2fd2199ab7d2e0b1f4c155d04 Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Thu, 05 Feb 2009 10:26:58 +0000 Subject: Add lang(s) properties --- diff --git a/src/espeak.c b/src/espeak.c index 6ec8ffe..a6ca0f2 100644 --- a/src/espeak.c +++ b/src/espeak.c @@ -63,6 +63,7 @@ static unsigned char wave_hdr[44] = { pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; static GOutputStream *buffer = NULL; static gint sample_rate = 0; +static const espeak_VOICE **langs = NULL; static gint read_cb(short * wav, int numsamples, espeak_EVENT * events) @@ -76,8 +77,8 @@ read_cb(short * wav, int numsamples, espeak_EVENT * events) return 0; } -struct Espeak* -espeak_new() +static void +init() { static volatile gsize initialized = 0; @@ -87,8 +88,15 @@ espeak_new() ++initialized; sample_rate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS, 4096, NULL, 0); espeak_SetSynthCallback(read_cb); + langs = espeak_ListVoices(NULL); } pthread_mutex_unlock(&mutex); +} + +struct Espeak* +espeak_new() +{ + init(); if (sample_rate == EE_INTERNAL_ERROR) return NULL; @@ -99,8 +107,25 @@ espeak_new() return es; } +gchar** +espeak_langs() +{ + gsize count = 0; + const espeak_VOICE **i; + char **j, **out; + + init(); + + for (i = langs; *i; ++i) ++count; + out = j = g_new0(gchar*, count); + for (i = langs; *i; ++i) *j++ = g_strdup((*i)->name); + + return out; +} + gboolean -espeak_say(struct Espeak *es, const gchar *text, guint pitch, guint rate) +espeak_say(struct Espeak *es, const gchar *text, const gchar *lang, + guint pitch, guint rate) { void write4bytes(GOutputStream *buffer, gint value) { @@ -125,6 +150,7 @@ espeak_say(struct Espeak *es, const gchar *text, guint pitch, guint rate) buffer = es->buffer; espeak_SetParameter(espeakPITCH, pitch, 0); espeak_SetParameter(espeakRATE, rate, 0); + espeak_SetVoiceByName(lang); gint status = espeak_Synth(text, strlen(text), 0, POS_CHARACTER, 0, espeakCHARS_AUTO, NULL, NULL); buffer = NULL; diff --git a/src/espeak.h b/src/espeak.h index 1c42df6..f7cc833 100644 --- a/src/espeak.h +++ b/src/espeak.h @@ -49,8 +49,9 @@ struct Espeak; struct Espeak* espeak_new(); -gboolean espeak_say(struct Espeak*, const gchar *text, guint pitch, - guint rate); +gchar** espeak_langs(); +gboolean espeak_say(struct Espeak*, const gchar *text, const gchar *lang, + guint pitch, guint rate); gpointer espeak_hear(struct Espeak*, goffset offset, guint *size); void espeak_unref(struct Espeak*); diff --git a/src/gstespeak.c b/src/gstespeak.c index 951890b..6857fce 100644 --- a/src/gstespeak.c +++ b/src/gstespeak.c @@ -74,7 +74,9 @@ enum PROP_0, PROP_TEXT, PROP_PITCH, - PROP_RATE + PROP_RATE, + PROP_LANG, + PROP_LANGS }; static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ( @@ -155,7 +157,14 @@ gst_espeak_class_init (GstEspeakClass * klass) g_param_spec_uint("rate", "Speed in words per minute", "Speed in words per minute", 80, 390, 170, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - + g_object_class_install_property(gobject_class, PROP_LANG, + g_param_spec_string("lang", "Current lang", + "Current lang", "default", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property(gobject_class, PROP_LANGS, + g_param_spec_boxed("langs", "List of langs", + "List of langs", G_TYPE_STRV, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } /* initialize the new element @@ -169,9 +178,11 @@ gst_espeak_init (GstEspeak * self, { self->text = NULL; self->uri = NULL; - self->speak = espeak_new(); self->pitch = 50; self->rate = 170; + self->speak = espeak_new(); + self->lang = g_strdup("default"); + self->langs = espeak_langs(); } static void @@ -182,6 +193,8 @@ gst_espeak_finalize(GObject * self_) espeak_unref(self->speak); self->speak = NULL; g_free(self->text); self->text = NULL; g_free(self->uri); self->uri = NULL; + g_free(self->lang); self->lang = NULL; + g_strfreev(self->langs); self->langs = NULL; G_OBJECT_CLASS(parent_class)->dispose(self_); } @@ -237,6 +250,9 @@ gst_espeak_set_property (GObject *object, guint prop_id, case PROP_RATE: self->rate = g_value_get_uint(value); break; + case PROP_LANG: + self->lang = g_strdup(g_value_get_string(value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -259,6 +275,12 @@ gst_espeak_get_property (GObject * object, guint prop_id, case PROP_RATE: g_value_set_uint(value, self->rate); break; + case PROP_LANG: + g_value_set_string(value, self->lang); + break; + case PROP_LANGS: + g_value_set_boxed(value, self->langs); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -286,7 +308,8 @@ gst_espeak_start (GstBaseSrc * self_) if (self->text == NULL || self->text[0] == 0) return FALSE; - return espeak_say(self->speak, self->text, self->pitch, self->rate); + return espeak_say(self->speak, self->text, self->lang, self->pitch, + self->rate); } static gboolean diff --git a/src/gstespeak.h b/src/gstespeak.h index 8e282a9..4ba0953 100644 --- a/src/gstespeak.h +++ b/src/gstespeak.h @@ -75,6 +75,8 @@ struct _GstEspeak gchar *uri; guint pitch; guint rate; + gchar *lang; + gchar **langs; }; struct _GstEspeakClass -- cgit v0.9.1