[Freeswitch-svn] [commit] r8932 - freeswitch/trunk/src/mod/asr_tts/mod_flite
Freeswitch SVN
anthm at freeswitch.org
Tue Jul 8 15:25:26 EDT 2008
Author: anthm
Date: Tue Jul 8 15:25:25 2008
New Revision: 8932
Added:
freeswitch/trunk/src/mod/asr_tts/mod_flite/
freeswitch/trunk/src/mod/asr_tts/mod_flite/Makefile
freeswitch/trunk/src/mod/asr_tts/mod_flite/mod_flite.c
Log:
add mod_flite
Added: freeswitch/trunk/src/mod/asr_tts/mod_flite/Makefile
==============================================================================
--- (empty file)
+++ freeswitch/trunk/src/mod/asr_tts/mod_flite/Makefile Tue Jul 8 15:25:25 2008
@@ -0,0 +1,5 @@
+LOCAL_CFLAGS=-I/usr/local/include
+LOCAL_LDFLAGS=-L/usr/local/lib -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_usenglish -lflite_cmulex -lflite -lm
+
+BASE=../../../..
+include $(BASE)/build/modmake.rules
Added: freeswitch/trunk/src/mod/asr_tts/mod_flite/mod_flite.c
==============================================================================
--- (empty file)
+++ freeswitch/trunk/src/mod/asr_tts/mod_flite/mod_flite.c Tue Jul 8 15:25:25 2008
@@ -0,0 +1,206 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005/2006, Anthony Minessale II <anthmct at yahoo.com>
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Anthony Minessale II <anthmct at yahoo.com>
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Brian West <brian at freeswitch.org>
+ *
+ *
+ * mod_flite.c -- Flite Interface
+ *
+ *
+ */
+
+#include <switch.h>
+#include <flite/flite.h>
+
+cst_voice *register_cmu_us_kal(void);
+void unregister_cmu_us_kal(cst_voice * v);
+
+cst_voice *register_cmu_us_kal16(void);
+void unregister_cmu_us_kal16(cst_voice * v);
+
+SWITCH_MODULE_LOAD_FUNCTION(mod_flite_load);
+SWITCH_MODULE_DEFINITION(mod_flite, mod_flite_load, NULL, NULL);
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_flite_shutdown);
+
+static struct {
+ cst_voice *v8;
+ cst_voice *v16;
+} globals;
+
+
+struct flite_data {
+ cst_voice *v;
+ cst_wave *w;
+ switch_buffer_t *audio_buffer;
+};
+typedef struct flite_data flite_t;
+
+#define free_wave(w) if (w) {delete_wave(w) ; w = NULL; }
+#define FLITE_BLOCK_SIZE 1024 * 32
+
+static switch_status_t flite_speech_open(switch_speech_handle_t *sh, const char *voice_name, int rate, switch_speech_flag_t *flags)
+{
+
+ flite_t *flite = switch_core_alloc(sh->memory_pool, sizeof(*flite));
+
+ if (rate == 8000) {
+ flite->v = globals.v8;
+ } else if (rate == 16000) {
+ flite->v = globals.v16;
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "invalid rate %d. Only 8000 and 16000 are supported.\n", rate);
+ }
+
+ if (flite->v) {
+ sh->private_info = flite;
+ return SWITCH_STATUS_SUCCESS;
+ }
+
+ return SWITCH_STATUS_FALSE;
+}
+
+static switch_status_t flite_speech_close(switch_speech_handle_t *sh, switch_speech_flag_t *flags)
+{
+ flite_t *flite = (flite_t *) sh->private_info;
+
+ if (flite->audio_buffer) {
+ switch_buffer_destroy(&flite->audio_buffer);
+ }
+
+ free_wave(flite->w);
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+static switch_status_t flite_speech_feed_tts(switch_speech_handle_t *sh, char *text, switch_speech_flag_t *flags)
+{
+
+ flite_t *flite = (flite_t *) sh->private_info;
+
+ flite->w = flite_text_to_wave(text, flite->v);
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+static void flite_speech_flush_tts(switch_speech_handle_t *sh)
+{
+ flite_t *flite = (flite_t *) sh->private_info;
+
+ if (flite->audio_buffer) {
+ switch_buffer_zero(flite->audio_buffer);
+ }
+ free_wave(flite->w);
+}
+
+static switch_status_t flite_speech_read_tts(switch_speech_handle_t *sh, void *data, size_t *datalen, uint32_t *rate, switch_speech_flag_t *flags)
+{
+ size_t bytes_read;
+ flite_t *flite = (flite_t *) sh->private_info;
+
+ if (!flite->audio_buffer) {
+ int32_t len;
+
+ if (flite->w) {
+ len = flite->w->num_samples * 2;
+ } else {
+ len = FLITE_BLOCK_SIZE;
+ }
+
+ switch_buffer_create_dynamic(&flite->audio_buffer, FLITE_BLOCK_SIZE, len, 0);
+ switch_assert(flite->audio_buffer);
+ }
+
+ if (flite->w) {
+ switch_buffer_write(flite->audio_buffer, flite->w->samples, flite->w->num_samples * 2);
+ free_wave(flite->w);
+ }
+
+ if ((bytes_read = switch_buffer_read(flite->audio_buffer, data, *datalen))) {
+ *datalen = bytes_read;
+ return SWITCH_STATUS_SUCCESS;
+ }
+
+ return SWITCH_STATUS_FALSE;
+}
+
+static void flite_text_param_tts(switch_speech_handle_t *sh, char *param, const char *val)
+{
+
+}
+
+static void flite_numeric_param_tts(switch_speech_handle_t *sh, char *param, int val)
+{
+
+}
+
+static void flite_float_param_tts(switch_speech_handle_t *sh, char *param, double val)
+{
+
+}
+
+SWITCH_MODULE_LOAD_FUNCTION(mod_flite_load)
+{
+ switch_speech_interface_t *speech_interface;
+
+ flite_init();
+ globals.v8 = register_cmu_us_kal();
+ globals.v16 = register_cmu_us_kal16();
+
+ /* connect my internal structure to the blank pointer passed to me */
+ *module_interface = switch_loadable_module_create_module_interface(pool, modname);
+ speech_interface = switch_loadable_module_create_interface(*module_interface, SWITCH_SPEECH_INTERFACE);
+ speech_interface->interface_name = "flite";
+ speech_interface->speech_open = flite_speech_open;
+ speech_interface->speech_close = flite_speech_close;
+ speech_interface->speech_feed_tts = flite_speech_feed_tts;
+ speech_interface->speech_read_tts = flite_speech_read_tts;
+ speech_interface->speech_flush_tts = flite_speech_flush_tts;
+ speech_interface->speech_text_param_tts = flite_text_param_tts;
+ speech_interface->speech_numeric_param_tts = flite_numeric_param_tts;
+ speech_interface->speech_float_param_tts = flite_float_param_tts;
+
+ /* indicate that the module should continue to be loaded */
+ return SWITCH_STATUS_SUCCESS;
+}
+
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_flite_shutdown)
+{
+ unregister_cmu_us_kal(globals.v8);
+ unregister_cmu_us_kal(globals.v16);
+
+ return SWITCH_STATUS_UNLOAD;
+}
+
+
+/* For Emacs:
+ * Local Variables:
+ * mode:c
+ * indent-tabs-mode:t
+ * tab-width:4
+ * c-basic-offset:4
+ * End:
+ * For VIM:
+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab:
+ */
More information about the Freeswitch-svn
mailing list