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 09:17:30 (GMT)
committer Aleksey Lim <alsroot@member.fsf.org>2009-02-05 09:17:30 (GMT)
commit235004c0c3eab7f26340d7207d4c428bfce19270 (patch)
treece37146720a85935b2e16e752b24724a15fd2cc0
parentc1cf739f24db8b87efcff613a253cc19cc5918d3 (diff)
Add pitch&rate properties
-rw-r--r--src/espeak.c14
-rw-r--r--src/espeak.h3
-rw-r--r--src/gstespeak.c38
-rw-r--r--src/gstespeak.h3
4 files changed, 38 insertions, 20 deletions
diff --git a/src/espeak.c b/src/espeak.c
index 4594784..273f228 100644
--- a/src/espeak.c
+++ b/src/espeak.c
@@ -61,7 +61,7 @@ static unsigned char wave_hdr[44] = {
static GMutex *mutex = NULL;
static GOutputStream *buffer = NULL;
-static gint rate = 0;
+static gint sample_rate = 0;
static gint
read_cb(short * wav, int numsamples, espeak_EVENT * events)
@@ -82,12 +82,12 @@ espeak_new()
if (g_once_init_enter(&initialized))
{
- rate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS, 4096, NULL, 0);
+ sample_rate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS, 4096, NULL, 0);
espeak_SetSynthCallback(read_cb);
mutex = g_mutex_new();
}
- if (rate == EE_INTERNAL_ERROR)
+ if (sample_rate == EE_INTERNAL_ERROR)
return NULL;
struct Espeak *es = g_new(struct Espeak, 1);
@@ -97,7 +97,7 @@ espeak_new()
}
gboolean
-espeak_say(struct Espeak *es, const gchar *text)
+espeak_say(struct Espeak *es, const gchar *text, guint pitch, guint rate)
{
void write4bytes(GOutputStream *buffer, gint value)
{
@@ -114,12 +114,14 @@ espeak_say(struct Espeak *es, const gchar *text)
g_seekable_seek((GSeekable*)es->buffer, 0, G_SEEK_SET, NULL, NULL);
g_output_stream_write(es->buffer, wave_hdr, 24, NULL, NULL);
- write4bytes(es->buffer, rate);
- write4bytes(es->buffer, rate * 2);
+ write4bytes(es->buffer, sample_rate);
+ write4bytes(es->buffer, sample_rate * 2);
g_output_stream_write(es->buffer, wave_hdr+32, 12, NULL, NULL);
g_mutex_lock(mutex);
buffer = es->buffer;
+ espeak_SetParameter(espeakPITCH, pitch, 0);
+ espeak_SetParameter(espeakRATE, rate, 0);
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 612e496..1c42df6 100644
--- a/src/espeak.h
+++ b/src/espeak.h
@@ -49,7 +49,8 @@
struct Espeak;
struct Espeak* espeak_new();
-gboolean espeak_say(struct Espeak*, const gchar *text);
+gboolean espeak_say(struct Espeak*, const gchar *text, 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 cd357a1..951890b 100644
--- a/src/gstespeak.c
+++ b/src/gstespeak.c
@@ -71,9 +71,10 @@ GST_DEBUG_CATEGORY_STATIC (gst_espeak_debug);
enum
{
- PROP_0,
- PROP_TEXT,
- PROP_SILENT
+ PROP_0,
+ PROP_TEXT,
+ PROP_PITCH,
+ PROP_RATE
};
static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE (
@@ -146,10 +147,15 @@ gst_espeak_class_init (GstEspeakClass * klass)
g_param_spec_string("text", "Text",
"Text to pronounce", NULL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- g_object_class_install_property (gobject_class, PROP_SILENT,
- g_param_spec_boolean("silent", "Silent",
- "Produce verbose output ?",
- FALSE, G_PARAM_READWRITE));
+ g_object_class_install_property(gobject_class, PROP_PITCH,
+ g_param_spec_uint("pitch", "Pitch adjustment",
+ "Pitch adjustment", 0, 99, 50,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property(gobject_class, PROP_RATE,
+ 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));
+
}
/* initialize the new element
@@ -164,6 +170,8 @@ gst_espeak_init (GstEspeak * self,
self->text = NULL;
self->uri = NULL;
self->speak = espeak_new();
+ self->pitch = 50;
+ self->rate = 170;
}
static void
@@ -223,8 +231,11 @@ gst_espeak_set_property (GObject *object, guint prop_id,
case PROP_TEXT:
gst_espeak_set_text(self, g_value_get_string(value));
break;
- case PROP_SILENT:
- self->silent = g_value_get_boolean (value);
+ case PROP_PITCH:
+ self->pitch = g_value_get_uint(value);
+ break;
+ case PROP_RATE:
+ self->rate = g_value_get_uint(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -242,8 +253,11 @@ gst_espeak_get_property (GObject * object, guint prop_id,
case PROP_TEXT:
g_value_set_string(value, self->text);
break;
- case PROP_SILENT:
- g_value_set_boolean (value, self->silent);
+ case PROP_PITCH:
+ g_value_set_uint(value, self->pitch);
+ break;
+ case PROP_RATE:
+ g_value_set_uint(value, self->rate);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -272,7 +286,7 @@ gst_espeak_start (GstBaseSrc * self_)
if (self->text == NULL || self->text[0] == 0)
return FALSE;
- return espeak_say(self->speak, self->text);
+ return espeak_say(self->speak, self->text, self->pitch, self->rate);
}
static gboolean
diff --git a/src/gstespeak.h b/src/gstespeak.h
index f7f2884..8e282a9 100644
--- a/src/gstespeak.h
+++ b/src/gstespeak.h
@@ -73,7 +73,8 @@ struct _GstEspeak
struct Espeak *speak;
gchar *text;
gchar *uri;
- gboolean silent;
+ guint pitch;
+ guint rate;
};
struct _GstEspeakClass