From: luozheng <1732036298@qq.com> Date: Wed, 16 Jul 2025 03:45:15 +0000 (+0800) Subject: 优化tts长文本播放延迟问题 X-Git-Url: http://git.snicker.com.cn/css/static/gitweb.css?a=commitdiff_plain;h=49f779540196204b996759f97d12c7bd5de76f97;p=mirrors%2FFD230.git 优化tts长文本播放延迟问题 --- diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceModel.h b/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceModel.h index 3892f87ce..19f8f05c6 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceModel.h @@ -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); diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp index 1bb3790c8..9b0ea4dc8 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp @@ -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) { diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp index 0f6e3a1c9..0da7079d6 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp @@ -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