Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@member.fsf.org>2009-02-05 10:26:58 (GMT)
committer Aleksey Lim <alsroot@member.fsf.org>2009-02-05 10:26:58 (GMT)
commitc321703a7e71fce2fd2199ab7d2e0b1f4c155d04 (patch)
tree9ce97673f266e9ae932a4ba34feababbcef8e5bf
parentd0a94bc4ab14dd3714be73d94f16d115718e84c0 (diff)
Add lang(s) properties
-rw-r--r--src/espeak.c32
-rw-r--r--src/espeak.h5
-rw-r--r--src/gstespeak.c31
-rw-r--r--src/gstespeak.h2
4 files changed, 61 insertions, 9 deletions
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