2 * Copyright (c) 2011-2016 Samsung Electronics Co., Ltd All Rights Reserved
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 * http://www.apache.org/licenses/LICENSE-2.0
7 * Unless required by applicable law or agreed to in writing, software
8 * distributed under the License is distributed on an "AS IS" BASIS,
9 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 * See the License for the specific language governing permissions and
11 * limitations under the License.
17 #include <stdatomic.h>
20 #include "stt_engine.h"
21 #include "sttd_main.h"
22 #include "sttd_client_data.h"
23 #include "sttd_config.h"
24 #include "sttd_dbus.h"
25 #include "sttd_recorder.h"
26 #include "sttd_engine_agent.h"
30 #define AUDIO_CREATE_ON_START
33 * Internal data structure
36 typedef struct _sttengine_info {
40 char* engine_setting_path;
45 /* engine base setting */
47 bool silence_detection;
48 bool support_silence_detection;
52 /** stt engine agent init */
53 static atomic_bool g_agent_init;
55 static sttengine_info_s* g_engine_info = NULL;
57 /** default engine info */
58 static char* g_default_language = NULL;
59 static bool g_default_silence_detected;
61 /** callback functions */
62 static _Atomic result_callback g_result_cb = NULL;
63 static _Atomic result_time_callback g_result_time_cb = NULL;
64 static _Atomic speech_status_callback g_speech_status_cb = NULL;
65 static _Atomic error_callback g_error_cb = NULL;
67 /** callback functions */
68 static bool __result_time_cb(int index, stte_result_time_event_e event, const char* text,
69 long start_time, long end_time, void* user_data);
75 /** get engine info */
76 static int __internal_get_engine_info(stte_request_callback_s *callback, sttengine_info_s** info);
78 static int __log_enginelist();
81 * STT Engine Agent Interfaces
83 int sttd_engine_agent_init(result_callback result_cb, result_time_callback time_cb,
84 speech_status_callback speech_status_cb, error_callback error_cb)
86 /* initialize static data */
87 if (NULL == result_cb || NULL == time_cb || NULL == speech_status_cb || NULL == error_cb) {
88 SLOG(LOG_ERROR, TAG_STTD, "[Engine agent ERROR] Invalid parameter");
89 return STTD_ERROR_INVALID_PARAMETER;
92 g_result_cb = result_cb;
93 g_result_time_cb = time_cb;
94 g_speech_status_cb = speech_status_cb;
95 g_error_cb = error_cb;
97 g_default_language = NULL;
99 if (0 != sttd_config_get_default_language(&(g_default_language))) {
100 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] There is No default voice in config");
102 /* Set default voice */
103 if (NULL != g_default_language) {
104 free(g_default_language);
105 g_default_language = NULL;
107 g_default_language = strdup("en_US");
109 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Default language is %s", g_default_language);
113 if (0 != sttd_config_get_default_silence_detection(&temp)) {
114 SLOG(LOG_WARN, TAG_STTD, "[Server WARNING] There is no silence detection in config");
115 g_default_silence_detected = true;
117 g_default_silence_detected = (bool)temp;
125 int __engine_agent_clear_engine(sttengine_info_s *engine)
127 if (NULL != engine) {
128 if (NULL != engine->engine_uuid) free(engine->engine_uuid);
129 if (NULL != engine->engine_path) free(engine->engine_path);
130 if (NULL != engine->engine_name) free(engine->engine_name);
131 if (NULL != engine->engine_setting_path)free(engine->engine_setting_path);
132 if (NULL != engine->first_lang) free(engine->first_lang);
141 int sttd_engine_agent_release()
143 if (NULL != g_engine_info) {
144 if (g_engine_info->is_loaded) {
145 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Unload engine");
147 if (0 != stt_engine_deinitialize()) {
148 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to deinitialize");
151 if (0 != stt_engine_unload()) {
152 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to unload engine");
155 if (NULL != g_engine_info->engine_uuid) {
156 free(g_engine_info->engine_uuid);
157 g_engine_info->engine_uuid = NULL;
160 if (NULL != g_engine_info->engine_path) {
161 free(g_engine_info->engine_path);
162 g_engine_info->engine_path = NULL;
165 if (NULL != g_engine_info->engine_name) {
166 free(g_engine_info->engine_name);
167 g_engine_info->engine_name = NULL;
170 if (NULL != g_engine_info->engine_setting_path) {
171 free(g_engine_info->engine_setting_path);
172 g_engine_info->engine_setting_path = NULL;
175 if (NULL != g_engine_info->first_lang) {
176 free(g_engine_info->first_lang);
177 g_engine_info->first_lang = NULL;
180 g_engine_info->is_loaded = false;
183 __engine_agent_clear_engine(g_engine_info);
186 g_agent_init = false;
189 g_speech_status_cb = NULL;
191 g_result_time_cb = NULL;
196 static int __internal_get_engine_info(stte_request_callback_s *callback, sttengine_info_s** info)
198 sttengine_info_s* temp;
199 temp = (sttengine_info_s*)calloc(1, sizeof(sttengine_info_s));
201 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] fail to allocate memory");
202 return STTD_ERROR_OUT_OF_MEMORY;
205 if (NULL == callback) {
206 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid engine");
208 return STTD_ERROR_ENGINE_NOT_FOUND;
211 if (NULL == callback->get_info) {
212 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid engine");
214 return STTD_ERROR_ENGINE_NOT_FOUND;
217 if (0 != callback->get_info(&(temp->engine_uuid), &(temp->engine_name), &(temp->engine_setting_path), &(temp->use_network))) {
218 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get engine info");
220 return STTD_ERROR_ENGINE_NOT_FOUND;
223 /* todo - removed? */
224 temp->engine_path = strdup("empty");
225 temp->is_loaded = false;
227 SLOG(LOG_DEBUG, TAG_STTD, "----- Valid Engine");
228 SLOG(LOG_DEBUG, TAG_STTD, "Engine uuid : %s", (NULL == temp->engine_uuid) ? "NULL" : temp->engine_uuid);
229 SLOG(LOG_DEBUG, TAG_STTD, "Engine name : %s", (NULL == temp->engine_name) ? "NULL" : temp->engine_name);
230 SLOG(LOG_DEBUG, TAG_STTD, "Engine path : %s", (NULL == temp->engine_path) ? "NULL" : temp->engine_path);
231 SLOG(LOG_DEBUG, TAG_STTD, "Engine setting path : %s", (NULL == temp->engine_setting_path) ? "NULL" : temp->engine_setting_path);
232 SLOG(LOG_DEBUG, TAG_STTD, "Use network : %s", temp->use_network ? "true" : "false");
233 SLOG(LOG_DEBUG, TAG_STTD, "-----");
234 SLOG(LOG_DEBUG, TAG_STTD, " ");
238 return STTD_ERROR_NONE;
241 bool __is_engine(const char* filepath)
243 if (NULL == filepath) {
244 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] No filepath");
248 if (NULL != g_engine_info) {
249 if (!strcmp(g_engine_info->engine_path, filepath)) {
257 int __engine_agent_check_engine_unload()
259 /* Check the count of client to use this engine */
260 if (NULL == g_engine_info) {
261 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] No engine");
263 if (g_engine_info->is_loaded) {
265 #ifndef AUDIO_CREATE_ON_START
266 SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Destroy recorder");
267 if (0 != sttd_recorder_destroy())
268 SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder");
270 SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Unload engine");
271 if (0 != stt_engine_deinitialize())
272 SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to deinitialize engine");
274 if (0 != stt_engine_unload())
275 SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to unload engine");
277 g_engine_info->is_loaded = false;
284 int sttd_engine_agent_load_current_engine(stte_request_callback_s *callback)
286 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
288 /* Get current engine info */
289 sttengine_info_s* info;
290 int ret = __internal_get_engine_info(callback, &info);
292 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get engine info");
295 g_engine_info = info;
300 /* Set default engine */
301 char* cur_engine_uuid = NULL;
302 bool is_default_engine = false;
304 /* get current engine from config */
305 if (0 == sttd_config_get_default_engine(&cur_engine_uuid)) {
306 SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] current engine from config : %s", cur_engine_uuid);
307 if (NULL != g_engine_info->engine_uuid && NULL != cur_engine_uuid) {
308 if (!strcmp(g_engine_info->engine_uuid, cur_engine_uuid)) {
309 is_default_engine = true;
312 if (NULL != cur_engine_uuid) {
313 free(cur_engine_uuid);
314 cur_engine_uuid = NULL;
317 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] There is not current engine from config");
320 if (false == is_default_engine) {
321 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Current engine is not Default engine");
323 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Current engine is Default engine");
327 ret = stt_engine_load(g_engine_info->engine_path, callback);
329 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to load engine : path(%s)", g_engine_info->engine_path);
333 ret = stt_engine_initialize(false);
335 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to initialize engine : path(%s)", g_engine_info->engine_path);
339 ret = stt_engine_set_silence_detection(g_default_silence_detected);
341 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] Not support silence detection");
342 g_engine_info->support_silence_detection = false;
344 SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Silence detection : %s", g_default_silence_detected ? "true" : "false");
345 g_engine_info->support_silence_detection = true;
346 g_engine_info->silence_detection = g_default_silence_detected;
349 /* Set first language */
350 char* tmp_lang = NULL;
351 ret = stt_engine_get_first_language(&tmp_lang);
352 if (0 == ret && NULL != tmp_lang) {
353 g_engine_info->first_lang = strdup(tmp_lang);
356 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get first language from engine : %s", g_engine_info->engine_name);
360 #ifndef AUDIO_CREATE_ON_START
362 stte_audio_type_e atype;
366 ret = stt_engine_get_audio_format(&atype, &rate, &channels);
368 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get audio type : %d %s", g_engine_info->engine_name);
372 ret = sttd_recorder_create(atype, channels, rate);
374 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to create recorder : %s", g_engine_info->engine_name);
379 g_engine_info->is_loaded = true;
380 SECURE_SLOG(LOG_INFO, TAG_STTD, "[Engine Agent SUCCESS] The %s has been loaded !!!", g_engine_info->engine_name);
385 int sttd_engine_agent_unload_current_engine()
387 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
390 __engine_agent_check_engine_unload();
395 bool sttd_engine_agent_is_default_engine()
400 int sttd_engine_agent_get_engine_list(GSList** engine_list)
402 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
404 SLOG(LOG_DEBUG, TAG_STTD, "--------------------------------------");
409 static int __sttd_engine_agent_check_precondition()
411 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
412 RETVM_IF(NULL == g_engine_info, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] The engine is not valid");
413 RETVM_IF(false == g_engine_info->is_loaded, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not loaded engine");
414 return STTD_ERROR_NONE;
417 int sttd_engine_agent_get_current_engine(char** engine_uuid)
419 RETVM_IF(NULL == engine_uuid, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Invalid parameter");
420 int tmp = __sttd_engine_agent_check_precondition();
421 if (STTD_ERROR_NONE != tmp)
424 *engine_uuid = strdup(g_engine_info->engine_uuid);
429 bool sttd_engine_agent_need_network()
431 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
432 if (NULL != g_engine_info)
433 return g_engine_info->use_network;
438 int sttd_engine_agent_supported_langs(GSList** lang_list)
440 RETVM_IF(NULL == lang_list, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
441 int tmp = __sttd_engine_agent_check_precondition();
442 if (STTD_ERROR_NONE != tmp)
445 int ret = stt_engine_get_supported_langs(lang_list);
447 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] get language list error(%d)", ret);
453 int sttd_engine_agent_get_default_lang(char** lang)
455 RETVM_IF(NULL == lang, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
456 int tmp = __sttd_engine_agent_check_precondition();
457 if (STTD_ERROR_NONE != tmp)
460 /* get default language */
461 bool is_valid = false;
462 if (0 != stt_engine_is_valid_language(g_default_language, &is_valid)) {
463 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to check valid language");
464 return STTD_ERROR_OPERATION_FAILED;
467 if (true == is_valid) {
468 *lang = strdup(g_default_language);
470 *lang = strdup(g_engine_info->first_lang);
475 int sttd_engine_agent_set_private_data(const char* key, const char* data)
477 RETVM_IF(NULL == key || NULL == data, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
478 int tmp = __sttd_engine_agent_check_precondition();
479 if (STTD_ERROR_NONE != tmp)
482 /* set private data */
484 ret = stt_engine_set_private_data(key, data);
486 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set private data");
492 int sttd_engine_agent_get_private_data(const char* key, char** data)
494 RETVM_IF(NULL == key || NULL == data, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
495 int tmp = __sttd_engine_agent_check_precondition();
496 if (STTD_ERROR_NONE != tmp)
499 /* get default language */
501 ret = stt_engine_get_private_data(key, data);
503 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get private data");
509 int sttd_engine_agent_get_option_supported(bool* silence)
511 RETVM_IF(NULL == silence, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
512 int tmp = __sttd_engine_agent_check_precondition();
513 if (STTD_ERROR_NONE != tmp)
517 if (0 != stt_engine_support_silence(&temp)) {
518 SLOG(LOG_WARN, TAG_STTD, "[WARNING] Fail to get support silence");
521 *silence = g_engine_info->support_silence_detection;
522 if (temp != *silence) {
523 SLOG(LOG_WARN, TAG_STTD, "[WARNING] Metadata and Engine spec are different (engine:%d) (meta:%d)", temp, *silence);
529 int sttd_engine_agent_is_credential_needed(unsigned int uid, bool* credential)
531 RETVM_IF(NULL == credential, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
532 int tmp = __sttd_engine_agent_check_precondition();
533 if (STTD_ERROR_NONE != tmp)
539 ret = stt_engine_need_app_credential(&temp);
541 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get to support recognition type : %d", ret);
549 int sttd_engine_agent_is_recognition_type_supported(const char* type, bool* support)
551 RETVM_IF(NULL == type || NULL == support, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
552 int tmp = __sttd_engine_agent_check_precondition();
553 if (STTD_ERROR_NONE != tmp)
559 ret = stt_engine_support_recognition_type(type, &temp);
561 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get to support recognition type : %d", ret);
570 int sttd_engine_agent_get_audio_format(stte_audio_type_e* type, int* rate, int* num_of_channels)
572 RETVM_IF(NULL == type || NULL == rate || NULL == num_of_channels, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
573 int tmp = __sttd_engine_agent_check_precondition();
574 if (STTD_ERROR_NONE != tmp)
577 int ret = stt_engine_get_audio_format(type, rate, num_of_channels);
579 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get to audio format : %d", ret);
583 return STTD_ERROR_NONE;
587 * STT Engine Interfaces for client
590 int __set_option(sttengine_info_s* engine, int silence)
595 /* Check silence detection */
596 if (engine->support_silence_detection) {
598 /* default option set */
599 // if (g_default_silence_detected != engine->silence_detection) {
600 if (0 != stt_engine_set_silence_detection(g_default_silence_detected)) {
601 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set silence detection : %s", g_default_silence_detected ? "true" : "false");
603 engine->silence_detection = g_default_silence_detected;
604 SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Set silence detection : %s", g_default_silence_detected ? "true" : "false");
608 if (silence != engine->silence_detection) {
609 if (0 != stt_engine_set_silence_detection(silence)) {
610 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set silence detection : %s", silence ? "true" : "false");
612 engine->silence_detection = silence;
613 SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Set silence detection : %s", silence ? "true" : "false");
622 int sttd_engine_agent_recognize_start_engine(unsigned int uid, const char* lang, const char* recognition_type,
623 int silence, const char* appid, const char* credential, void* user_param)
625 RETVM_IF(NULL == lang || NULL == recognition_type, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
626 int tmp = __sttd_engine_agent_check_precondition();
627 if (STTD_ERROR_NONE != tmp)
630 if (0 != __set_option(g_engine_info, silence)) {
631 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set options");
632 return STTD_ERROR_OPERATION_FAILED;
635 SLOG(LOG_INFO, TAG_STTD, "g_default_language %s", g_default_language);
639 if (0 == strncmp(lang, "default", strlen("default"))) {
640 bool is_valid = false;
641 ret = stt_engine_is_valid_language(g_default_language, &is_valid);
643 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to check valid language");
647 if (true == is_valid) {
648 temp = strdup(g_default_language);
649 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent DEBUG] Default language is %s", temp);
651 temp = strdup(g_engine_info->first_lang);
652 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent DEBUG] Default language is engine first lang : %s", temp);
658 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Start engine");
660 ret = stt_engine_recognize_start(temp, recognition_type, appid, credential, user_param);
661 if (NULL != temp) free(temp);
663 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Recognition start error(%d)", ret);
668 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Start recorder(%d)", uid);
670 ret = sttd_recorder_start(uid);
672 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to start recorder : result(%d)", ret);
681 int sttd_engine_agent_recognize_start_recorder(unsigned int uid, const char* appid)
683 int tmp = __sttd_engine_agent_check_precondition();
684 if (STTD_ERROR_NONE != tmp)
687 stte_audio_type_e atype;
691 int ret = stt_engine_get_audio_format(&atype, &rate, &channels);
692 if (STTE_ERROR_NONE != ret) {
693 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get audio format : %s", g_engine_info->engine_name);
697 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Create recorder");
698 ret = sttd_recorder_create(atype, channels, rate);
699 if (STTD_ERROR_NONE != ret) {
700 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to create format : %s", g_engine_info->engine_name);
704 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Start recorder");
705 ret = sttd_recorder_start(uid, appid);
706 if (STTD_ERROR_NONE != ret) {
707 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to start recorder : result(%d)", ret);
708 stt_engine_recognize_cancel();
709 sttd_recorder_stop();
713 return STTD_ERROR_NONE;
716 int sttd_engine_agent_recognize_start_file(unsigned int uid, const char* filepath)
718 int tmp = __sttd_engine_agent_check_precondition();
719 if (STTD_ERROR_NONE != tmp)
722 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Start recorder");
725 ret = sttd_recorder_start_file(uid, filepath);
727 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to start recorder : result(%d)", ret);
728 stt_engine_recognize_cancel();
729 sttd_recorder_stop_file();
736 int sttd_engine_agent_set_recording_data(const void* data, unsigned int length)
738 RETVM_IF(NULL == data || 0 == length, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
739 int tmp = __sttd_engine_agent_check_precondition();
740 if (STTD_ERROR_NONE != tmp)
743 int ret = stt_engine_set_recording_data(data, length);
745 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] set recording error(%d)", ret);
751 int sttd_engine_agent_recognize_stop_file()
753 int tmp = __sttd_engine_agent_check_precondition();
754 if (STTD_ERROR_NONE != tmp)
757 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Stop recorder");
759 ret = sttd_recorder_stop_file();
761 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to stop recorder : result(%d)", ret);
765 #ifdef AUDIO_CREATE_ON_START
766 SECURE_SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Destroy recorder");
767 if (0 != sttd_recorder_destroy())
768 SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder");
771 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent Success] Stop recorder");
775 int sttd_engine_agent_recognize_stop_recorder()
777 int tmp = __sttd_engine_agent_check_precondition();
778 if (STTD_ERROR_NONE != tmp)
781 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Stop recorder");
783 ret = sttd_recorder_stop();
785 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to stop recorder : result(%d)", ret);
789 #ifdef AUDIO_CREATE_ON_START
790 SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Destroy recorder");
791 if (0 != sttd_recorder_destroy())
792 SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder");
795 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent Success] Stop recorder");
799 int sttd_engine_agent_recognize_stop_engine()
801 int tmp = __sttd_engine_agent_check_precondition();
802 if (STTD_ERROR_NONE != tmp)
805 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Stop engine");
808 ret = stt_engine_recognize_stop();
810 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] stop recognition error(%d)", ret);
814 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent Success] Stop engine");
819 int sttd_engine_agent_recognize_cancel()
821 int tmp = __sttd_engine_agent_check_precondition();
822 if (STTD_ERROR_NONE != tmp)
825 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Cancel engine");
828 ret = stt_engine_recognize_cancel();
830 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] cancel recognition error(%d)", ret);
834 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Stop recorder");
836 ret = sttd_recorder_stop();
838 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to stop recorder : result(%d)", ret);
842 #ifdef AUDIO_CREATE_ON_START
843 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Destroy recorder");
844 if (0 != sttd_recorder_destroy())
845 SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder");
848 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent Success] Cancel recognition");
855 * STT Engine Interfaces for configure
858 int sttd_engine_agent_set_default_engine(const char* engine_uuid)
860 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
861 RETVM_IF(NULL == engine_uuid, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Invalid Parameter");
865 RETVM_IF(NULL == g_engine_info, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] The Default engine is not valid");
867 SECURE_SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Default engine uuid(%s)", g_engine_info->engine_uuid);
872 int sttd_engine_agent_set_default_language(const char* language)
874 RETVM_IF(NULL == language, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
875 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
877 if (NULL != g_default_language)
878 free(g_default_language);
880 g_default_language = strdup(language);
885 int sttd_engine_agent_set_silence_detection(bool value)
887 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
889 g_default_silence_detected = value;
894 int sttd_engine_agent_check_app_agreed(const char* appid, bool* result)
896 int tmp = __sttd_engine_agent_check_precondition();
897 if (STTD_ERROR_NONE != tmp)
901 ret = stt_engine_check_app_agreed(appid, result);
903 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] cancel recognition error(%d)", ret);
908 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Get engine right : %s", *result ? "true" : "false");
912 static void __recorder_destroy_by_error_result(void *data)
914 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Destroy recorder");
915 if (0 != sttd_recorder_destroy())
916 SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder");
921 int sttd_engine_agent_send_result(stte_result_event_e event, const char* type, const char** result, int result_count,
922 const char* msg, void* time_info, void *user_data)
925 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
927 SLOG(LOG_INFO, TAG_STTD, "[Server] === Result time callback ===");
929 if (NULL != time_info) {
930 /* Get the time info */
931 ret = stt_engine_foreach_result_time(time_info, __result_time_cb, NULL);
933 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get time info : %d", ret);
938 SLOG(LOG_INFO, TAG_STTD, "[Server] ============================");
940 RETVM_IF(NULL == g_result_cb, STTD_ERROR_OPERATION_FAILED, "[Server ERROR] Callback is not set.");
942 ret = g_result_cb(event, type, result, result_count, msg, user_data);
944 #ifdef AUDIO_CREATE_ON_START
945 if (event == STTE_RESULT_EVENT_ERROR) {
946 ecore_main_loop_thread_safe_call_async(__recorder_destroy_by_error_result, NULL);
953 int sttd_engine_agent_send_error(stte_error_e error, const char* msg)
955 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
958 unsigned int uid = stt_client_get_current_recognition();
960 int ret = sttdc_send_error_signal(uid, error, msg);
962 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send error info. (%d/%s)", ret, get_error_message(ret));
965 RETVM_IF(NULL == g_error_cb, STTD_ERROR_OPERATION_FAILED, "[Server ERROR] Callback is not set.");
967 return g_error_cb(error, msg);
970 int sttd_engine_agent_send_speech_status(stte_speech_status_e status, void* user_data)
972 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
973 RETVM_IF(NULL == g_speech_status_cb, STTD_ERROR_OPERATION_FAILED, "[Server ERROR] Callback is not set.");
975 return g_speech_status_cb(status, user_data);
978 static bool __result_time_cb(int index, stte_result_time_event_e event, const char* text, long start_time, long end_time, void* user_data)
980 RETVM_IF(false == g_agent_init, false, "[Engine Agent ERROR] Not Initialized");
981 RETVM_IF(NULL == g_result_time_cb, false, "[Server ERROR] Callback is not set.");
983 return g_result_time_cb(index, event, text, start_time, end_time, user_data);
986 /* A function forging */
987 static int __log_enginelist()
989 if (NULL != g_engine_info) {
990 SLOG(LOG_DEBUG, TAG_STTD, "------------------ engine -----------------------");
991 SLOG(LOG_DEBUG, TAG_STTD, "engine uuid : %s", g_engine_info->engine_uuid);
992 SLOG(LOG_DEBUG, TAG_STTD, "engine name : %s", g_engine_info->engine_name);
993 SLOG(LOG_DEBUG, TAG_STTD, "engine path : %s", g_engine_info->engine_path);
994 SLOG(LOG_DEBUG, TAG_STTD, "use network : %s", g_engine_info->use_network ? "true" : "false");
995 SLOG(LOG_DEBUG, TAG_STTD, "is loaded : %s", g_engine_info->is_loaded ? "true" : "false");
996 if (NULL != g_engine_info->first_lang) {
997 SLOG(LOG_DEBUG, TAG_STTD, "default lang : %s", g_engine_info->first_lang);
999 SLOG(LOG_DEBUG, TAG_STTD, "-------------------------------------------------");
1001 SLOG(LOG_DEBUG, TAG_STTD, "------------------ engine -----------------------");
1002 SLOG(LOG_DEBUG, TAG_STTD, " No engine");
1003 SLOG(LOG_DEBUG, TAG_STTD, "-------------------------------------------------");
1009 int sttd_engine_agent_get_audio_type(char** audio_type)
1011 int tmp = __sttd_engine_agent_check_precondition();
1012 if (STTD_ERROR_NONE != tmp)
1015 SLOG(LOG_INFO, TAG_STTD, "[Server Info] Get audio type");
1017 int ret = stt_engine_get_audio_type(audio_type);
1018 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent] get audio type(%s). ret(%d)", *audio_type, ret);
1023 int sttd_engine_agent_set_audio_type(const char* audio_type)
1025 int tmp = __sttd_engine_agent_check_precondition();
1026 if (STTD_ERROR_NONE != tmp)
1029 SLOG(LOG_INFO, TAG_STTD, "[Server Info] Set audio type(%s)", audio_type);
1031 int ret = stt_engine_set_audio_type(audio_type);
1032 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent] set audio type(%d)", ret);