2 * Copyright (c) 2012, 2013 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.
18 #include "sttd_main.h"
19 #include "sttd_client_data.h"
20 #include "sttd_config.h"
21 #include "sttd_engine_agent.h"
25 * Internal data structure
34 /* engine load info */
38 bool support_silence_detection;
39 bool support_profanity_filter;
40 bool support_punctuation_override;
43 /* engine base setting */
45 bool profanity_filter;
46 bool punctuation_override;
47 bool silence_detection;
49 sttpe_funcs_s* pefuncs;
50 sttpd_funcs_s* pdfuncs;
52 int (*sttp_load_engine)(sttpd_funcs_s* pdfuncs, sttpe_funcs_s* pefuncs);
53 int (*sttp_unload_engine)();
56 typedef struct _sttengine_info {
60 char* setting_ug_path;
62 bool support_silence_detection;
70 /** stt engine agent init */
71 static bool g_agent_init;
73 /** stt engine list */
74 static GList *g_engine_list;
76 /** current engine infomation */
77 static sttengine_s g_cur_engine;
79 /** default option value */
80 static bool g_default_profanity_filter;
81 static bool g_default_punctuation_override;
82 static bool g_default_silence_detected;
84 /** callback functions */
85 static result_callback g_result_cb;
86 static partial_result_callback g_partial_result_cb;
87 static silence_dectection_callback g_silence_cb;
90 /** callback functions */
91 void __result_cb(sttp_result_event_e event, const char* type,
92 const char** data, int data_count, const char* msg, void *user_data);
94 void __partial_result_cb(sttp_result_event_e event, const char* data, void *user_data);
96 void __detect_silence_cb(void* user_data);
98 bool __supported_language_cb(const char* language, void* user_data);
100 void __engine_info_cb(const char* engine_uuid, const char* engine_name, const char* setting_ug_name,
101 bool use_network, void* user_data);
103 bool __engine_setting_cb(const char* key, const char* value, void* user_data);
105 /** Free voice list */
106 void __free_language_list(GList* lang_list);
110 * Internal Interfaces
113 /** Set current engine */
114 int __internal_set_current_engine(const char* engine_uuid);
116 /** check engine id */
117 int __internal_check_engine_id(const char* engine_uuid);
119 /** update engine list */
120 int __internal_update_engine_list();
122 /** get engine info */
123 int __internal_get_engine_info(const char* filepath, sttengine_info_s** info);
125 int __log_enginelist();
128 * STT Engine Agent Interfaces
130 int sttd_engine_agent_init(result_callback result_cb, partial_result_callback partial_result_cb, silence_dectection_callback silence_cb)
132 /* initialize static data */
133 if (NULL == result_cb || NULL == silence_cb) {
134 SLOG(LOG_ERROR, TAG_STTD, "[Engine agent ERROR] sttd_engine_agent_init : invalid parameter");
135 return STTD_ERROR_INVALID_PARAMETER;
138 g_result_cb = result_cb;
139 g_partial_result_cb = partial_result_cb;
140 g_silence_cb = silence_cb;
142 g_cur_engine.engine_uuid = NULL;
143 g_cur_engine.engine_name = NULL;
144 g_cur_engine.engine_path = NULL;
146 g_cur_engine.is_set = false;
147 g_cur_engine.handle = NULL;
148 g_cur_engine.pefuncs = (sttpe_funcs_s*)malloc( sizeof(sttpe_funcs_s) );
149 g_cur_engine.pdfuncs = (sttpd_funcs_s*)malloc( sizeof(sttpd_funcs_s) );
153 if (0 != sttd_config_get_default_language(&(g_cur_engine.default_lang))) {
154 SLOG(LOG_WARN, TAG_STTD, "[Server WARNING] There is No default voice in config");
155 /* Set default voice */
156 g_cur_engine.default_lang = strdup("en_US");
160 if (0 != sttd_config_get_default_silence_detection(&temp)) {
161 SLOG(LOG_WARN, TAG_STTD, "[Server WARNING] There is no silence detection in config");
162 g_default_silence_detected = true;
164 g_default_silence_detected = (bool)temp;
167 if (0 != sttd_config_get_default_profanity_filter(&temp)) {
168 SLOG(LOG_WARN, TAG_STTD, "[Server WARNING] There is no profanity filter in config");
169 g_default_profanity_filter = false;
171 g_default_profanity_filter = (bool)temp;
174 if (0 != sttd_config_get_default_punctuation_override(&temp)) {
175 SLOG(LOG_WARN, TAG_STTD, "[Server WARNING] There is no punctuation override in config");
176 g_default_punctuation_override = false;
178 g_default_punctuation_override = (bool)temp;
181 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent SUCCESS] Engine Agent Initialize");
186 int sttd_engine_agent_release()
188 if (false == g_agent_init) {
189 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
190 return STTD_ERROR_OPERATION_FAILED;
193 /* unload current engine */
194 sttd_engine_agent_unload_current_engine();
196 /* release engine list */
198 sttengine_s *data = NULL;
200 if (g_list_length(g_engine_list) > 0) {
201 /* Get a first item */
202 iter = g_list_first(g_engine_list);
204 while (NULL != iter) {
205 /* Get handle data from list */
208 iter = g_list_remove(iter, data);
214 /* release current engine data */
215 if( NULL != g_cur_engine.pefuncs )
216 free(g_cur_engine.pefuncs);
218 if( NULL != g_cur_engine.pdfuncs )
219 free(g_cur_engine.pdfuncs);
224 g_agent_init = false;
226 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent SUCCESS] Engine Agent release");
231 int sttd_engine_agent_initialize_current_engine()
233 /* check agent init */
234 if (false == g_agent_init ) {
235 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
236 return STTD_ERROR_OPERATION_FAILED;
239 /* update engine list */
240 if (0 != __internal_update_engine_list()) {
241 SLOG(LOG_ERROR, TAG_STTD, "[engine agent] sttd_engine_agent_init : __internal_update_engine_list : no engine error");
242 return STTD_ERROR_ENGINE_NOT_FOUND;
245 /* get current engine from config */
246 char* cur_engine_uuid = NULL;
247 bool is_get_engineid_from_config = false;
249 if (0 != sttd_config_get_default_engine(&cur_engine_uuid)) {
251 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] There is not current engine from config");
253 /* not set current engine */
254 /* set system default engine */
256 if (0 < g_list_length(g_engine_list)) {
257 iter = g_list_first(g_engine_list);
259 SLOG(LOG_ERROR, TAG_STTD, "[engine agent ERROR] sttd_engine_agent_initialize_current_engine() : no engine error");
263 sttengine_info_s *data = NULL;
266 cur_engine_uuid = g_strdup(data->engine_uuid);
268 is_get_engineid_from_config = false;
270 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] current engine from config : %s", cur_engine_uuid);
272 is_get_engineid_from_config = true;
275 /* check whether cur engine uuid is valid or not. */
276 if (0 != __internal_check_engine_id(cur_engine_uuid)) {
277 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] It is not valid engine id and find other engine id");
280 if (0 < g_list_length(g_engine_list)) {
281 iter = g_list_first(g_engine_list);
283 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] sttd_engine_agent_initialize_current_engine() : no engine error");
287 if (NULL != cur_engine_uuid)
288 free(cur_engine_uuid);
290 sttengine_info_s *data = NULL;
293 cur_engine_uuid = g_strdup(data->engine_uuid);
295 is_get_engineid_from_config = false;
298 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Current Engine Id : %s", cur_engine_uuid);
300 /* set current engine */
301 if (0 != __internal_set_current_engine(cur_engine_uuid)) {
302 SLOG(LOG_ERROR, TAG_STTD, "[engine agent ERROR] __internal_set_current_engine : no engine error");
304 if( cur_engine_uuid != NULL)
305 free(cur_engine_uuid);
307 return STTD_ERROR_ENGINE_NOT_FOUND;
310 if (false == is_get_engineid_from_config) {
311 if (0 != sttd_config_set_default_engine(cur_engine_uuid))
312 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set default engine ");
315 if( cur_engine_uuid != NULL )
316 free(cur_engine_uuid);
321 int __internal_check_engine_id(const char* engine_uuid)
323 if (NULL == engine_uuid) {
324 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
325 return STTD_ERROR_INVALID_PARAMETER;
329 sttengine_s *data = NULL;
331 if (0 < g_list_length(g_engine_list)) {
333 iter = g_list_first(g_engine_list);
335 while (NULL != iter) {
338 if (0 == strncmp(engine_uuid, data->engine_uuid, strlen(data->engine_uuid))) {
342 iter = g_list_next(iter);
349 void __engine_info_cb(const char* engine_uuid, const char* engine_name, const char* setting_ug_name,
350 bool use_network, void* user_data)
352 sttengine_info_s* temp = (sttengine_info_s*)user_data;
354 temp->engine_uuid = g_strdup(engine_uuid);
355 temp->engine_name = g_strdup(engine_name);
356 temp->setting_ug_path = g_strdup(setting_ug_name);
357 temp->use_network = use_network;
361 int __internal_get_engine_info(const char* filepath, sttengine_info_s** info)
363 if (NULL == filepath || NULL == info) {
364 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
365 return STTD_ERROR_INVALID_PARAMETER;
372 handle = dlopen (filepath, RTLD_LAZY);
375 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Invalid engine : %s", filepath);
379 /* link engine to daemon */
380 dlsym(handle, "sttp_load_engine");
381 if ((error = dlerror()) != NULL) {
382 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Invalid engine. Fail to open sttp_load_engine : %s", error);
387 dlsym(handle, "sttp_unload_engine");
388 if ((error = dlerror()) != NULL) {
389 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Invalid engine. Fail to open sttp_unload_engine : %s", error);
394 int (*get_engine_info)(sttpe_engine_info_cb callback, void* user_data);
396 get_engine_info = (int (*)(sttpe_engine_info_cb, void*))dlsym(handle, "sttp_get_engine_info");
397 if ((error = dlerror()) != NULL || NULL == get_engine_info) {
398 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] Invalid engine. Fail to open sttp_get_engine_info : %s", error);
403 sttengine_info_s* temp;
404 temp = (sttengine_info_s*)g_malloc0( sizeof(sttengine_info_s) );
406 /* get engine info */
407 if (0 != get_engine_info(__engine_info_cb, (void*)temp)) {
408 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get engine info from engine");
417 temp->engine_path = g_strdup(filepath);
419 SLOG(LOG_DEBUG, TAG_STTD, "----- Valid Engine");
420 SLOG(LOG_DEBUG, TAG_STTD, "Engine uuid : %s", temp->engine_uuid);
421 SLOG(LOG_DEBUG, TAG_STTD, "Engine name : %s", temp->engine_name);
422 SLOG(LOG_DEBUG, TAG_STTD, "Setting ug path : %s", temp->setting_ug_path);
423 SLOG(LOG_DEBUG, TAG_STTD, "Engine path : %s", temp->engine_path);
424 SLOG(LOG_DEBUG, TAG_STTD, "Use network : %s", temp->use_network ? "true":"false");
425 SLOG(LOG_DEBUG, TAG_STTD, "-----");
426 SLOG(LOG_DEBUG, TAG_STTD, " ");
433 int __internal_update_engine_list()
435 /* relsease engine list */
437 sttengine_info_s *data = NULL;
439 if (0 < g_list_length(g_engine_list)) {
440 /* Get a first item */
441 iter = g_list_first(g_engine_list);
443 while (NULL != iter) {
444 /* Get handle data from list */
448 if (NULL != data->engine_uuid) free(data->engine_uuid);
449 if (NULL != data->engine_path) free(data->engine_path);
450 if (NULL != data->engine_name) free(data->engine_name);
451 if (NULL != data->setting_ug_path) free(data->setting_ug_path);
456 g_engine_list = g_list_remove_link(g_engine_list, iter);
457 iter = g_list_first(g_engine_list);
461 /* Get file name from default engine directory */
465 dp = opendir(ENGINE_DIRECTORY_DEFAULT);
467 while (NULL != (dirp = readdir(dp))) {
468 sttengine_info_s* info;
472 filesize = strlen(ENGINE_DIRECTORY_DEFAULT) + strlen(dirp->d_name) + 5;
473 filepath = (char*) g_malloc0(sizeof(char) * filesize);
475 if (NULL != filepath) {
476 strncpy(filepath, ENGINE_DIRECTORY_DEFAULT, strlen(ENGINE_DIRECTORY_DEFAULT) );
477 strncat(filepath, "/", strlen("/") );
478 strncat(filepath, dirp->d_name, strlen(dirp->d_name) );
480 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Memory not enough!!" );
484 /* get its info and update engine list */
485 if (0 == __internal_get_engine_info(filepath, &info)) {
486 /* add engine info to g_engine_list */
487 g_engine_list = g_list_append(g_engine_list, info);
490 if (NULL != filepath)
496 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] Fail to open default directory");
499 /* Get file name from downloadable engine directory */
500 dp = opendir(ENGINE_DIRECTORY_DOWNLOAD);
502 while (NULL != (dirp = readdir(dp))) {
503 sttengine_info_s* info;
507 filesize = strlen(ENGINE_DIRECTORY_DOWNLOAD) + strlen(dirp->d_name) + 5;
508 filepath = (char*) g_malloc0(sizeof(char) * filesize);
510 if (NULL != filepath) {
511 strncpy(filepath, ENGINE_DIRECTORY_DOWNLOAD, strlen(ENGINE_DIRECTORY_DOWNLOAD) );
512 strncat(filepath, "/", strlen("/") );
513 strncat(filepath, dirp->d_name, strlen(dirp->d_name) );
515 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Memory not enough!!" );
519 /* get its info and update engine list */
520 if (0 == __internal_get_engine_info(filepath, &info)) {
521 /* add engine info to g_engine_list */
522 g_engine_list = g_list_append(g_engine_list, info);
525 if (NULL != filepath)
531 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] Fail to open downloadable directory");
534 if (0 >= g_list_length(g_engine_list)) {
535 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] No Engine");
536 return STTD_ERROR_ENGINE_NOT_FOUND;
544 int __internal_set_current_engine(const char* engine_uuid)
546 if (NULL == engine_uuid) {
547 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
548 return STTD_ERROR_INVALID_PARAMETER;
551 /* check whether engine id is valid or not.*/
553 sttengine_info_s *data = NULL;
556 if (g_list_length(g_engine_list) > 0) {
558 iter = g_list_first(g_engine_list);
560 while (NULL != iter) {
561 /*Get handle data from list*/
564 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] engine_uuid(%s) engine list->uuid(%s)", engine_uuid, data->engine_uuid);
566 if (0 == strncmp(data->engine_uuid, engine_uuid, strlen(engine_uuid))) {
572 iter = g_list_next(iter);
576 /* If current engine does not exist, return error */
578 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] __internal_set_current_engine : Cannot find engine id");
579 return STTD_ERROR_INVALID_PARAMETER;
581 if (NULL != g_cur_engine.engine_uuid) {
582 /*compare current engine uuid */
583 if (0 == strncmp(g_cur_engine.engine_uuid, data->engine_uuid, strlen(engine_uuid))) {
584 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent Check] stt engine has already been set");
590 /* set data from g_engine_list */
591 if (g_cur_engine.engine_uuid != NULL) free(g_cur_engine.engine_uuid);
592 if (g_cur_engine.engine_name != NULL) free(g_cur_engine.engine_name);
593 if (g_cur_engine.engine_path != NULL) free(g_cur_engine.engine_path);
595 g_cur_engine.engine_uuid = g_strdup(data->engine_uuid);
596 g_cur_engine.engine_name = g_strdup(data->engine_name);
597 g_cur_engine.engine_path = g_strdup(data->engine_path);
599 g_cur_engine.handle = NULL;
600 g_cur_engine.is_loaded = false;
601 g_cur_engine.is_set = true;
602 g_cur_engine.need_network = data->use_network;
604 g_cur_engine.profanity_filter = g_default_profanity_filter;
605 g_cur_engine.punctuation_override = g_default_punctuation_override;
606 g_cur_engine.silence_detection = g_default_silence_detected;
608 SLOG(LOG_DEBUG, TAG_STTD, "-----");
609 SLOG(LOG_DEBUG, TAG_STTD, " Current engine uuid : %s", g_cur_engine.engine_uuid);
610 SLOG(LOG_DEBUG, TAG_STTD, " Current engine name : %s", g_cur_engine.engine_name);
611 SLOG(LOG_DEBUG, TAG_STTD, " Current engine path : %s", g_cur_engine.engine_path);
612 SLOG(LOG_DEBUG, TAG_STTD, "-----");
617 int sttd_engine_agent_load_current_engine()
619 if (false == g_agent_init) {
620 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
621 return STTD_ERROR_OPERATION_FAILED;
624 if (false == g_cur_engine.is_set) {
625 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] sttd_engine_agent_load_current_engine : No Current Engine ");
629 /* check whether current engine is loaded or not */
630 if (true == g_cur_engine.is_loaded) {
631 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] sttd_engine_agent_load_current_engine : Engine has already been loaded ");
635 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Current engine path : %s", g_cur_engine.engine_path);
639 g_cur_engine.handle = dlopen(g_cur_engine.engine_path, RTLD_LAZY);
641 if (NULL != (error = dlerror()) || !g_cur_engine.handle) {
642 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get engine handle");
643 return STTD_ERROR_OPERATION_FAILED;
646 g_cur_engine.sttp_unload_engine = (int (*)())dlsym(g_cur_engine.handle, "sttp_unload_engine");
647 if (NULL != (error = dlerror()) || NULL == g_cur_engine.sttp_unload_engine) {
648 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to link daemon to sttp_unload_engine() : %s", error);
649 return STTD_ERROR_OPERATION_FAILED;
652 g_cur_engine.sttp_load_engine = (int (*)(sttpd_funcs_s*, sttpe_funcs_s*) )dlsym(g_cur_engine.handle, "sttp_load_engine");
653 if (NULL != (error = dlerror()) || NULL == g_cur_engine.sttp_load_engine) {
654 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to link daemon to sttp_load_engine() : %s", error);
655 return STTD_ERROR_OPERATION_FAILED;
659 g_cur_engine.pdfuncs->version = 1;
660 g_cur_engine.pdfuncs->size = sizeof(sttpd_funcs_s);
662 if (0 != g_cur_engine.sttp_load_engine(g_cur_engine.pdfuncs, g_cur_engine.pefuncs)) {
663 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail sttp_load_engine()");
664 return STTD_ERROR_OPERATION_FAILED;
667 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] engine info : version(%d), size(%d)",g_cur_engine.pefuncs->version, g_cur_engine.pefuncs->size);
669 /* engine error check */
670 if (g_cur_engine.pefuncs->size != sizeof(sttpe_funcs_s)) {
671 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] sttd_engine_agent_load_current_engine : engine is not valid");
672 return STTD_ERROR_OPERATION_FAILED;
675 /* initalize engine */
676 if (0 != g_cur_engine.pefuncs->initialize(__result_cb, __partial_result_cb, __detect_silence_cb)) {
677 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to initialize stt-engine");
678 return STTD_ERROR_OPERATION_FAILED;
681 /* set default setting */
684 if (NULL == g_cur_engine.pefuncs->set_profanity_filter) {
685 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] set_profanity_filter of engine is NULL!!");
686 return STTD_ERROR_OPERATION_FAILED;
689 /* check and set profanity filter */
690 ret = g_cur_engine.pefuncs->set_profanity_filter(g_cur_engine.profanity_filter);
692 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent] Not support profanity filter");
693 g_cur_engine.support_profanity_filter = false;
695 g_cur_engine.support_profanity_filter = true;
698 /* check and set punctuation */
699 if (NULL == g_cur_engine.pefuncs->set_punctuation) {
700 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] set_punctuation of engine is NULL!!");
701 return STTD_ERROR_OPERATION_FAILED;
704 ret = g_cur_engine.pefuncs->set_punctuation(g_cur_engine.punctuation_override);
706 SLOG(LOG_ERROR, TAG_STTD, "[Engine ERROR] Not support punctuation override");
707 g_cur_engine.support_punctuation_override = false;
709 g_cur_engine.support_punctuation_override = true;
712 /* check and set silence detection */
713 if (NULL == g_cur_engine.pefuncs->set_silence_detection) {
714 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] set_silence_detection of engine is NULL!!");
715 return STTD_ERROR_OPERATION_FAILED;
718 ret = g_cur_engine.pefuncs->set_silence_detection(g_cur_engine.silence_detection);
720 SLOG(LOG_ERROR, TAG_STTD, "[Engine ERROR] Not support silence detection");
721 g_cur_engine.support_silence_detection = false;
723 g_cur_engine.support_silence_detection = true;
726 /* select default language */
727 bool set_voice = false;
728 if (NULL != g_cur_engine.default_lang) {
729 if (NULL == g_cur_engine.pefuncs->is_valid_lang) {
730 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] set_default_lang of engine is NULL!!");
731 return STTD_ERROR_OPERATION_FAILED;
734 if (true == g_cur_engine.pefuncs->is_valid_lang(g_cur_engine.default_lang)) {
736 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent SUCCESS] Set origin default voice to current engine : lang(%s)", g_cur_engine.default_lang);
738 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] Fail set origin default language : lang(%s)", g_cur_engine.default_lang);
742 if (false == set_voice) {
743 if (NULL == g_cur_engine.pefuncs->foreach_langs) {
744 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] foreach_langs of engine is NULL!!");
745 return STTD_ERROR_OPERATION_FAILED;
748 /* get language list */
750 GList* lang_list = NULL;
752 ret = g_cur_engine.pefuncs->foreach_langs(__supported_language_cb, &lang_list);
754 if (0 == ret && 0 < g_list_length(lang_list)) {
756 iter = g_list_first(lang_list);
759 char* temp_lang = iter->data;
761 if (true != g_cur_engine.pefuncs->is_valid_lang(temp_lang)) {
762 SLOG(LOG_ERROR, TAG_STTD, "[Engine ERROR] Fail voice is NOT valid");
763 return STTD_ERROR_OPERATION_FAILED;
766 sttd_config_set_default_language(temp_lang);
768 g_cur_engine.default_lang = g_strdup(temp_lang);
770 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent SUCCESS] Select default voice : lang(%s)", temp_lang);
772 SLOG(LOG_ERROR, TAG_STTD, "[Engine ERROR] Fail to get language list : result(%d)\n", ret);
773 return STTD_ERROR_OPERATION_FAILED;
776 __free_language_list(lang_list);
778 SLOG(LOG_ERROR, TAG_STTD, "[Engine ERROR] Fail to get language list : result(%d)\n", ret);
779 return STTD_ERROR_OPERATION_FAILED;
784 g_cur_engine.is_loaded = true;
786 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent SUCCESS] The %s has been loaded !!!", g_cur_engine.engine_name);
791 int sttd_engine_agent_unload_current_engine()
793 if (false == g_agent_init) {
794 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized ");
795 return STTD_ERROR_OPERATION_FAILED;
798 if (false == g_cur_engine.is_set) {
799 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] sttd_engine_agent_unload_current_engine : No Current Engine ");
803 if (false == g_cur_engine.is_loaded) {
804 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] Current engine has already been unloaded ");
808 /* shutdown engine */
809 if (NULL == g_cur_engine.pefuncs->deinitialize) {
810 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] shutdown of engine is NULL!!");
812 g_cur_engine.pefuncs->deinitialize();
816 if (0 != g_cur_engine.sttp_unload_engine()) {
817 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to unload engine");
820 dlclose(g_cur_engine.handle);
822 /* reset current engine data */
823 g_cur_engine.handle = NULL;
824 g_cur_engine.is_loaded = false;
829 bool sttd_engine_agent_need_network()
831 if (false == g_agent_init) {
832 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized" );
833 return STTD_ERROR_OPERATION_FAILED;
836 if (false == g_cur_engine.is_loaded) {
837 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
838 return STTD_ERROR_OPERATION_FAILED;
841 return g_cur_engine.need_network;
844 int sttd_engine_get_option_supported(bool* silence, bool* profanity, bool* punctuation)
846 if (false == g_agent_init) {
847 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized" );
848 return STTD_ERROR_OPERATION_FAILED;
851 if (false == g_cur_engine.is_loaded) {
852 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
853 return STTD_ERROR_OPERATION_FAILED;
856 if (NULL == silence || NULL == profanity || NULL == punctuation) {
857 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
858 return STTD_ERROR_INVALID_PARAMETER;
861 *silence = g_cur_engine.support_silence_detection;
862 *profanity = g_cur_engine.support_profanity_filter;
863 *punctuation = g_cur_engine.support_punctuation_override;
869 * STT Engine Interfaces for client
872 int __set_option(int profanity, int punctuation, int silence)
874 if (2 == profanity) {
875 /* Default selection */
876 if (g_default_profanity_filter != g_cur_engine.profanity_filter) {
877 if (NULL != g_cur_engine.pefuncs->set_profanity_filter) {
878 if (0 != g_cur_engine.pefuncs->set_profanity_filter(g_default_profanity_filter)) {
879 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set profanity filter");
880 return STTD_ERROR_OPERATION_FAILED;
882 g_cur_engine.profanity_filter = g_default_profanity_filter;
883 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Set profanity filter : %s", g_cur_engine.profanity_filter ? "true" : "false");
885 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] profanity_filter() of engine is NULL!!");
886 return STTD_ERROR_OPERATION_FAILED;
890 /* Client selection */
891 if (g_cur_engine.profanity_filter != profanity) {
892 if (NULL != g_cur_engine.pefuncs->set_profanity_filter) {
893 if (0 != g_cur_engine.pefuncs->set_profanity_filter((bool)profanity)) {
894 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set profanity filter");
895 return STTD_ERROR_OPERATION_FAILED;
898 g_cur_engine.profanity_filter = (bool)profanity;
899 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Set profanity filter : %s", g_cur_engine.profanity_filter ? "true" : "false");
901 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] profanity_filter() of engine is NULL!!");
902 return STTD_ERROR_OPERATION_FAILED;
907 if (2 == punctuation) {
908 /* Default selection */
909 if (g_default_punctuation_override != g_cur_engine.punctuation_override) {
910 if (NULL != g_cur_engine.pefuncs->set_punctuation) {
911 if (0 != g_cur_engine.pefuncs->set_punctuation(g_default_punctuation_override)) {
912 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set punctuation override");
913 return STTD_ERROR_OPERATION_FAILED;
915 g_cur_engine.punctuation_override = g_default_punctuation_override;
916 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Set punctuation override : %s", g_cur_engine.punctuation_override ? "true" : "false");
918 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] set_punctuation() of engine is NULL!!");
919 return STTD_ERROR_OPERATION_FAILED;
923 /* Client selection */
924 if (g_cur_engine.punctuation_override != punctuation) {
925 if (NULL != g_cur_engine.pefuncs->set_punctuation) {
926 if (0 != g_cur_engine.pefuncs->set_punctuation((bool)punctuation)) {
927 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set punctuation override");
928 return STTD_ERROR_OPERATION_FAILED;
931 g_cur_engine.punctuation_override = (bool)punctuation;
932 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Set punctuation override : %s", g_cur_engine.punctuation_override ? "true" : "false");
934 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] set_punctuation() of engine is NULL!!");
935 return STTD_ERROR_OPERATION_FAILED;
941 /* Default selection */
942 if (g_default_silence_detected != g_cur_engine.silence_detection) {
943 if (NULL != g_cur_engine.pefuncs->set_silence_detection) {
944 if (0 != g_cur_engine.pefuncs->set_silence_detection(g_default_silence_detected)) {
945 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set silence detection");
946 return STTD_ERROR_OPERATION_FAILED;
948 g_cur_engine.silence_detection = g_default_silence_detected;
949 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Set silence detection : %s", g_cur_engine.silence_detection ? "true" : "false");
951 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] set_silence() of engine is NULL!!");
952 return STTD_ERROR_OPERATION_FAILED;
956 /* Client selection */
957 if (g_cur_engine.silence_detection != silence) {
958 if (NULL != g_cur_engine.pefuncs->set_silence_detection) {
959 if (0 != g_cur_engine.pefuncs->set_silence_detection((bool)silence)) {
960 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set silence detection");
961 return STTD_ERROR_OPERATION_FAILED;
964 g_cur_engine.silence_detection = (bool)silence;
965 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Set silence detection : %s", g_cur_engine.silence_detection ? "true" : "false");
967 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] set_silence() of engine is NULL!!");
968 return STTD_ERROR_OPERATION_FAILED;
976 int sttd_engine_recognize_start(const char* lang, const char* recognition_type,
977 int profanity, int punctuation, int silence, void* user_param)
979 if (false == g_agent_init) {
980 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
981 return STTD_ERROR_OPERATION_FAILED;
984 if (false == g_cur_engine.is_loaded) {
985 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
986 return STTD_ERROR_OPERATION_FAILED;
989 if (NULL == lang || NULL == recognition_type) {
990 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
991 return STTD_ERROR_INVALID_PARAMETER;
994 if (0 != __set_option(profanity, punctuation, g_default_silence_detected)) {
995 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set options");
996 return STTD_ERROR_OPERATION_FAILED;
999 if (NULL == g_cur_engine.pefuncs->start) {
1000 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] start() of engine is NULL!!");
1001 return STTD_ERROR_OPERATION_FAILED;
1005 if (0 == strncmp(lang, "default", strlen("default"))) {
1006 temp = strdup(g_cur_engine.default_lang);
1008 temp = strdup(lang);
1011 int ret = g_cur_engine.pefuncs->start(temp, recognition_type, user_param);
1015 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] sttd_engine_recognize_start : recognition start error(%d)", ret);
1016 return STTD_ERROR_OPERATION_FAILED;
1019 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent SUCCESS] sttd_engine_recognize_start");
1024 int sttd_engine_recognize_audio(const void* data, unsigned int length)
1026 if (false == g_agent_init) {
1027 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1028 return STTD_ERROR_OPERATION_FAILED;
1031 if (false == g_cur_engine.is_loaded) {
1032 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1033 return STTD_ERROR_OPERATION_FAILED;
1037 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
1038 return STTD_ERROR_INVALID_PARAMETER;
1041 if (NULL == g_cur_engine.pefuncs->set_recording) {
1042 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The function of engine is NULL!!");
1043 return STTD_ERROR_OPERATION_FAILED;
1046 int ret = g_cur_engine.pefuncs->set_recording(data, length);
1048 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] set recording error(%d)", ret);
1055 int sttd_engine_recognize_stop()
1057 if (false == g_agent_init) {
1058 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1059 return STTD_ERROR_OPERATION_FAILED;
1062 if (false == g_cur_engine.is_loaded) {
1063 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1064 return STTD_ERROR_OPERATION_FAILED;
1067 if (NULL == g_cur_engine.pefuncs->stop) {
1068 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The function of engine is NULL!!");
1069 return STTD_ERROR_OPERATION_FAILED;
1072 int ret = g_cur_engine.pefuncs->stop();
1074 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] stop recognition error(%d)", ret);
1075 return STTD_ERROR_OPERATION_FAILED;
1081 int sttd_engine_recognize_cancel()
1083 if (false == g_agent_init) {
1084 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1085 return STTD_ERROR_OPERATION_FAILED;
1088 if (false == g_cur_engine.is_loaded) {
1089 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1090 return STTD_ERROR_OPERATION_FAILED;
1093 if (NULL == g_cur_engine.pefuncs->cancel) {
1094 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The function of engine is NULL!!");
1095 return STTD_ERROR_OPERATION_FAILED;
1098 int ret = g_cur_engine.pefuncs->cancel();
1100 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] cancel recognition error(%d)", ret);
1101 return STTD_ERROR_OPERATION_FAILED;
1107 int sttd_engine_get_audio_format(sttp_audio_type_e* types, int* rate, int* channels)
1109 if (false == g_agent_init) {
1110 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1111 return STTD_ERROR_OPERATION_FAILED;
1114 if (false == g_cur_engine.is_loaded) {
1115 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1116 return STTD_ERROR_OPERATION_FAILED;
1119 if (NULL == g_cur_engine.pefuncs->get_audio_format) {
1120 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The function of engine is NULL!!");
1121 return STTD_ERROR_OPERATION_FAILED;
1124 int ret = g_cur_engine.pefuncs->get_audio_format(types, rate, channels);
1126 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] get audio format error(%d)", ret);
1127 return STTD_ERROR_OPERATION_FAILED;
1133 int sttd_engine_recognize_start_file(const char* filepath, const char* lang, const char* recognition_type,
1134 int profanity, int punctuation, void* user_param)
1136 if (false == g_agent_init) {
1137 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1138 return STTD_ERROR_OPERATION_FAILED;
1141 if (false == g_cur_engine.is_loaded) {
1142 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1143 return STTD_ERROR_OPERATION_FAILED;
1146 if (NULL == filepath || NULL == lang || NULL == recognition_type) {
1147 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
1148 return STTD_ERROR_INVALID_PARAMETER;
1151 if (0 != __set_option(profanity, punctuation, g_default_silence_detected)) {
1152 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set options");
1153 return STTD_ERROR_OPERATION_FAILED;
1156 if (NULL == g_cur_engine.pefuncs->start_file_recognition) {
1157 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] start() of engine is NULL!!");
1158 return STTD_ERROR_OPERATION_FAILED;
1162 if (0 == strncmp(lang, "default", strlen("default"))) {
1163 temp = strdup(g_cur_engine.default_lang);
1165 temp = strdup(lang);
1168 int ret = g_cur_engine.pefuncs->start_file_recognition(filepath, temp, recognition_type, user_param);
1172 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to start file recognition(%d)", ret);
1176 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent SUCCESS] File recognition");
1182 * STT Engine Interfaces for client and setting
1184 bool __supported_language_cb(const char* language, void* user_data)
1186 GList** lang_list = (GList**)user_data;
1188 if (NULL == language || NULL == lang_list) {
1189 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Input parameter is NULL in callback!!!!");
1193 SLOG(LOG_DEBUG, TAG_STTD, "-- Language(%s)", language);
1195 char* temp_lang = g_strdup(language);
1197 *lang_list = g_list_append(*lang_list, temp_lang);
1202 int sttd_engine_supported_langs(GList** lang_list)
1204 if (false == g_agent_init) {
1205 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1206 return STTD_ERROR_OPERATION_FAILED;
1209 if (false == g_cur_engine.is_loaded) {
1210 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1211 return STTD_ERROR_OPERATION_FAILED;
1214 if (NULL == g_cur_engine.pefuncs->foreach_langs) {
1215 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The function of engine is NULL!!");
1216 return STTD_ERROR_OPERATION_FAILED;
1219 int ret = g_cur_engine.pefuncs->foreach_langs(__supported_language_cb, (void*)lang_list);
1221 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] get language list error(%d)", ret);
1222 return STTD_ERROR_OPERATION_FAILED;
1229 int sttd_engine_get_default_lang(char** lang)
1231 if (false == g_agent_init) {
1232 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1233 return STTD_ERROR_OPERATION_FAILED;
1236 if (false == g_cur_engine.is_loaded) {
1237 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1238 return STTD_ERROR_OPERATION_FAILED;
1242 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
1243 return STTD_ERROR_INVALID_PARAMETER;
1246 /* get default language */
1247 *lang = g_strdup(g_cur_engine.default_lang);
1252 int sttd_engine_is_partial_result_supported(bool* partial_result)
1254 if (false == g_agent_init) {
1255 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1256 return STTD_ERROR_OPERATION_FAILED;
1259 if (false == g_cur_engine.is_loaded) {
1260 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1261 return STTD_ERROR_OPERATION_FAILED;
1264 if (NULL == partial_result) {
1265 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
1266 return STTD_ERROR_INVALID_PARAMETER;
1269 if (NULL == g_cur_engine.pefuncs->support_partial_result) {
1270 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The function of engine is NULL!!");
1271 return STTD_ERROR_OPERATION_FAILED;
1274 *partial_result = g_cur_engine.pefuncs->support_partial_result();
1281 * STT Engine Interfaces for setting
1284 int sttd_engine_setting_get_engine_list(GList** engine_list)
1286 if (false == g_agent_init) {
1287 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1288 return STTD_ERROR_OPERATION_FAILED;
1291 if (false == g_cur_engine.is_loaded) {
1292 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1293 return STTD_ERROR_OPERATION_FAILED;
1296 /* update engine list */
1297 if (0 != __internal_update_engine_list()) {
1298 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] sttd_engine_setting_get_engine_list : __internal_update_engine_list()");
1303 sttengine_info_s *data = NULL;
1305 iter = g_list_first(g_engine_list);
1307 SLOG(LOG_DEBUG, TAG_STTD, "----- [Engine Agent] engine list -----");
1309 while (NULL != iter) {
1310 engine_s* temp_engine;
1312 temp_engine = (engine_s*)g_malloc0(sizeof(engine_s));
1316 temp_engine->engine_id = strdup(data->engine_uuid);
1317 temp_engine->engine_name = strdup(data->engine_name);
1318 temp_engine->ug_name = strdup(data->setting_ug_path);
1320 *engine_list = g_list_append(*engine_list, temp_engine);
1322 iter = g_list_next(iter);
1324 SLOG(LOG_DEBUG, TAG_STTD, " -- engine id(%s) engine name(%s) ug name(%s) \n",
1325 temp_engine->engine_id, temp_engine->engine_name, temp_engine->ug_name);
1328 SLOG(LOG_DEBUG, TAG_STTD, "--------------------------------------");
1333 int sttd_engine_setting_get_engine(char** engine_id)
1335 if (false == g_agent_init) {
1336 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized" );
1337 return STTD_ERROR_OPERATION_FAILED;
1340 if (false == g_cur_engine.is_loaded) {
1341 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1342 return STTD_ERROR_ENGINE_NOT_FOUND;
1345 *engine_id = strdup(g_cur_engine.engine_uuid);
1350 int sttd_engine_setting_set_engine(const char* engine_id)
1352 if (false == g_agent_init) {
1353 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1354 return STTD_ERROR_OPERATION_FAILED;
1357 if (NULL == engine_id) {
1358 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
1359 return STTD_ERROR_INVALID_PARAMETER;
1362 /* compare current engine and new engine. */
1363 if (NULL != g_cur_engine.engine_uuid) {
1364 if (0 == strncmp(g_cur_engine.engine_uuid, engine_id, strlen(g_cur_engine.engine_uuid))) {
1365 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] New engine is the same as current engine");
1370 char* tmp_uuid = NULL;
1371 tmp_uuid = g_strdup(g_cur_engine.engine_uuid);
1372 if (NULL == tmp_uuid) {
1373 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not enough memory!!");
1374 return STTD_ERROR_OUT_OF_MEMORY;
1378 if (0 != sttd_engine_agent_unload_current_engine())
1379 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to unload current engine");
1381 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent SUCCESS] unload current engine");
1383 /* change current engine */
1384 if (0 != __internal_set_current_engine(engine_id)) {
1385 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] __internal_set_current_engine : no engine error");
1387 /* roll back to old current engine. */
1388 __internal_set_current_engine(tmp_uuid);
1389 sttd_engine_agent_load_current_engine();
1391 if (NULL != tmp_uuid)
1394 return STTD_ERROR_OPERATION_FAILED;
1397 if (0 != sttd_engine_agent_load_current_engine()) {
1398 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to load new engine");
1400 if (NULL != tmp_uuid)
1403 return STTD_ERROR_OPERATION_FAILED;
1406 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent SUCCESS] sttd_engine_setting_set_engine() : Load new engine");
1408 if( tmp_uuid != NULL )
1411 /* set engine id to config */
1412 if (0 != sttd_config_set_default_engine(engine_id)) {
1413 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set engine id");
1419 int sttd_engine_setting_get_lang_list(char** engine_id, GList** lang_list)
1421 if (false == g_agent_init) {
1422 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1423 return STTD_ERROR_OPERATION_FAILED;
1426 if (false == g_cur_engine.is_loaded) {
1427 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1428 return STTD_ERROR_OPERATION_FAILED;
1431 if (NULL == lang_list || NULL == engine_id) {
1432 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
1433 return STTD_ERROR_INVALID_PARAMETER;
1436 /* get language list from engine */
1437 int ret = sttd_engine_supported_langs(lang_list);
1439 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail get lang list (%d)", ret);
1440 return STTD_ERROR_OPERATION_FAILED;
1443 *engine_id = strdup(g_cur_engine.engine_uuid);
1448 int sttd_engine_setting_get_default_lang(char** language)
1450 if (false == g_agent_init) {
1451 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1452 return STTD_ERROR_OPERATION_FAILED;
1455 if (false == g_cur_engine.is_loaded) {
1456 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1457 return STTD_ERROR_OPERATION_FAILED;
1460 if (NULL == language) {
1461 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
1462 return STTD_ERROR_INVALID_PARAMETER;
1465 if (NULL != g_cur_engine.default_lang) {
1466 *language = strdup(g_cur_engine.default_lang);
1468 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent SUCCESS] Get default lanaguae : language(%s)", *language);
1470 if (NULL == g_cur_engine.pefuncs->foreach_langs) {
1471 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] foreach_langs of engine is NULL!!");
1472 return STTD_ERROR_OPERATION_FAILED;
1475 /* get language list */
1477 GList* lang_list = NULL;
1479 ret = g_cur_engine.pefuncs->foreach_langs(__supported_language_cb, &lang_list);
1481 if (0 == ret && 0 < g_list_length(lang_list)) {
1483 iter = g_list_first(lang_list);
1486 char* temp_lang = iter->data;
1488 if (true != g_cur_engine.pefuncs->is_valid_lang(temp_lang)) {
1489 SLOG(LOG_ERROR, TAG_STTD, "[Engine ERROR] Fail voice is NOT valid");
1490 return STTD_ERROR_OPERATION_FAILED;
1493 sttd_config_set_default_language(temp_lang);
1495 g_cur_engine.default_lang = g_strdup(temp_lang);
1497 *language = strdup(g_cur_engine.default_lang);
1499 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent SUCCESS] Select default voice : lang(%s)", temp_lang);
1501 SLOG(LOG_ERROR, TAG_STTD, "[Engine ERROR] Fail to get language list : result(%d)\n", ret);
1502 return STTD_ERROR_OPERATION_FAILED;
1505 __free_language_list(lang_list);
1507 SLOG(LOG_ERROR, TAG_STTD, "[Engine ERROR] Fail to get language list : result(%d)\n", ret);
1508 return STTD_ERROR_OPERATION_FAILED;
1515 int sttd_engine_setting_set_default_lang(const char* language)
1517 if (false == g_agent_init) {
1518 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1519 return STTD_ERROR_OPERATION_FAILED;
1522 if (false == g_cur_engine.is_loaded) {
1523 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1524 return STTD_ERROR_OPERATION_FAILED;
1527 if (NULL == g_cur_engine.pefuncs->is_valid_lang) {
1528 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] get_voice_list() of engine is NULL!!");
1529 return STTD_ERROR_OPERATION_FAILED;
1533 if(false == g_cur_engine.pefuncs->is_valid_lang(language)) {
1534 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Language is NOT valid !!");
1535 return STTD_ERROR_INVALID_LANGUAGE;
1538 if (NULL != g_cur_engine.default_lang)
1539 g_free(g_cur_engine.default_lang);
1541 g_cur_engine.default_lang = strdup(language);
1543 ret = sttd_config_set_default_language(language);
1545 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set default lang (%d)", ret);
1551 int sttd_engine_setting_get_profanity_filter(bool* value)
1553 if (false == g_agent_init) {
1554 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1555 return STTD_ERROR_OPERATION_FAILED;
1558 if (false == g_cur_engine.is_loaded) {
1559 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1560 return STTD_ERROR_OPERATION_FAILED;
1563 if (NULL == value) {
1564 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
1565 return STTD_ERROR_INVALID_PARAMETER;
1568 *value = g_default_profanity_filter;
1573 int sttd_engine_setting_set_profanity_filter(bool value)
1575 if (false == g_agent_init) {
1576 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1577 return STTD_ERROR_OPERATION_FAILED;
1580 if (false == g_cur_engine.is_loaded) {
1581 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1582 return STTD_ERROR_OPERATION_FAILED;
1585 if (NULL == g_cur_engine.pefuncs->set_profanity_filter) {
1586 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The function of engine is NULL!!");
1587 return STTD_ERROR_OPERATION_FAILED;
1590 int ret = g_cur_engine.pefuncs->set_profanity_filter(value);
1592 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail set profanity filter : result(%d)", ret);
1593 return STTD_ERROR_OPERATION_FAILED;
1596 g_default_profanity_filter = value;
1598 ret = sttd_config_set_default_profanity_filter((int)value);
1600 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set default lang (%d)", ret);
1606 int sttd_engine_setting_get_punctuation_override(bool* value)
1608 if (false == g_agent_init) {
1609 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1610 return STTD_ERROR_OPERATION_FAILED;
1613 if (false == g_cur_engine.is_loaded) {
1614 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1615 return STTD_ERROR_OPERATION_FAILED;
1618 if (NULL == value) {
1619 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
1620 return STTD_ERROR_INVALID_PARAMETER;
1623 *value = g_default_punctuation_override;
1628 int sttd_engine_setting_set_punctuation_override(bool value)
1630 if (false == g_agent_init) {
1631 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1632 return STTD_ERROR_OPERATION_FAILED;
1635 if (false == g_cur_engine.is_loaded) {
1636 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1637 return STTD_ERROR_OPERATION_FAILED;
1640 if (NULL == g_cur_engine.pefuncs->set_punctuation) {
1641 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The function of engine is NULL!!");
1642 return STTD_ERROR_OPERATION_FAILED;
1645 int ret = g_cur_engine.pefuncs->set_punctuation(value);
1647 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail set punctuation override : result(%d)", ret);
1648 return STTD_ERROR_OPERATION_FAILED;
1650 g_default_punctuation_override = value;
1652 ret = sttd_config_set_default_punctuation_override((int)value);
1654 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set punctuation override (%d)", ret);
1660 int sttd_engine_setting_get_silence_detection(bool* value)
1662 if (false == g_agent_init) {
1663 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1664 return STTD_ERROR_OPERATION_FAILED;
1667 if (false == g_cur_engine.is_loaded) {
1668 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1669 return STTD_ERROR_OPERATION_FAILED;
1672 if (NULL == value) {
1673 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
1674 return STTD_ERROR_INVALID_PARAMETER;
1677 *value = g_default_silence_detected;
1682 int sttd_engine_setting_set_silence_detection(bool value)
1684 if (false == g_agent_init) {
1685 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1686 return STTD_ERROR_OPERATION_FAILED;
1689 if (false == g_cur_engine.is_loaded) {
1690 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1691 return STTD_ERROR_OPERATION_FAILED;
1694 int ret = g_cur_engine.pefuncs->set_silence_detection(value);
1696 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail set silence detection : result(%d)", ret);
1697 return STTD_ERROR_OPERATION_FAILED;
1700 g_default_silence_detected = value;
1702 ret = sttd_config_set_default_silence_detection((int)value);
1704 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set silence detection (%d)", ret);
1710 bool __engine_setting_cb(const char* key, const char* value, void* user_data)
1712 GList** engine_setting_list = (GList**)user_data;
1714 if (NULL == engine_setting_list || NULL == key || NULL == value) {
1715 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Input parameter is NULL in engine setting callback!!!!");
1719 engine_setting_s* temp = g_malloc0(sizeof(engine_setting_s));
1720 temp->key = g_strdup(key);
1721 temp->value = g_strdup(value);
1723 *engine_setting_list = g_list_append(*engine_setting_list, temp);
1728 int sttd_engine_setting_get_engine_setting_info(char** engine_id, GList** setting_list)
1730 if (false == g_agent_init) {
1731 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1732 return STTD_ERROR_OPERATION_FAILED;
1735 if (false == g_cur_engine.is_loaded) {
1736 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1737 return STTD_ERROR_OPERATION_FAILED;
1740 if (NULL == setting_list) {
1741 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Input parameter is NULL");
1742 return STTD_ERROR_INVALID_PARAMETER;
1745 if (NULL == g_cur_engine.pefuncs->foreach_engine_settings) {
1746 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] foreach_engine_settings() of engine is NULL!!");
1747 return STTD_ERROR_OPERATION_FAILED;
1750 /* get setting info and move setting info to input parameter */
1753 result = g_cur_engine.pefuncs->foreach_engine_settings(__engine_setting_cb, setting_list);
1755 if (0 == result && 0 < g_list_length(*setting_list)) {
1756 *engine_id = strdup(g_cur_engine.engine_uuid);
1758 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] fail to get setting info : result(%d)\n", result);
1759 result = STTD_ERROR_OPERATION_FAILED;
1765 int sttd_engine_setting_set_engine_setting(const char* key, const char* value)
1767 if (false == g_agent_init) {
1768 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
1769 return STTD_ERROR_OPERATION_FAILED;
1772 if (false == g_cur_engine.is_loaded) {
1773 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
1774 return STTD_ERROR_OPERATION_FAILED;
1777 if (NULL == key || NULL == value) {
1778 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
1779 return STTD_ERROR_INVALID_PARAMETER;
1782 if (NULL == g_cur_engine.pefuncs->set_engine_setting) {
1783 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] set_engine_setting() of engine is NULL!!");
1784 return STTD_ERROR_OPERATION_FAILED;
1787 /* get setting info and move setting info to input parameter */
1788 int ret = g_cur_engine.pefuncs->set_engine_setting(key, value);
1790 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail set setting info (%d) ", ret);
1791 return STTD_ERROR_OPERATION_FAILED;
1798 * STT Engine Callback Functions ` *
1801 void __result_cb(sttp_result_event_e event, const char* type,
1802 const char** data, int data_count, const char* msg, void *user_data)
1804 if (false == g_agent_init) {
1805 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Result Callback : Not Initialized");
1809 if (false == g_cur_engine.is_loaded) {
1810 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Result Callback : Not loaded engine");
1814 return g_result_cb(event, type, data, data_count, msg, user_data);
1817 void __partial_result_cb(sttp_result_event_e event, const char* data, void *user_data)
1819 if (false == g_agent_init) {
1820 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Partial Result Callback : Not Initialized");
1824 if (false == g_cur_engine.is_loaded) {
1825 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Partial Result Callback : Not loaded engine");
1829 return g_partial_result_cb(event, data, user_data);
1832 void __detect_silence_cb(void* user_data)
1834 if (false == g_agent_init) {
1835 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Silence Callback : Not Initialized");
1839 if (false == g_cur_engine.is_loaded) {
1840 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Silence Callback : Not loaded engine");
1844 if (true == g_cur_engine.silence_detection) {
1845 g_silence_cb(user_data);
1847 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Silence detection callback is blocked because option value is false.");
1851 void __free_language_list(GList* lang_list)
1856 /* if list have item */
1857 if (g_list_length(lang_list) > 0) {
1858 /* Get a first item */
1859 iter = g_list_first(lang_list);
1861 while (NULL != iter) {
1867 lang_list = g_list_remove_link(lang_list, iter);
1869 iter = g_list_first(lang_list);
1874 /* A function forging */
1875 int __log_enginelist()
1878 sttengine_info_s *data = NULL;
1880 if (0 < g_list_length(g_engine_list)) {
1882 /* Get a first item */
1883 iter = g_list_first(g_engine_list);
1885 SLOG(LOG_DEBUG, TAG_STTD, "--------------- engine list -------------------");
1888 while (NULL != iter) {
1889 /* Get handle data from list */
1892 SLOG(LOG_DEBUG, TAG_STTD, "[%dth]", i);
1893 SLOG(LOG_DEBUG, TAG_STTD, " engine uuid : %s", data->engine_uuid);
1894 SLOG(LOG_DEBUG, TAG_STTD, " engine name : %s", data->engine_name);
1895 SLOG(LOG_DEBUG, TAG_STTD, " engine path : %s", data->engine_path);
1896 SLOG(LOG_DEBUG, TAG_STTD, " setting ug path : %s", data->setting_ug_path);
1898 iter = g_list_next(iter);
1901 SLOG(LOG_DEBUG, TAG_STTD, "----------------------------------------------");
1903 SLOG(LOG_DEBUG, TAG_STTD, "-------------- engine list -------------------");
1904 SLOG(LOG_DEBUG, TAG_STTD, " No Engine in engine directory");
1905 SLOG(LOG_DEBUG, TAG_STTD, "----------------------------------------------");