예제 #1
0
/* Response or event from the server arrived */
static apt_bool_t OnMessageReceive(mrcp_application_t* application, mrcp_session_t* session, mrcp_channel_t* channel, mrcp_message_t* message)
{
	(void) application;
	(void) session;
	(void) channel;
	/* Analyze, update your application state and reply messages here */
	if (message->start_line.message_type == MRCP_MESSAGE_TYPE_RESPONSE) {
		if (message->start_line.status_code != MRCP_STATUS_CODE_SUCCESS)
			return sess_failed("SPEAK request failed");
		if (message->start_line.request_state != MRCP_REQUEST_STATE_INPROGRESS)
			return sess_failed("Failed to start SPEAK processing");
		/* Start writing audio to file */
		stream_started = TRUE;
		return TRUE;  /* Does not actually matter */
	}
	if (message->start_line.message_type != MRCP_MESSAGE_TYPE_EVENT)
		return sess_failed("Unexpected message from the server");
	if (message->start_line.method_id == SYNTHESIZER_SPEAK_COMPLETE) {
		mrcp_synth_header_t* hdr = (mrcp_synth_header_t*) mrcp_resource_header_get(message);
		printf("Speak complete: %d %.*s", hdr->completion_cause,
			(int) hdr->completion_reason.length, hdr->completion_reason.buf);
		stream_started = FALSE;
		err = 0;
		apr_thread_cond_signal(cond);
		return TRUE;  /* Does not actually matter */
	}
	return sess_failed("Unknown message recived");
}
예제 #2
0
cst_voice* flite_voices_best_match_get(flite_voices_t *voices, mrcp_message_t *message)
{
	cst_voice *voice = NULL;
	const char *voice_name = NULL;
	mrcp_synth_header_t *synth_header = mrcp_resource_header_get(message);
	if(synth_header) {
		if(mrcp_resource_header_property_check(message,SYNTHESIZER_HEADER_VOICE_NAME) == TRUE) {
			voice_name = synth_header->voice_param.name.buf;
		}
	}

	if(voice_name) {
		/* get voice by name */
		flite_voice_t *flite_voice;
		flite_voice = apr_hash_get(voices->table,voice_name,APR_HASH_KEY_STRING);
		if(flite_voice) {
			voice = flite_voice->self;
		}
	}

	if(!voice) {
		/* still no voice found, get the default one */
		flite_voice_t *flite_voice = NULL;
		void *val;
		apr_hash_index_t *it = apr_hash_first(voices->pool,voices->table);
		apr_hash_this(it,NULL,NULL,&val);
		if(val) {
			flite_voice = val;
			voice = flite_voice->self;
		}
	}
	return voice;
}
예제 #3
0
/** Process VERIFY request */
static apt_bool_t demo_verifier_channel_verify(mrcp_engine_channel_t *channel, mrcp_message_t *request, mrcp_message_t *response)
{
	/* process verify request */
	mrcp_verifier_header_t *verifier_header;
	demo_verifier_channel_t *verifier_channel = channel->method_obj;
	const mpf_codec_descriptor_t *descriptor = mrcp_engine_sink_stream_codec_get(channel);

	if(!descriptor) {
		apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Get Codec Descriptor "APT_SIDRES_FMT, MRCP_MESSAGE_SIDRES(request));
		response->start_line.status_code = MRCP_STATUS_CODE_METHOD_FAILED;
		return FALSE;
	}

	verifier_channel->timers_started = TRUE;

	/* get verifier header */
	verifier_header = mrcp_resource_header_get(request);
	if(verifier_header) {
		if(mrcp_resource_header_property_check(request,VERIFIER_HEADER_START_INPUT_TIMERS) == TRUE) {
			verifier_channel->timers_started = verifier_header->start_input_timers;
		}
		if(mrcp_resource_header_property_check(request,VERIFIER_HEADER_NO_INPUT_TIMEOUT) == TRUE) {
			mpf_activity_detector_noinput_timeout_set(verifier_channel->detector,verifier_header->no_input_timeout);
		}
		if(mrcp_resource_header_property_check(request,VERIFIER_HEADER_SPEECH_COMPLETE_TIMEOUT) == TRUE) {
			mpf_activity_detector_silence_timeout_set(verifier_channel->detector,verifier_header->speech_complete_timeout);
		}
	}

	if(!verifier_channel->audio_out) {
		const apt_dir_layout_t *dir_layout = channel->engine->dir_layout;
		char *file_name = apr_psprintf(channel->pool,"voiceprint-%dkHz-%s.pcm",
							descriptor->sampling_rate/1000,
							request->channel_id.session_id.buf);
		char *file_path = apt_vardir_filepath_get(dir_layout,file_name,channel->pool);
		if(file_path) {
			apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Open Utterance Output File [%s] for Writing",file_path);
			verifier_channel->audio_out = fopen(file_path,"wb");
			if(!verifier_channel->audio_out) {
				apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Open Utterance Output File [%s] for Writing",file_path);
			}
		}
	}

	response->start_line.request_state = MRCP_REQUEST_STATE_INPROGRESS;
	/* send asynchronous response */
	mrcp_engine_channel_message_send(channel,response);
	verifier_channel->verifier_request = request;
	return TRUE;
}
예제 #4
0
/* Test SPEAK request */
static apt_bool_t speak_request_test(mrcp_resource_factory_t *factory, mrcp_message_t *message)
{
    apt_bool_t res;
    mrcp_generic_header_t *generic_header;
    mrcp_synth_header_t *synth_header;
    apt_log(APT_LOG_MARK,APT_PRIO_NOTICE,"Test SPEAK Request");
    res = FALSE;
    /* get generic header */
    generic_header = mrcp_generic_header_get(message);
    if(generic_header) {
        /* test content type header */
        if(mrcp_generic_header_property_check(message,GENERIC_HEADER_CONTENT_TYPE) == TRUE) {
            if(strncasecmp(generic_header->content_type.buf,SAMPLE_CONTENT_TYPE,generic_header->content_type.length) == 0) {
                /* OK */
                apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Get Content-Type: %s",generic_header->content_type.buf);
                res = TRUE;
            }
        }
    }
    if(res == FALSE) {
        apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Test Generic Header");
        return FALSE;
    }

    res = FALSE;
    /* get synthesizer header */
    synth_header = mrcp_resource_header_get(message);
    if(synth_header) {
        /* test voice age header */
        if(mrcp_resource_header_property_check(message,SYNTHESIZER_HEADER_VOICE_AGE) == TRUE) {
            if(synth_header->voice_param.age == SAMPLE_VOICE_AGE) {
                /* OK */
                apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Get Voice-Age: %"APR_SIZE_T_FMT,synth_header->voice_param.age);
                res = TRUE;
            }
        }
    }
    if(res == FALSE) {
        apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Test Synthesizer Header");
        return FALSE;
    }

    if(strncasecmp(message->body.buf,SAMPLE_CONTENT,message->body.length) != 0) {
        apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Test Message Body");
        return FALSE;
    }
    apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Get Body: %s",message->body.buf);
    return TRUE;
}
/** \brief Try to get result */
struct ast_speech_result* uni_recog_get(struct ast_speech *speech)
{
	struct ast_speech_result *result;
	mrcp_recog_header_t *recog_header;

