优化tts长文本播放延迟问题
authorluozheng <1732036298@qq.com>
Wed, 16 Jul 2025 03:45:15 +0000 (11:45 +0800)
committerluozheng <1732036298@qq.com>
Wed, 16 Jul 2025 03:45:15 +0000 (11:45 +0800)
code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceModel.h
code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp
code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp

index 3892f87..19f8f05 100644 (file)
@@ -125,6 +125,9 @@ namespace OHOS
         void start_ai4g_tts_play_timer(uint32_t interval = 700);
         void stop_ai4g_tts_play_timer(void);
 
+        void start_update_ai_answer_timer(uint32_t interval = 200);
+        void stop_update_ai_answer_timer(void);
+
         void SetSelectAiModel(int index);
         int GetSelectAiModel(void);
         int GetAiModelTextId(void);
index 1bb3790..9b0ea4d 100644 (file)
@@ -806,7 +806,7 @@ namespace OHOS
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "强制发送文本: %s (长度: %zu)",
                               segment.c_str(), segment.length());
                 uapi_start_tts_single_txt((char *)segment.c_str());
-                LOS_Msleep(50);
+                LOS_Msleep(100);
 
                 // 发送后清空累积文本
                 accumulatedText.clear();
@@ -840,7 +840,7 @@ namespace OHOS
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "按标点发送分段: %s (长度: %zu)",
                           segment.c_str(), segment.length());
             uapi_start_tts_single_txt((char *)segment.c_str());
-            LOS_Msleep(50);
+            LOS_Msleep(100);
         }
 
         // 更新累积文本
@@ -870,7 +870,7 @@ namespace OHOS
             {
                 if (view_->GetAiVoiceScrollView(AIVOICE_RETURN_RESULT_TEXT_VIEWID) && view_->GetAiVoiceScrollView(AIVOICE_RETURN_RESULT_TEXT_VIEWID)->IsVisible())
                 {
-                    start_ai4g_tts_play_timer(); // 开启一个定时器,用于播放tts音频
+                    start_ai4g_tts_play_timer();                                  // 开启一个定时器,用于播放tts音频
                     if (!OHOS::AiVoiceModel::GetInstance().GetIsLimitDisplayed()) // 如果ai答案没有显示到极限了,就更新ai答案字符串
                     {
                         aiAnswerStr += str;
@@ -879,8 +879,9 @@ namespace OHOS
                         accumulatedText += str;
                         /* -------------------------------------------------------------------------- */
                         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "接受字的符串:%s", aiAnswerStr.c_str());
-                        SendMsgToUIService(UI_UPDATE_AI_ANSWER_STR, 0, nullptr, 0);
+                        // SendMsgToUIService(UI_UPDATE_AI_ANSWER_STR, 0, nullptr, 0);
                     }
+                    start_update_ai_answer_timer();
                 }
             }
         }
@@ -1593,7 +1594,7 @@ namespace OHOS
 
     void AiVoiceModel::start_ai4g_tts_play_timer(uint32_t interval)
     {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceModel::start_ai4g_tts_play_timer");
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceModel::start_ai4g_tts_play_timer");
         // AI4G_IS_START_TTS_PLAY_CNT = NUMBER_TEN;
         /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回 ------------------------- */
         if (g_ai4g_is_start_tts_play_Handle != nullptr)
@@ -1655,6 +1656,81 @@ namespace OHOS
         }
     }
 
+    static osTimerId_t g_start_ai_answer_update_Handle = nullptr;
+    static constexpr const int8_t NUMBER_THREE = 3;
+    static int8_t START_UPDATE_AIANSWER_CNT = NUMBER_THREE;
+    static void AI4G_START_AI_ANSWER_CallbackProc(int data)
+    {
+        START_UPDATE_AIANSWER_CNT--;
+        if (START_UPDATE_AIANSWER_CNT <= 0)
+        {
+            AiVoiceModel::GetInstance().stop_update_ai_answer_timer();
+        }
+        else
+        {
+            AiVoiceModel::GetInstance().UpdateAiAnswerStr();
+        }
+    }
+
+    static void AI4G_START_AI_ANSWER_Callback(int data)
+    {
+        AI4G_START_AI_ANSWER_CallbackProc(data);
+        // GraphicService::GetInstance()->PostGraphicEvent(std::bind(AI4G_START_AI_ANSWER_CallbackProc, data));
+    }
+
+    void AiVoiceModel::start_update_ai_answer_timer(uint32_t interval)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceModel::start_update_ai_answer_timer");
+        START_UPDATE_AIANSWER_CNT = NUMBER_THREE;
+        /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回 ------------------------- */
+        if (g_start_ai_answer_update_Handle != nullptr)
+        {
+            // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer already exists!!");
+            return;
+        }
+        /* --------------------------------- 2.创建定时器 -------------------------------- */
+        g_start_ai_answer_update_Handle = osTimerNew((osTimerFunc_t)AI4G_START_AI_ANSWER_Callback, osTimerPeriodic, nullptr, nullptr);
+        // 检查定时器创建是否成功
+        if (g_start_ai_answer_update_Handle == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!");
+            return;
+        }
+        /* ----------------------------- 3.将毫秒转换为系统时钟节拍数 ---------------------------- */
+        int tick = osMs2Tick(interval);
+        /* --------------------------------- 4.启动定时器 -------------------------------- */
+        osStatus_t ret = osTimerStart(g_start_ai_answer_update_Handle, tick);
+        /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为 nullptr -------------------- */
+        if (ret != osOK)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!", ret);
+            if (g_start_ai_answer_update_Handle != nullptr)
+            {
+                ret = osTimerDelete(g_start_ai_answer_update_Handle);
+            }
+            g_start_ai_answer_update_Handle = nullptr;
+            return;
+        }
+        return;
+    }
+
+    void AiVoiceModel::stop_update_ai_answer_timer(void)
+    {
+        if (g_start_ai_answer_update_Handle != nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "stop_update_ai_answer_timer");
+            osTimerStop(g_start_ai_answer_update_Handle);
+            // 删除定时器并置为 nullptr
+            osStatus_t ret = osTimerDelete(g_start_ai_answer_update_Handle);
+            if (ret != osOK)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!", ret);
+            }
+            g_start_ai_answer_update_Handle = nullptr;
+            START_UPDATE_AIANSWER_CNT = NUMBER_THREE;
+        }
+    }
+
     // 设置选择的ai模型
     void AiVoiceModel::SetSelectAiModel(int index)
     {
index 0f6e3a1..0da7079 100644 (file)
@@ -132,6 +132,7 @@ namespace OHOS
         model->stop_ai_isready_timer();
         model->stop_ai4g_connect_timer();
         model->stop_ai4g_tts_play_timer();
+        model->stop_update_ai_answer_timer();
         remove_4GAI_vote(); // 移除4g投票
         dinit_ai_task();
 
@@ -324,6 +325,7 @@ namespace OHOS
             AiVoiceModel::GetInstance().SetIsClickable(false);
             AiVoiceModel::GetInstance().SetIsLimitDisplayed(false);
             AiVoiceModel::GetInstance().stop_ai4g_tts_play_timer();
+            AiVoiceModel::GetInstance().stop_update_ai_answer_timer();
             break;
         default:
             // Handle other cases if needed