Hello, finally, I'm attaching patches: audsp-queue.patch Patch for festival's audsp to also report the currently playing file on (audio_mode 'query) This seems to bring no particular improvement. I suspect that gnopernicus doesn't need the is_speaking function too badly, after all? unclutter.patch Patch for gnome-speech festival driver to send a single, more compact SayText command, and to avoid sending empty strings or string containing only blanks. This is mainly a cosmetic patch. recode.patch Patch for gnome-speech festival driver. When one of the Italian voices is requested, switches the g_io output channel to latin1 instead of utf-8. This fixes the Italian voices! Hooray!! Ciao, Enrico -- GPG key: 1024D/797EBFAB 2000-12-05 Enrico Zini <enrico debian org>
--- /home/enrico/src/orig/gnome-speech-0.4.0/drivers/festival/festivalsynthesisdriver.c	2006-05-14 16:49:21.000000000 +0200
+++ festivalsynthesisdriver.c	2006-06-28 17:43:04.252707768 +0200
@@ -35,6 +35,7 @@
 #include <netinet/in.h>
 #include <libbonobo.h>
 #include <netdb.h>
+#include <ctype.h>
 #include "festivalsynthesisdriver.h"
 #include "festivalspeaker.h"
 
@@ -910,21 +911,29 @@
 {
         gchar *escaped_string;
 	gchar *ptr1, *ptr2;
+	int spaces_only = 1;
 
 	g_assert (IS_FESTIVAL_SYNTHESIS_DRIVER (d) && IS_FESTIVALSPEAKER (s) && text);
     
-    
-        escaped_string = g_malloc (strlen (text)*2+1);
+
+        escaped_string = g_malloc (strlen (text)*2+1+20);
+	strcpy(escaped_string, "(SayText \"");
         ptr1 = text;
-        ptr2 = escaped_string;
+        ptr2 = escaped_string + strlen(escaped_string);
         while (ptr1 && *ptr1)
         {
-        	if (*ptr1 == '\"')
+		if (!isspace(*ptr1))
+			spaces_only = 0;
+        	if (*ptr1 == '\"' || *ptr1 == '\\')
 		    *ptr2++ = '\\';
 		*ptr2++ = *ptr1++;
         }
+	*ptr2++ = '"';
+	*ptr2++ = ')';
+	*ptr2++ = '\r';
+	*ptr2++ = '\n';
 	*ptr2 = 0;
-
+    
         /* Refresh if needded */ 
         if (d->last_speaker != s || speaker_needs_parameter_refresh (SPEAKER(s)))
 	{
@@ -937,16 +946,15 @@
 	clb_list_free (d->crt_clbs);
 	d->crt_clbs = speaker_get_clb_list (SPEAKER (s));
 
+	if (!spaces_only)
+	{
 #ifdef FESTIVAL_DEBUG_TEXT
-	fprintf (stderr, "\nSENT:\"%s\" from \"%s\"", escaped_string, text);
+		fprintf (stderr, "\nSENT:\"%s\" from \"%s\"", escaped_string, text);
 #endif
-	d->is_speaking = TRUE;
-	d->queue_length = 1;
-	festival_synthesis_driver_say_raw (d, "(SayText \"");
-	festival_synthesis_driver_say_raw (d, escaped_string);
-	festival_synthesis_driver_say_raw (d, "\")\r\n");
-
-	festival_synthesis_driver_say_raw (d, "(SayText \"\")\r\n");
+		d->is_speaking = TRUE;
+		d->queue_length = 1;
+		festival_synthesis_driver_say_raw (d, escaped_string);
+	}
 
         if (escaped_string)
 		g_free (escaped_string);
--- festivalsynthesisdriver.c 2006-06-28 17:43:04.252707768 +0200 +++ festivalsynthesisdriver.c.final 2006-06-28 17:41:15.475244456 +0200 @@ -941,6 +941,12 @@ festival_synthesis_driver_say_raw (d, s->voice); speaker_refresh_parameters (SPEAKER(s)); d->last_speaker = s; + + if (strcmp(d->last_speaker->voice, "(voice_pc_diphone)\n") == 0 + || strcmp(d->last_speaker->voice, "(voice_lp_diphone)\n") == 0) + g_io_channel_set_encoding(d->channel_sock, "latin1", NULL); + else + g_io_channel_set_encoding(d->channel_sock, "UTF-8", NULL); } clb_list_free (d->crt_clbs);
--- audsp.cc	2006-06-28 17:46:18.384195296 +0200
+++ /home/enrico/src/festival-1.4.3.enrico/src/main/audsp.cc	2006-06-28 15:22:28.162537000 +0200
@@ -104,6 +104,15 @@
 static int sp_terminate(void);
 static void tidy_up(void);
 
+static int no_more_input = FALSE;
+static CQueue command_queue;
+static int child_pid = 0;
+static EST_String current_file;
+static EST_Option play_wave_options;
+static int maxqueue = 5;
+static int pending_close = FALSE;
+static int kids = 0;
+
 void CQueue::push(Command *c)
 {
     // Put this item on tail
@@ -143,10 +152,18 @@
 void CQueue::display(void) const
 {
     CQueue_Item *t;
-    int i;
+    int i = 0;
+    int len = length();
+    if (kids > 0)
+    {
+	++len;
+	++i;
+    }
 
-    cerr << "Command_queue: " << length() << endl;
-    for (i=0,t=head; t != 0; t=t->next,i++)
+    cerr << "Command_queue: " << len << endl;
+    if (kids > 0)
+	cerr << " " << 0 << ": " << current_file << endl;
+    for (t=head; t != 0; t=t->next,i++)
 	cerr << " " << i << ": " << t->c->file() << endl;
 }
 
@@ -176,15 +193,6 @@
     tail = 0;
 }
 
-static int no_more_input = FALSE;
-static CQueue command_queue;
-static int child_pid = 0;
-static EST_String current_file;
-static EST_Option play_wave_options;
-static int maxqueue = 5;
-static int pending_close = FALSE;
-static int kids = 0;
-
 int main(int argc, char **argv)
 {
 
Attachment:
signature.asc
Description: Digital signature