	uni_speech_t *uni_speech = speech->data;

	if(uni_speech->is_inprogress) {
		uni_recog_stop(speech);
	}

	if(!uni_speech->mrcp_event) {
		ast_log(LOG_WARNING, "(%s) No RECOGNITION-COMPLETE message received\n",uni_speech->name);
		return NULL;
	}

	/* Get recognizer header */
	recog_header = mrcp_resource_header_get(uni_speech->mrcp_event);
	if(!recog_header || mrcp_resource_header_property_check(uni_speech->mrcp_event,RECOGNIZER_HEADER_COMPLETION_CAUSE) != TRUE) {
		ast_log(LOG_WARNING, "(%s) Missing completion cause in RECOGNITION-COMPLETE message\n",uni_speech->name);
		return NULL;
	}

	ast_log(LOG_NOTICE, "(%s) Get result completion cause: %03d reason: %s\n",
			uni_speech->name,
			recog_header->completion_cause,
			recog_header->completion_reason.buf ? recog_header->completion_reason.buf : "none");

	if(recog_header->completion_cause != RECOGNIZER_COMPLETION_CAUSE_SUCCESS) {
		ast_log(LOG_WARNING, "(%s) Recognition completed abnormally cause: %03d reason: %s\n",
				uni_speech->name,
				recog_header->completion_cause,
				recog_header->completion_reason.buf ? recog_header->completion_reason.buf : "none");
		return NULL;
	}

