Add internal api for file recognition
[platform/core/uifw/stt.git] / server / sttd_server.c
old mode 100755 (executable)
new mode 100644 (file)
index f364cf3..8fcee24
@@ -341,8 +341,8 @@ int __server_speech_status_callback(stte_speech_status_e status, void *user_para
                        return STTD_ERROR_OPERATION_FAILED;
                }
 
-               if (APP_STATE_RECORDING != state) {
-                       SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Current state is not recording");
+               if (APP_STATE_RECORDING != state && APP_STATE_PROCESSING != state) {
+                       SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Current state is not recording, state(%d), status(%d)", state, status);
                        return STTD_ERROR_INVALID_STATE;
                }
 
@@ -1448,3 +1448,172 @@ int sttd_server_cancel(int uid)
 
        return STTD_ERROR_NONE;
 }
+
+int sttd_server_start_file(int uid, const char* lang, const char* recognition_type, int silence, const char* appid, const char* credential,
+                                                       const char* filepath, stte_audio_type_e audio_type, int sample_rate)
+{
+       if (NULL == lang || NULL == recognition_type || NULL == filepath) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Input parameter is NULL");
+               return STTD_ERROR_INVALID_PARAMETER;
+       }
+
+       /* check if uid is valid */
+       app_state_e state;
+       if (0 != sttd_client_get_state(uid, &state)) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] uid is NOT valid ");
+               return STTD_ERROR_INVALID_PARAMETER;
+       }
+
+       /* check uid state */
+       if (APP_STATE_READY != state) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] sttd_server_start : current state is not ready");
+               return STTD_ERROR_INVALID_STATE;
+       }
+
+       int ret = 0;
+       if (false == stt_client_get_app_agreed(uid)) {
+               bool temp = false;
+               ret = sttd_engine_agent_check_app_agreed(appid, &temp);
+               if (0 != ret) {
+                       SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get engine available : %d", ret);
+                       return ret;
+               }
+
+               if (false == temp) {
+                       SLOG(LOG_ERROR, TAG_STTD, "[Server] App(%s) NOT confirmed that engine is available", appid);
+                       return STTD_ERROR_PERMISSION_DENIED;
+               }
+
+               stt_client_set_app_agreed(uid);
+       }
+
+       /* check if engine use network */
+       if (true == sttd_engine_agent_need_network()) {
+               if (false == stt_network_is_connected()) {
+                       SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Disconnect network. Current engine needs to network connection.");
+                       return STTD_ERROR_OUT_OF_NETWORK;
+               }
+       }
+
+       if (0 != stt_client_set_current_recognition(uid)) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Current STT is busy because of recording or processing");
+               return STTD_ERROR_RECORDER_BUSY;
+       }
+
+       /* engine start recognition */
+       SLOG(LOG_DEBUG, TAG_STTD, "[Server] start : uid(%d), lang(%s), recog_type(%s), appid(%s), file(%s), audio_type(%d), sample_rate(%d)", uid, lang, recognition_type, appid, filepath, audio_type, sample_rate);
+
+       /* 1. Set audio session */
+       ret = sttd_recorder_set_audio_session();
+       if (0 != ret) {
+               stt_client_unset_current_recognition();
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to set session : %d", ret);
+               return ret;
+       }
+
+       /* 2. Start engine to recognize */
+       ret = sttd_engine_agent_recognize_start_engine(uid, lang, recognition_type, silence, appid, credential, NULL);
+       if (0 != ret) {
+               stt_client_unset_current_recognition();
+               sttd_recorder_unset_audio_session();
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to start engine : result(%d)", ret);
+               return ret;
+       }
+
+       sttd_client_set_state(uid, APP_STATE_RECORDING);
+       sttdc_send_set_state(uid, APP_STATE_RECORDING);
+
+       /* 3. Start to send pcm from file to engine */
+       ret = sttd_engine_agent_recognize_start_file(uid, filepath);
+       if (0 != ret) {
+               stt_client_unset_current_recognition();
+               sttd_recorder_unset_audio_session();
+               sttd_engine_agent_recognize_cancel();
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to start file : result(%d)", ret);
+               return ret;
+       }
+
+       /* 4. Stop to send pcm from file  */
+       ret = sttd_engine_agent_recognize_stop_file();
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to stop recorder : result(%d)", ret);
+               stt_client_unset_current_recognition();
+               sttd_recorder_unset_audio_session();
+               sttd_engine_agent_recognize_cancel();
+               return ret;
+       }
+
+       /* 5. change & notify uid state */
+       sttd_client_set_state(uid, APP_STATE_PROCESSING);
+       sttdc_send_set_state(uid, APP_STATE_PROCESSING);
+
+       /* 6. Unset audio session */
+       ret = sttd_recorder_unset_audio_session();
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to unset session : %d", ret);
+               stt_client_unset_current_recognition();
+               return ret;
+       }
+
+       /* 7. Stop engine */
+       ret = sttd_engine_agent_recognize_stop_engine();
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to stop engine : result(%d)", ret);
+               stt_client_unset_current_recognition();
+               return ret;
+       }
+
+       return STTD_ERROR_NONE;
+}
+
+int sttd_server_cancel_file(int uid)
+{
+       /* check if uid is valid */
+       app_state_e state;
+       if (0 != sttd_client_get_state(uid, &state)) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] uid is NOT valid ");
+               return STTD_ERROR_INVALID_PARAMETER;
+       }
+
+       /* check uid state */
+       if (APP_STATE_READY == state) {
+               SLOG(LOG_WARN, TAG_STTD, "[Server WARNING] Current state is ready");
+               return STTD_ERROR_NONE;
+       }
+
+       stt_client_unset_current_recognition();
+
+       if (NULL != g_recording_timer) {
+               ecore_timer_del(g_recording_timer);
+               g_recording_timer = NULL;
+       }
+
+       if (NULL != g_processing_timer) {
+               ecore_timer_del(g_processing_timer);
+               g_processing_timer = NULL;
+       }
+
+       if (APP_STATE_RECORDING == state) {
+               /* Unset audio session */
+               int ret = sttd_recorder_unset_audio_session();
+               if (0 != ret) {
+                       SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to unset session : %d", ret);
+                       return ret;
+               }
+       }
+
+       /* change uid state */
+       sttd_client_set_state(uid, APP_STATE_READY);
+
+       /* cancel engine recognition */
+       int ret = sttd_engine_agent_recognize_cancel();
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to cancel : result(%d)", ret);
+               return ret;
+       }
+
+       /* Notify uid state change */
+       sttdc_send_set_state(uid, APP_STATE_READY);
+
+       return STTD_ERROR_NONE;
+}