/** Set Swift port param */ static apt_bool_t mrcp_swift_channel_param_set(mrcp_swift_channel_t *synth_channel, const char *name, swift_val *val) { swift_result_t res; if(SWIFT_FAILED(res = swift_port_set_param(synth_channel->port,name,val,synth_channel->tts_stream)) ) { const char *error_string = swift_strerror(res); apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Swift Param %s: %s",name,error_string); return FALSE; } return TRUE; }
static void speechError (swift_result_t result, const char *action) { logMessage(LOG_ERR, "Swift %s error: %s", action, swift_strerror(result)); }
/** Set voice matching specified criteria */ static apt_bool_t mrcp_swift_channel_voice_set(mrcp_swift_channel_t *synth_channel, mrcp_message_t *message) { mrcp_synth_header_t *synth_header = mrcp_resource_header_get(message); char search_criteria[1024]; int offset = 0; swift_voice *voice; swift_result_t res; if(!synth_header) { /* no params to set */ return TRUE; } if(mrcp_resource_header_property_check(message,SYNTHESIZER_HEADER_VOICE_NAME) == TRUE) { offset += search_criteria_delimiter_add(search_criteria+offset,sizeof(search_criteria)-offset,(offset == 0)); offset += apr_snprintf(search_criteria+offset,sizeof(search_criteria)-offset,"speaker/name=%s",synth_header->voice_param.name.buf); } if(mrcp_resource_header_property_check(message,SYNTHESIZER_HEADER_VOICE_GENDER) == TRUE) { switch(synth_header->voice_param.gender) { case VOICE_GENDER_MALE: offset += search_criteria_delimiter_add(search_criteria+offset,sizeof(search_criteria)-offset,offset == 0); offset += apr_snprintf(search_criteria+offset,sizeof(search_criteria)-offset,"speaker/gender=male"); break; case VOICE_GENDER_FEMALE: offset += search_criteria_delimiter_add(search_criteria+offset,sizeof(search_criteria)-offset,offset == 0); offset += apr_snprintf(search_criteria+offset,sizeof(search_criteria)-offset,"speaker/gender=female"); break; default: break; } } if(mrcp_resource_header_property_check(message,SYNTHESIZER_HEADER_VOICE_AGE) == TRUE) { offset += search_criteria_delimiter_add(search_criteria+offset,sizeof(search_criteria)-offset,offset == 0); offset += apr_snprintf(search_criteria+offset,sizeof(search_criteria)-offset,"speaker/age=%d",synth_header->voice_param.age); } if(mrcp_resource_header_property_check(message,SYNTHESIZER_HEADER_SPEECH_LANGUAGE) == TRUE) { const char *swift_lang_name = NULL; if(swift_speech_language_table) { swift_lang_name = apr_table_get(swift_speech_language_table,synth_header->speech_language.buf); } if(!swift_lang_name) { swift_lang_name = synth_header->speech_language.buf; } offset += search_criteria_delimiter_add(search_criteria+offset,sizeof(search_criteria)-offset,offset == 0); offset += apr_snprintf(search_criteria+offset,sizeof(search_criteria)-offset,"language/name=%s",swift_lang_name); } if(offset > 0) { apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Find Voices Matching the Criteria [%s]",search_criteria); if((voice = swift_port_find_first_voice(synth_channel->port,search_criteria,NULL)) == NULL) { apt_log(APT_LOG_MARK,APT_PRIO_INFO,"No Swift Voice Available Matching the Criteria [%s]",search_criteria); voice = swift_port_find_first_voice(synth_channel->port,NULL,NULL); } if(SWIFT_FAILED(res = swift_port_set_voice(synth_channel->port,voice)) ) { const char *error_string = swift_strerror(res); apt_log(APT_LOG_MARK,APT_PRIO_INFO,error_string); return FALSE; } } return TRUE; }