	result = uni_recog_speech_result_build(
					uni_speech,
					&uni_speech->mrcp_event->body,
					uni_speech->mrcp_event->start_line.version);
	if(result)
		ast_set_flag(speech,AST_SPEECH_HAVE_RESULTS);

	return result;
}
예제 #6
0
/** \brief Try to get result */
struct ast_speech_result* uni_recog_get(struct ast_speech *speech)
{
	mrcp_recog_header_t *recog_header;

	uni_speech_t *uni_speech = speech->data;

	if(uni_speech->is_inprogress) {
		uni_recog_stop(speech);
	}

	ast_log(LOG_NOTICE, "Get result '%s'\n",uni_speech_id_get(uni_speech));
	if(!uni_speech->mrcp_event) {
		ast_log(LOG_WARNING, "No RECOGNITION-COMPLETE message received\n");
		return NULL;
	}

	/* Get recognizer header */
	recog_header = mrcp_resource_header_get(uni_speech->mrcp_event);
	if(!recog_header || mrcp_resource_header_property_check(uni_speech->mrcp_event,RECOGNIZER_HEADER_COMPLETION_CAUSE) != TRUE) {
		ast_log(LOG_WARNING, "Missing Completion-Cause in RECOGNITION-COMPLETE message\n");
		return NULL;
	}

	if(recog_header->completion_cause != RECOGNIZER_COMPLETION_CAUSE_SUCCESS) {
		ast_log(LOG_WARNING, "Unsuccessful completion cause:%d reason:%s\n",
			recog_header->completion_cause,
			recog_header->completion_reason.buf ? recog_header->completion_reason.buf : "none");
		return NULL;
	}

	if(speech->results) {
		ast_speech_results_free(speech->results);
	}

	speech->results = uni_recog_speech_result_build(
		&uni_speech->mrcp_event->body,
		uni_speech->mrcp_event->start_line.version,
		mrcp_application_session_pool_get(uni_speech->session));
	
