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");
101 /* Set default voice */
102 g_default_language = strdup("en_US");
104 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Default language is %s", g_default_language);
108 if (0 != sttd_config_get_default_silence_detection(&temp)) {
109 SLOG(LOG_WARN, TAG_STTD, "[Server WARNING] There is no silence detection in config");
110 g_default_silence_detected = true;
112 g_default_silence_detected = (bool)temp;
120 int __engine_agent_clear_engine(sttengine_info_s *engine)
122 if (NULL != engine) {
123 if (NULL != engine->engine_uuid) free(engine->engine_uuid);
124 if (NULL != engine->engine_path) free(engine->engine_path);
125 if (NULL != engine->engine_name) free(engine->engine_name);
126 if (NULL != engine->engine_setting_path)free(engine->engine_setting_path);
127 if (NULL != engine->first_lang) free(engine->first_lang);
136 int sttd_engine_agent_release()
138 if (NULL != g_engine_info) {
139 if (g_engine_info->is_loaded) {
140 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Unload engine");
142 if (0 != stt_engine_deinitialize()) {
143 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to deinitialize");
146 if (0 != stt_engine_unload()) {
147 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to unload engine");
150 if (NULL != g_engine_info->engine_uuid) {
151 free(g_engine_info->engine_uuid);
152 g_engine_info->engine_uuid = NULL;
155 if (NULL != g_engine_info->engine_path) {
156 free(g_engine_info->engine_path);
157 g_engine_info->engine_path = NULL;
160 if (NULL != g_engine_info->engine_name) {
161 free(g_engine_info->engine_name);
162 g_engine_info->engine_name = NULL;
165 if (NULL != g_engine_info->engine_setting_path) {
166 free(g_engine_info->engine_setting_path);
167 g_engine_info->engine_setting_path = NULL;
170 if (NULL != g_engine_info->first_lang) {
171 free(g_engine_info->first_lang);
172 g_engine_info->first_lang = NULL;
175 g_engine_info->is_loaded = false;
178 __engine_agent_clear_engine(g_engine_info);
181 g_agent_init = false;
184 g_speech_status_cb = NULL;
186 g_result_time_cb = NULL;
191 static int __internal_get_engine_info(stte_request_callback_s *callback, sttengine_info_s** info)
193 sttengine_info_s* temp;
194 temp = (sttengine_info_s*)calloc(1, sizeof(sttengine_info_s));
196 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] fail to allocate memory");
197 return STTD_ERROR_OUT_OF_MEMORY;
200 if (NULL == callback) {
201 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid engine");
203 return STTD_ERROR_ENGINE_NOT_FOUND;
206 if (NULL == callback->get_info) {
207 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid engine");
209 return STTD_ERROR_ENGINE_NOT_FOUND;
212 if (0 != callback->get_info(&(temp->engine_uuid), &(temp->engine_name), &(temp->engine_setting_path), &(temp->use_network))) {
213 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get engine info");
215 return STTD_ERROR_ENGINE_NOT_FOUND;
218 /* todo - removed? */
219 temp->engine_path = strdup("empty");
220 temp->is_loaded = false;
222 SLOG(LOG_DEBUG, TAG_STTD, "----- Valid Engine");
223 SLOG(LOG_DEBUG, TAG_STTD, "Engine uuid : %s", (NULL == temp->engine_uuid) ? "NULL" : temp->engine_uuid);
224 SLOG(LOG_DEBUG, TAG_STTD, "Engine name : %s", (NULL == temp->engine_name) ? "NULL" : temp->engine_name);
225 SLOG(LOG_DEBUG, TAG_STTD, "Engine path : %s", (NULL == temp->engine_path) ? "NULL" : temp->engine_path);
226 SLOG(LOG_DEBUG, TAG_STTD, "Engine setting path : %s", (NULL == temp->engine_setting_path) ? "NULL" : temp->engine_setting_path);
227 SLOG(LOG_DEBUG, TAG_STTD, "Use network : %s", temp->use_network ? "true" : "false");
228 SLOG(LOG_DEBUG, TAG_STTD, "-----");
229 SLOG(LOG_DEBUG, TAG_STTD, " ");
233 return STTD_ERROR_NONE;
236 bool __is_engine(const char* filepath)
238 if (NULL == filepath) {
239 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] No filepath");
243 if (NULL != g_engine_info) {
244 if (!strcmp(g_engine_info->engine_path, filepath)) {
252 int __engine_agent_check_engine_unload()
254 /* Check the count of client to use this engine */
255 if (NULL == g_engine_info) {
256 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] No engine");
258 if (g_engine_info->is_loaded) {
260 #ifndef AUDIO_CREATE_ON_START
261 SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Destroy recorder");
262 if (0 != sttd_recorder_destroy())
263 SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder");
265 SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Unload engine");
266 if (0 != stt_engine_deinitialize())
267 SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to deinitialize engine");
269 if (0 != stt_engine_unload())
270 SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to unload engine");
272 g_engine_info->is_loaded = false;
279 int sttd_engine_agent_load_current_engine(stte_request_callback_s *callback)
281 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
283 /* Get current engine info */
284 sttengine_info_s* info;
285 int ret = __internal_get_engine_info(callback, &info);
287 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get engine info");
290 g_engine_info = info;
295 /* Set default engine */
296 char* cur_engine_uuid = NULL;
297 bool is_default_engine = false;
299 /* get current engine from config */
300 if (0 == sttd_config_get_default_engine(&cur_engine_uuid)) {
301 SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] current engine from config : %s", cur_engine_uuid);
302 if (NULL != g_engine_info->engine_uuid && NULL != cur_engine_uuid) {
303 if (!strcmp(g_engine_info->engine_uuid, cur_engine_uuid)) {
304 is_default_engine = true;
307 if (NULL != cur_engine_uuid) {
308 free(cur_engine_uuid);
309 cur_engine_uuid = NULL;
312 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] There is not current engine from config");
315 if (false == is_default_engine) {
316 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Current engine is not Default engine");
318 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Current engine is Default engine");
322 ret = stt_engine_load(g_engine_info->engine_path, callback);
324 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to load engine : path(%s)", g_engine_info->engine_path);
328 ret = stt_engine_initialize(false);
330 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to initialize engine : path(%s)", g_engine_info->engine_path);
334 ret = stt_engine_set_silence_detection(g_default_silence_detected);
336 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] Not support silence detection");
337 g_engine_info->support_silence_detection = false;
339 SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Silence detection : %s", g_default_silence_detected ? "true" : "false");
340 g_engine_info->support_silence_detection = true;
341 g_engine_info->silence_detection = g_default_silence_detected;
344 /* Set first language */
345 char* tmp_lang = NULL;
346 ret = stt_engine_get_first_language(&tmp_lang);
347 if (0 == ret && NULL != tmp_lang) {
348 g_engine_info->first_lang = strdup(tmp_lang);
351 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get first language from engine : %s", g_engine_info->engine_name);
355 #ifndef AUDIO_CREATE_ON_START
357 stte_audio_type_e atype;
361 ret = stt_engine_get_audio_format(&atype, &rate, &channels);
363 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get audio type : %d %s", g_engine_info->engine_name);
367 ret = sttd_recorder_create(atype, channels, rate);
369 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to create recorder : %s", g_engine_info->engine_name);
374 g_engine_info->is_loaded = true;
375 SECURE_SLOG(LOG_INFO, TAG_STTD, "[Engine Agent SUCCESS] The %s has been loaded !!!", g_engine_info->engine_name);
380 int sttd_engine_agent_unload_current_engine()
382 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
385 __engine_agent_check_engine_unload();
390 bool sttd_engine_agent_is_default_engine()
395 int sttd_engine_agent_get_engine_list(GSList** engine_list)
397 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
399 SLOG(LOG_DEBUG, TAG_STTD, "--------------------------------------");
404 static int __sttd_engine_agent_check_precondition()
406 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
407 RETVM_IF(NULL == g_engine_info, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] The engine is not valid");
408 RETVM_IF(false == g_engine_info->is_loaded, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not loaded engine");
409 return STTD_ERROR_NONE;
412 int sttd_engine_agent_get_current_engine(char** engine_uuid)
414 RETVM_IF(NULL == engine_uuid, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Invalid parameter");
415 int tmp = __sttd_engine_agent_check_precondition();
416 if (STTD_ERROR_NONE != tmp)
419 *engine_uuid = strdup(g_engine_info->engine_uuid);
424 bool sttd_engine_agent_need_network()
426 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
427 if (NULL != g_engine_info)
428 return g_engine_info->use_network;
433 int sttd_engine_agent_supported_langs(GSList** lang_list)
435 RETVM_IF(NULL == lang_list, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
436 int tmp = __sttd_engine_agent_check_precondition();
437 if (STTD_ERROR_NONE != tmp)
440 int ret = stt_engine_get_supported_langs(lang_list);
442 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] get language list error(%d)", ret);
448 int sttd_engine_agent_get_default_lang(char** lang)
450 RETVM_IF(NULL == lang, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
451 int tmp = __sttd_engine_agent_check_precondition();
452 if (STTD_ERROR_NONE != tmp)
455 /* get default language */
456 bool is_valid = false;
457 if (0 != stt_engine_is_valid_language(g_default_language, &is_valid)) {
458 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to check valid language");
459 return STTD_ERROR_OPERATION_FAILED;
462 if (true == is_valid) {
463 *lang = strdup(g_default_language);
465 *lang = strdup(g_engine_info->first_lang);
470 int sttd_engine_agent_set_private_data(const char* key, const char* data)
472 RETVM_IF(NULL == key || NULL == data, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
473 int tmp = __sttd_engine_agent_check_precondition();
474 if (STTD_ERROR_NONE != tmp)
477 /* set private data */
479 ret = stt_engine_set_private_data(key, data);
481 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set private data");
487 int sttd_engine_agent_get_private_data(const char* key, char** data)
489 RETVM_IF(NULL == key || NULL == data, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
490 int tmp = __sttd_engine_agent_check_precondition();
491 if (STTD_ERROR_NONE != tmp)
494 /* get default language */
496 ret = stt_engine_get_private_data(key, data);
498 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get private data");
504 int sttd_engine_agent_get_option_supported(bool* silence)
506 RETVM_IF(NULL == silence, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
507 int tmp = __sttd_engine_agent_check_precondition();
508 if (STTD_ERROR_NONE != tmp)
512 if (0 != stt_engine_support_silence(&temp)) {
513 SLOG(LOG_WARN, TAG_STTD, "[WARNING] Fail to get support silence");
516 *silence = g_engine_info->support_silence_detection;
517 if (temp != *silence) {
518 SLOG(LOG_WARN, TAG_STTD, "[WARNING] Metadata and Engine spec are different (engine:%d) (meta:%d)", temp, *silence);
524 int sttd_engine_agent_is_credential_needed(unsigned int uid, bool* credential)
526 RETVM_IF(NULL == credential, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
527 int tmp = __sttd_engine_agent_check_precondition();
528 if (STTD_ERROR_NONE != tmp)
534 ret = stt_engine_need_app_credential(&temp);
536 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get to support recognition type : %d", ret);
544 int sttd_engine_agent_is_recognition_type_supported(const char* type, bool* support)
546 RETVM_IF(NULL == type || NULL == support, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
547 int tmp = __sttd_engine_agent_check_precondition();
548 if (STTD_ERROR_NONE != tmp)
554 ret = stt_engine_support_recognition_type(type, &temp);
556 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get to support recognition type : %d", ret);
566 * STT Engine Interfaces for client
569 int __set_option(sttengine_info_s* engine, int silence)
574 /* Check silence detection */
575 if (engine->support_silence_detection) {
577 /* default option set */
578 // if (g_default_silence_detected != engine->silence_detection) {
579 if (0 != stt_engine_set_silence_detection(g_default_silence_detected)) {
580 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set silence detection : %s", g_default_silence_detected ? "true" : "false");
582 engine->silence_detection = g_default_silence_detected;
583 SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Set silence detection : %s", g_default_silence_detected ? "true" : "false");
587 if (silence != engine->silence_detection) {
588 if (0 != stt_engine_set_silence_detection(silence)) {
589 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set silence detection : %s", silence ? "true" : "false");
591 engine->silence_detection = silence;
592 SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Set silence detection : %s", silence ? "true" : "false");
601 int sttd_engine_agent_recognize_start_engine(unsigned int uid, const char* lang, const char* recognition_type,
602 int silence, const char* appid, const char* credential, void* user_param)
604 RETVM_IF(NULL == lang || NULL == recognition_type, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
605 int tmp = __sttd_engine_agent_check_precondition();
606 if (STTD_ERROR_NONE != tmp)
609 if (0 != __set_option(g_engine_info, silence)) {
610 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set options");
611 return STTD_ERROR_OPERATION_FAILED;
614 SLOG(LOG_INFO, TAG_STTD, "g_default_language %s", g_default_language);
618 if (0 == strncmp(lang, "default", strlen("default"))) {
619 bool is_valid = false;
620 ret = stt_engine_is_valid_language(g_default_language, &is_valid);
622 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to check valid language");
626 if (true == is_valid) {
627 temp = strdup(g_default_language);
628 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent DEBUG] Default language is %s", temp);
630 temp = strdup(g_engine_info->first_lang);
631 SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent DEBUG] Default language is engine first lang : %s", temp);
637 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Start engine");
639 ret = stt_engine_recognize_start(temp, recognition_type, appid, credential, user_param);
640 if (NULL != temp) free(temp);
642 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Recognition start error(%d)", ret);
646 #ifdef AUDIO_CREATE_ON_START
648 stte_audio_type_e atype;
652 ret = stt_engine_get_audio_format(&atype, &rate, &channels);
654 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get audio format : %s", g_engine_info->engine_name);
658 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Create recorder");
660 ret = sttd_recorder_create(atype, channels, rate);
662 SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to create format : %s", g_engine_info->engine_name);
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 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Start recorder");
690 ret = sttd_recorder_start(uid, appid);
692 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to start recorder : result(%d)", ret);
693 stt_engine_recognize_cancel();
694 sttd_recorder_stop();
701 int sttd_engine_agent_recognize_start_file(unsigned int uid, const char* filepath)
703 int tmp = __sttd_engine_agent_check_precondition();
704 if (STTD_ERROR_NONE != tmp)
707 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Start recorder");
710 ret = sttd_recorder_start_file(uid, filepath);
712 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to start recorder : result(%d)", ret);
713 stt_engine_recognize_cancel();
714 sttd_recorder_stop_file();
721 int sttd_engine_agent_set_recording_data(const void* data, unsigned int length)
723 RETVM_IF(NULL == data || 0 == length, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
724 int tmp = __sttd_engine_agent_check_precondition();
725 if (STTD_ERROR_NONE != tmp)
728 int ret = stt_engine_set_recording_data(data, length);
730 SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] set recording error(%d)", ret);
736 int sttd_engine_agent_recognize_stop_file()
738 int tmp = __sttd_engine_agent_check_precondition();
739 if (STTD_ERROR_NONE != tmp)
742 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Stop recorder");
744 ret = sttd_recorder_stop_file();
746 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to stop recorder : result(%d)", ret);
750 #ifdef AUDIO_CREATE_ON_START
751 SECURE_SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Destroy recorder");
752 if (0 != sttd_recorder_destroy())
753 SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder");
756 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent Success] Stop recorder");
760 int sttd_engine_agent_recognize_stop_recorder()
762 int tmp = __sttd_engine_agent_check_precondition();
763 if (STTD_ERROR_NONE != tmp)
766 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Stop recorder");
768 ret = sttd_recorder_stop();
770 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to stop recorder : result(%d)", ret);
774 #ifdef AUDIO_CREATE_ON_START
775 SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Destroy recorder");
776 if (0 != sttd_recorder_destroy())
777 SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder");
780 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent Success] Stop recorder");
784 int sttd_engine_agent_recognize_stop_engine()
786 int tmp = __sttd_engine_agent_check_precondition();
787 if (STTD_ERROR_NONE != tmp)
790 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Stop engine");
793 ret = stt_engine_recognize_stop();
795 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] stop recognition error(%d)", ret);
799 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent Success] Stop engine");
804 int sttd_engine_agent_recognize_cancel()
806 int tmp = __sttd_engine_agent_check_precondition();
807 if (STTD_ERROR_NONE != tmp)
810 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Cancel engine");
813 ret = stt_engine_recognize_cancel();
815 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] cancel recognition error(%d)", ret);
819 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Stop recorder");
821 ret = sttd_recorder_stop();
823 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to stop recorder : result(%d)", ret);
827 #ifdef AUDIO_CREATE_ON_START
828 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Destroy recorder");
829 if (0 != sttd_recorder_destroy())
830 SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder");
833 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent Success] Cancel recognition");
840 * STT Engine Interfaces for configure
843 int sttd_engine_agent_set_default_engine(const char* engine_uuid)
845 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
846 RETVM_IF(NULL == engine_uuid, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Invalid Parameter");
850 RETVM_IF(NULL == g_engine_info, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] The Default engine is not valid");
852 SECURE_SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Default engine uuid(%s)", g_engine_info->engine_uuid);
857 int sttd_engine_agent_set_default_language(const char* language)
859 RETVM_IF(NULL == language, STTD_ERROR_INVALID_PARAMETER, "[Engine Agent ERROR] Input parameter");
860 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
862 if (NULL != g_default_language)
863 free(g_default_language);
865 g_default_language = strdup(language);
870 int sttd_engine_agent_set_silence_detection(bool value)
872 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
874 g_default_silence_detected = value;
879 int sttd_engine_agent_check_app_agreed(const char* appid, bool* result)
881 int tmp = __sttd_engine_agent_check_precondition();
882 if (STTD_ERROR_NONE != tmp)
886 ret = stt_engine_check_app_agreed(appid, result);
888 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] cancel recognition error(%d)", ret);
893 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Get engine right : %s", *result ? "true" : "false");
897 static void __recorder_destroy_by_error_result(void *data)
899 SLOG(LOG_INFO, TAG_STTD, "[Engine Agent] Destroy recorder");
900 if (0 != sttd_recorder_destroy())
901 SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder");
906 int sttd_engine_agent_send_result(stte_result_event_e event, const char* type, const char** result, int result_count,
907 const char* msg, void* time_info, void *user_data)
910 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
912 SLOG(LOG_INFO, TAG_STTD, "[Server] === Result time callback ===");
914 if (NULL != time_info) {
915 /* Get the time info */
916 ret = stt_engine_foreach_result_time(time_info, __result_time_cb, NULL);
918 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get time info : %d", ret);
923 SLOG(LOG_INFO, TAG_STTD, "[Server] ============================");
925 RETVM_IF(NULL == g_result_cb, STTD_ERROR_OPERATION_FAILED, "[Server ERROR] Callback is not set.");
927 ret = g_result_cb(event, type, result, result_count, msg, user_data);
929 #ifdef AUDIO_CREATE_ON_START
930 if (event == STTE_RESULT_EVENT_ERROR) {
931 ecore_main_loop_thread_safe_call_async(__recorder_destroy_by_error_result, NULL);
938 int sttd_engine_agent_send_error(stte_error_e error, const char* msg)
940 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
943 unsigned int uid = stt_client_get_current_recognition();
945 int ret = sttdc_send_error_signal(uid, error, msg);
947 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send error info. (%d/%s)", ret, get_error_message(ret));
950 RETVM_IF(NULL == g_error_cb, STTD_ERROR_OPERATION_FAILED, "[Server ERROR] Callback is not set.");
952 return g_error_cb(error, msg);
955 int sttd_engine_agent_send_speech_status(stte_speech_status_e status, void* user_data)
957 RETVM_IF(false == g_agent_init, STTD_ERROR_OPERATION_FAILED, "[Engine Agent ERROR] Not Initialized");
958 RETVM_IF(NULL == g_speech_status_cb, STTD_ERROR_OPERATION_FAILED, "[Server ERROR] Callback is not set.");
960 return g_speech_status_cb(status, user_data);
963 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)
965 RETVM_IF(false == g_agent_init, false, "[Engine Agent ERROR] Not Initialized");
966 RETVM_IF(NULL == g_result_time_cb, false, "[Server ERROR] Callback is not set.");
968 return g_result_time_cb(index, event, text, start_time, end_time, user_data);
971 /* A function forging */
972 static int __log_enginelist()
974 if (NULL != g_engine_info) {
975 SLOG(LOG_DEBUG, TAG_STTD, "------------------ engine -----------------------");
976 SLOG(LOG_DEBUG, TAG_STTD, "engine uuid : %s", g_engine_info->engine_uuid);
977 SLOG(LOG_DEBUG, TAG_STTD, "engine name : %s", g_engine_info->engine_name);
978 SLOG(LOG_DEBUG, TAG_STTD, "engine path : %s", g_engine_info->engine_path);
979 SLOG(LOG_DEBUG, TAG_STTD, "use network : %s", g_engine_info->use_network ? "true" : "false");
980 SLOG(LOG_DEBUG, TAG_STTD, "is loaded : %s", g_engine_info->is_loaded ? "true" : "false");
981 if (NULL != g_engine_info->first_lang) {
982 SLOG(LOG_DEBUG, TAG_STTD, "default lang : %s", g_engine_info->first_lang);
984 SLOG(LOG_DEBUG, TAG_STTD, "-------------------------------------------------");
986 SLOG(LOG_DEBUG, TAG_STTD, "------------------ engine -----------------------");
987 SLOG(LOG_DEBUG, TAG_STTD, " No engine");
988 SLOG(LOG_DEBUG, TAG_STTD, "-------------------------------------------------");
994 int sttd_engine_agent_get_audio_type(char** audio_type)
996 int tmp = __sttd_engine_agent_check_precondition();
997 if (STTD_ERROR_NONE != tmp)
1000 SLOG(LOG_INFO, TAG_STTD, "[Server Info] Get audio type");
1002 int ret = stt_engine_get_audio_type(audio_type);
1003 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent] get audio type(%s). ret(%d)", *audio_type, ret);
1008 int sttd_engine_agent_set_audio_type(const char* audio_type)
1010 int tmp = __sttd_engine_agent_check_precondition();
1011 if (STTD_ERROR_NONE != tmp)
1014 SLOG(LOG_INFO, TAG_STTD, "[Server Info] Set audio type(%s)", audio_type);
1016 int ret = stt_engine_set_audio_type(audio_type);
1017 SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent] set audio type(%d)", ret);