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