	if(speech->results) {
		ast_set_flag(speech,AST_SPEECH_HAVE_RESULTS);
	}
	return speech->results;
}
예제 #7
0
/** Set Swift port params */
static apt_bool_t mrcp_swift_channel_params_set(mrcp_swift_channel_t *synth_channel, mrcp_message_t *message)
{
	const char *name;
	mrcp_synth_header_t *synth_header = mrcp_resource_header_get(message);
	mrcp_generic_header_t *generic_header = mrcp_generic_header_get(message);

	if(synth_header) {
		if(mrcp_resource_header_property_check(message,SYNTHESIZER_HEADER_PROSODY_VOLUME) == TRUE) {
			int volume = 0;
			if(swift_prosody_volume_get(&synth_header->prosody_param.volume,&volume) == TRUE) {
				name = "audio/volume";
				apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Swift Param %s=%d",name,volume);
				mrcp_swift_channel_param_set(synth_channel,name,swift_val_int(volume));
			}
		}
		if(mrcp_resource_header_property_check(message,SYNTHESIZER_HEADER_PROSODY_RATE) == TRUE) {
			int rate = 0;
			if(swift_prosody_rate_get(&synth_header->prosody_param.rate,&rate) == TRUE) {
				name = "speech/rate";
				apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Swift Param %s=%d",name,rate);
				mrcp_swift_channel_param_set(synth_channel,name,swift_val_int(rate));
			}
		}
	}

	if(generic_header) {
		if(mrcp_generic_header_property_check(message,GENERIC_HEADER_CONTENT_TYPE) == TRUE) {
			name = "tts/content-type";
			apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Swift Param %s=%s",name,generic_header->content_type);
			mrcp_swift_channel_param_set(synth_channel,name,swift_val_string(generic_header->content_type.buf));
		}
		if(mrcp_generic_header_property_check(message,GENERIC_HEADER_CONTENT_ENCODING) == TRUE) {
			name = "tts/text-encoding";
			apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Swift Param %s=%s",name,generic_header->content_encoding);
			mrcp_swift_channel_param_set(synth_channel,name,swift_val_string(generic_header->content_encoding.buf));
		}
	}
	
	return TRUE;
}
예제 #8
0
/** Process RECORD request */
static apt_bool_t recorder_channel_record(recorder_channel_t *recorder_channel, mrcp_message_t *request, mrcp_message_t *response)
{
	/* process RECORD request */
	mrcp_recorder_header_t *recorder_header;
	recorder_channel->timers_started = TRUE;

	/* get recorder header */
	recorder_header = mrcp_resource_header_get(request);
	if(recorder_header) {
		if(mrcp_resource_header_property_check(request,RECORDER_HEADER_START_INPUT_TIMERS) == TRUE) {
			recorder_channel->timers_started = recorder_header->start_input_timers;
		}
		if(mrcp_resource_header_property_check(request,RECORDER_HEADER_NO_INPUT_TIMEOUT) == TRUE) {
			mpf_activity_detector_noinput_timeout_set(recorder_channel->detector,recorder_header->no_input_timeout);
		}
		if(mrcp_resource_header_property_check(request,RECORDER_HEADER_FINAL_SILENCE) == TRUE) {
			mpf_activity_detector_silence_timeout_set(recorder_channel->detector,recorder_header->final_silence);
		}
		if(mrcp_resource_header_property_check(request,RECORDER_HEADER_MAX_TIME) == TRUE) {
			recorder_channel->max_time = recorder_header->max_time;
		}
	}

	/* open file to record */
	if(recorder_file_open(recorder_channel,request) == FALSE) {
		response->start_line.request_state = MRCP_REQUEST_STATE_COMPLETE;
		response->start_line.status_code = MRCP_STATUS_CODE_METHOD_FAILED;
		/* send asynchronous response */
		mrcp_engine_channel_message_send(recorder_channel->channel,response);
		return TRUE;
	}

	recorder_channel->cur_time = 0;
	recorder_channel->cur_size = 0;
	response->start_line.request_state = MRCP_REQUEST_STATE_INPROGRESS;
	/* send asynchronous response */
	mrcp_engine_channel_message_send(recorder_channel->channel,response);
	recorder_channel->record_request = request;
	return TRUE;
}
static apt_bool_t synth_request_barge_in_occurred(mrcp_synth_state_machine_t *state_machine, mrcp_message_t *message)
{
	mrcp_message_t *response_message;
	if(state_machine->speaker) {
		apt_bool_t kill_on_barge_in = TRUE;
		mrcp_synth_header_t *synth_header = mrcp_resource_header_get(message);
		if(synth_header) {
			if(mrcp_resource_header_property_check(message,SYNTHESIZER_HEADER_KILL_ON_BARGE_IN) == TRUE) {
				kill_on_barge_in = synth_header->kill_on_barge_in;
			}
		}
	
		if(kill_on_barge_in == TRUE) {
			apt_log(APT_PRIO_INFO,"Process BARGE-IN Request [%d]",message->start_line.request_id);
			return synth_request_dispatch(state_machine,message);
		}
	}

	/* found no kill-on-bargein enabled in-progress SPEAK request, sending immediate response */
	response_message = mrcp_response_create(message,message->pool);
	return synth_response_dispatch(state_machine,response_message);
}
예제 #10
0
/** Process RECOGNIZE request */
static apt_bool_t demo_recog_channel_recognize(mrcp_engine_channel_t *channel, mrcp_message_t *request, mrcp_message_t *response)
{
	/* process RECOGNIZE request */
	mrcp_recog_header_t *recog_header;
	demo_recog_channel_t *recog_channel = channel->method_obj;
	recog_channel->timers_started = TRUE;

	/* get recognizer header */
	recog_header = mrcp_resource_header_get(request);
	if(recog_header) {
		if(mrcp_resource_header_property_check(request,RECOGNIZER_HEADER_START_INPUT_TIMERS) == TRUE) {
			recog_channel->timers_started = recog_header->start_input_timers;
		}
		if(mrcp_resource_header_property_check(request,RECOGNIZER_HEADER_NO_INPUT_TIMEOUT) == TRUE) {
			mpf_activity_detector_noinput_timeout_set(recog_channel->detector,recog_header->no_input_timeout);
		}
		if(mrcp_resource_header_property_check(request,RECOGNIZER_HEADER_SPEECH_COMPLETE_TIMEOUT) == TRUE) {
			mpf_activity_detector_silence_timeout_set(recog_channel->detector,recog_header->speech_complete_timeout);
		}
	}

	if(!recog_channel->audio_out) {
		const apt_dir_layout_t *dir_layout = channel->engine->dir_layout;
		const mpf_codec_descriptor_t *descriptor = mrcp_engine_sink_stream_codec_get(channel);
		char *file_name = apr_psprintf(channel->pool,"utter-%dkHz-%s.pcm",
			descriptor ? descriptor->sampling_rate/1000 : 8,
			request->channel_id.session_id.buf);
		char *file_path = apt_datadir_filepath_get(dir_layout,file_name,channel->pool);
		if(file_path) {
			recog_channel->audio_out = fopen(file_path,"wb");
		}
	}

	response->start_line.request_state = MRCP_REQUEST_STATE_INPROGRESS;
	/* send asynchronous response */
	mrcp_engine_channel_message_send(channel,response);
	recog_channel->recog_request = request;
	return TRUE;
}
예제 #11
0
/** Process SET-PARAMS request */
static apt_bool_t demo_synth_channel_set_params(mrcp_engine_channel_t *channel, mrcp_message_t *request, mrcp_message_t *response)
{
	mrcp_synth_header_t *req_synth_header;
	/* get synthesizer header */
	req_synth_header = mrcp_resource_header_get(request);
	if(req_synth_header) {
		/* check voice age header */
		if(mrcp_resource_header_property_check(request,SYNTHESIZER_HEADER_VOICE_AGE) == TRUE) {
			apt_log(SYNTH_LOG_MARK,APT_PRIO_INFO,"Set Voice Age [%"APR_SIZE_T_FMT"]",
				req_synth_header->voice_param.age);
		}
		/* check voice name header */
		if(mrcp_resource_header_property_check(request,SYNTHESIZER_HEADER_VOICE_NAME) == TRUE) {
			apt_log(SYNTH_LOG_MARK,APT_PRIO_INFO,"Set Voice Name [%s]",
				req_synth_header->voice_param.name.buf);
		}
	}
	
	/* send asynchronous response */
	mrcp_engine_channel_message_send(channel,response);
	return TRUE;
}
예제 #12
0
/** Process GET-PARAMS request */
static apt_bool_t demo_synth_channel_get_params(mrcp_engine_channel_t *channel, mrcp_message_t *request, mrcp_message_t *response)
{
	mrcp_synth_header_t *req_synth_header;
	/* get synthesizer header */
	req_synth_header = mrcp_resource_header_get(request);
	if(req_synth_header) {
		mrcp_synth_header_t *res_synth_header = mrcp_resource_header_prepare(response);
		/* check voice age header */
		if(mrcp_resource_header_property_check(request,SYNTHESIZER_HEADER_VOICE_AGE) == TRUE) {
			res_synth_header->voice_param.age = 25;
			mrcp_resource_header_property_add(response,SYNTHESIZER_HEADER_VOICE_AGE);
		}
		/* check voice name header */
		if(mrcp_resource_header_property_check(request,SYNTHESIZER_HEADER_VOICE_NAME) == TRUE) {
			apt_string_set(&res_synth_header->voice_param.name,"David");
			mrcp_resource_header_property_add(response,SYNTHESIZER_HEADER_VOICE_NAME);
		}
	}

	/* send asynchronous response */
	mrcp_engine_channel_message_send(channel,response);
	return TRUE;
}
예제 #13
0
/** 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;
}
예제 #14
0
/* Create GET-PARAMS response */
static mrcp_message_t* get_params_response_create(mrcp_resource_factory_t *factory, mrcp_message_t *request)
{
    apt_bool_t res;
    mrcp_message_t *response;
    apt_log(APT_LOG_MARK,APT_PRIO_NOTICE,"Create GET-PARAMS Response");
    response = mrcp_response_create(request,request->pool);
    if(response) {
        mrcp_generic_header_t *generic_header;
        mrcp_synth_header_t *synth_header;
        res = FALSE;
        /* get generic header */
        generic_header = mrcp_generic_header_get(request);
        if(generic_header) {
            mrcp_generic_header_t *res_generic_header = mrcp_generic_header_prepare(response);
            /* test content id header */
            if(mrcp_generic_header_property_check(request,GENERIC_HEADER_CONTENT_ID) == TRUE) {
                apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Set Content-ID: %s",SAMPLE_CONTENT_ID);
                apt_string_assign(&res_generic_header->content_id,SAMPLE_CONTENT_ID,response->pool);
                mrcp_generic_header_property_add(response,GENERIC_HEADER_CONTENT_ID);
                res = TRUE;
            }
            /* test vendor specific header */
            if(mrcp_generic_header_property_check(request,GENERIC_HEADER_VENDOR_SPECIFIC_PARAMS) == TRUE) {
                apt_str_t name;
                const apt_pair_t *pair;
                res_generic_header->vendor_specific_params = apt_pair_array_create(1,response->pool);
                apt_string_set(&name,SAMPLE_PARAM_NAME);
                pair = apt_pair_array_find(generic_header->vendor_specific_params,&name);
                if(pair) {
                    apt_str_t value;
                    apt_string_set(&value,SAMPLE_PARAM_VALUE);
                    apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Set Vendor-Specific-Params: %s=%s",name.buf,value.buf);
                    apt_pair_array_append(res_generic_header->vendor_specific_params,&name,&value,response->pool);
                }
                mrcp_generic_header_property_add(response,GENERIC_HEADER_VENDOR_SPECIFIC_PARAMS);
                res = TRUE;
            }
        }

        if(res == FALSE) {
            apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Test Generic Header");
            return NULL;
        }

        res = FALSE;
        /* get synthesizer header */
        synth_header = mrcp_resource_header_get(request);
        if(synth_header) {
            mrcp_synth_header_t *res_synth_header = mrcp_resource_header_prepare(response);
            /* test voice age header */
            if(mrcp_resource_header_property_check(request,SYNTHESIZER_HEADER_VOICE_AGE) == TRUE) {
                res_synth_header->voice_param.age = SAMPLE_VOICE_AGE;
                apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Set Voice-Age: %"APR_SIZE_T_FMT,res_synth_header->voice_param.age);
                mrcp_resource_header_property_add(response,SYNTHESIZER_HEADER_VOICE_AGE);
                res = TRUE;
            }
        }
        if(res == FALSE) {
            apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Test Synthesizer Header");
            return NULL;
        }

    }
    return response;
}