From 235004c0c3eab7f26340d7207d4c428bfce19270 Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Thu, 05 Feb 2009 09:17:30 +0000 Subject: Add pitch&rate properties --- 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 -- cgit v0.9.1