From 4f3fc70e0e0fcfc614b8a8bd005df89713318d09 Mon Sep 17 00:00:00 2001 From: luozheng <1732036298@qq.com> Date: Thu, 22 May 2025 10:14:46 +0800 Subject: [PATCH] =?utf8?q?AI=20=E4=B9=9D=E5=A4=A9=E5=A4=A7=E6=A8=A1?= =?utf8?q?=E5=9E=8B=E4=BB=A3=E7=A0=81=E5=90=88=E5=B9=B6=EF=BC=8C=E5=BE=85?= =?utf8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../include/ui_resource_string.h | 31 ++-- .../aivoice/include/AiVoicePresenter.h | 2 +- .../nativeui/aivoice/include/AiVoiceView.h | 4 +- .../src/AiVoiceBluetoothFailedStartView.cpp | 36 ++++- .../nativeui/aivoice/src/AiVoiceModel.cpp | 46 ++++-- .../nativeui/aivoice/src/AiVoiceView.cpp | 39 +++-- .../aivoice/src/AivoiceConnectTimeoutView.cpp | 36 ++++- .../src/AivoiceMobileDataFailedStartView.cpp | 40 +++-- .../src/AivoiceReturnResultTextView.cpp | 37 +++-- .../res/AIVoice/aimodels/aimodels_lingxi.bin | Bin 0 -> 9624 bytes .../res/AIVoice/aimodels/aimodes_deepseek.bin | Bin 0 -> 9624 bytes .../sample/wrapper/audio_capture_wrapper.cpp | 151 +++++++++++++++++- .../sample/wrapper/audio_capture_wrapper.h | 2 + 13 files changed, 342 insertions(+), 82 deletions(-) create mode 100644 code/sdk/files/fd230/fs/user/res/AIVoice/aimodels/aimodels_lingxi.bin create mode 100644 code/sdk/files/fd230/fs/user/res/AIVoice/aimodels/aimodes_deepseek.bin diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativelauncher/include/ui_resource_string.h b/code/sdk/application/wearable/fd230/nativeapp/nativelauncher/include/ui_resource_string.h index 7127be443..58639fba8 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativelauncher/include/ui_resource_string.h +++ b/code/sdk/application/wearable/fd230/nativeapp/nativelauncher/include/ui_resource_string.h @@ -1,15 +1,15 @@ -/* -* Copyright (c) xxxxxxxx Technologies Co., Ltd. 2021-2021. All rights reserved. -* Description: language -* Author: Graphic develop team -* Create: 2021-07-06 -*/ - -#ifndef UI_RESOURCE_STRING_H -#define UI_RESOURCE_STRING_H -#include -namespace OHOS { -enum UIResourceTextId : uint16_t { +/* +* Copyright (c) xxxxxxxx Technologies Co., Ltd. 2021-2021. All rights reserved. +* Description: language +* Author: Graphic develop team +* Create: 2021-07-06 +*/ + +#ifndef UI_RESOURCE_STRING_H +#define UI_RESOURCE_STRING_H +#include +namespace OHOS { +enum UIResourceTextId : uint16_t { STR_EXERCISE_OUTDOORWALKING = 0, STR_EXERCISE_OUTDOORRUNNING = 1, STR_EXERCISE_OUTDOORBIKING = 2, @@ -652,10 +652,11 @@ enum UIResourceTextId : uint16_t { STR_RECORD_MAX = 639, STR_CLEAR_ALL_RECORDS = 640, STR_DEEPSEEK = 641, - STR_MAX_ID = 642, + STR_AIMODES_LINGXI = 642, + STR_MAX_ID = 643, }; // UIResourceTextId - -enum FontLanguageId : uint8_t { + +enum FontLanguageId : uint8_t { LANGUAGE_ID_AR, LANGUAGE_ID_AZ, LANGUAGE_ID_CS, diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/include/AiVoicePresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/include/AiVoicePresenter.h index ede8f78ba..2b162eae9 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/include/AiVoicePresenter.h +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/include/AiVoicePresenter.h @@ -32,7 +32,7 @@ namespace OHOS AIMODES_KIMI, /*KIMI*/ AIMODES_DOUBAO, /*豆包*/ AIMODES_TONGYI_QIANWEN, /*通义千问->DeepSeek*/ - AIMODES_IFLYTEK_SPARK, /*讯飞星火*/ + AIMODES_IFLYTEK_SPARK, /*讯飞星火->lingxi*/ AIMODES_CHATGPT, /*chatgpt*/ AIMODES_MAX_NUM, } aimodels; diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/include/AiVoiceView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/include/AiVoiceView.h index 99616406e..fc65f5595 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/include/AiVoiceView.h +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/include/AiVoiceView.h @@ -39,6 +39,7 @@ namespace OHOS static constexpr const char *AIMODEL_TONGYI_QIANWEN_PATH = "/user/res/AIVoice/aimodels/aimodes_tongyi_qianwen.bin"; /*通义千问*/ static constexpr const char *AIMODEL_IFLYTEK_SPARK_PATH = "/user/res/AIVoice/aimodels/aimodes_iflytek_spark.bin"; /*讯飞星火*/ static constexpr const char *AIMODEL_DEEPSEEK_PATH = "/user/res/AIVoice/aimodels/aimodes_deepseek.bin"; /*deepseek*/ + static constexpr const char *AIMODEL_LINGXI_PATH = "/user/res/AIVoice/aimodels/aimodels_lingxi.bin"; /*lingxi*/ /*组件ID*/ static constexpr const char *AIVOICE_START_CHAT_BUTTON_VIEW_ID = "aivoice_start_chat_button_view_id"; // 开始对话 @@ -69,7 +70,8 @@ namespace OHOS {STR_AIMODELS_DOUBAO, AIMODEL_DOUBAO_PATH}, // {STR_TONGYI_QIANWEN, AIMODEL_TONGYI_QIANWEN_PATH}, {STR_DEEPSEEK, AIMODEL_DEEPSEEK_PATH}, - {STR_IFLYTEK_SPARK, AIMODEL_IFLYTEK_SPARK_PATH}, + // {STR_IFLYTEK_SPARK, AIMODEL_IFLYTEK_SPARK_PATH}, + {STR_AIMODES_LINGXI, AIMODEL_LINGXI_PATH}, {STR_AIMODES_CHATGPT, AIMODEL_CHATGPT_ON_PATH}, }; diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AiVoiceBluetoothFailedStartView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AiVoiceBluetoothFailedStartView.cpp index 42f982951..37c2407ba 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AiVoiceBluetoothFailedStartView.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AiVoiceBluetoothFailedStartView.cpp @@ -11,6 +11,7 @@ #include "wearable_log.h" #include "ui_resource_string.h" #include +#include "ConfigModel.h" namespace OHOS { @@ -92,8 +93,19 @@ namespace OHOS //TOOD: 待优化 if(labelconfig.textId == STR_DEEPSEEK) { label->SetText("DeepSeek"); - } else + }else if(labelconfig.textId == STR_AIMODES_LINGXI) { + int language = ConfigModel::GetInstance()->GetLanguage(); + if (language == 0) // 如果当前系统为中文 + { + label->SetText("九天大模型"); + } + else + { + label->SetText("jiutian"); + } + } else{ label->SetTextId(labelconfig.textId); + } label->SetLineBreakMode(labelconfig.lineBreakMode); label->SetRollSpeed(23); label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); @@ -278,15 +290,23 @@ namespace OHOS { if (title) { - if(textId == STR_DEEPSEEK) - { + if(textId == STR_DEEPSEEK) { title->SetText("DeepSeek"); - } - else - { - title->SetTextId(textId); - title->ForceResetText(); + }else if(textId == STR_AIMODES_LINGXI) { + int language = ConfigModel::GetInstance()->GetLanguage(); + if (language == 0) // 如果当前系统为中文 + { + title->SetText("九天大模型"); + } + else + { + title->SetText("jiutian"); + } + } else{ + title->SetTextId(textId); } + + title->ForceResetText(); } } diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AiVoiceModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AiVoiceModel.cpp index 2da9b74f5..8bcb8ae7c 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AiVoiceModel.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AiVoiceModel.cpp @@ -179,7 +179,8 @@ namespace OHOS } // 获取当前正在使用的AI模型 - uint8_t AiVoiceModel::GetCurUsingAiModelType(void){ + uint8_t AiVoiceModel::GetCurUsingAiModelType(void) + { auto it = selectAiModelToTextId.find(GetSelectAiModel()); if (it != selectAiModelToTextId.end()) @@ -193,9 +194,7 @@ namespace OHOS void AiVoiceModel::CancelCurAIChat(void) { // cancel_AI_cur_chat(); //线程发送取消当前对话 - #ifdef SUPPORT_BLE_SERVICE cancel_AI_cur_chat_();// 直接发送取消当前对话 - #endif } int AiVoiceModel::GetAIResponseType(void) @@ -499,7 +498,7 @@ namespace OHOS if (!entryTextViewState) { #ifdef SUPPORT_BLE_SERVICE - //SendMsgToUIService(UI_AI_JUMP_TO_RESULT_VIEW, 0, nullptr, 0); + SendMsgToUIService(UI_AI_JUMP_TO_RESULT_VIEW, 0, nullptr, 0); #endif entryTextViewState = true; // 进入返回结果界面的标志 避免重复发消息 usleep(50000); // 延时等待创建完成,0.05秒 @@ -510,7 +509,7 @@ namespace OHOS WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "拼接的问题:%s",userQuestionStr.c_str()); /* -------------------------------------------------------------------------- */ #ifdef SUPPORT_BLE_SERVICE - //SendMsgToUIService(UI_UPDATE_USER_QUESTION_STR, 0, nullptr, 0); + SendMsgToUIService(UI_UPDATE_USER_QUESTION_STR, 0, nullptr, 0); #endif } @@ -526,7 +525,9 @@ namespace OHOS void AiVoiceModel::SetAiAnswerStrStr(std::string str) { aiAnswerStr += str; - //SendMsgToUIService(UI_UPDATE_AI_ANSWER_STR, 0, nullptr, 0); + #ifdef SUPPORT_BLE_SERVICE + SendMsgToUIService(UI_UPDATE_AI_ANSWER_STR, 0, nullptr, 0); + #endif } void AiVoiceModel::SetAiAnswerStrStr(std::string str, uint8_t type) @@ -538,7 +539,9 @@ namespace OHOS if (AIResponseType == AiVoiceModel::AI_RECORDING_PARSING_ERROR || AIResponseType == AiVoiceModel::AI_RESPONSE_ERROR || AIResponseType == AiVoiceModel::AI_BLE_ERROR) { - //SendMsgToUIService(UI_AI_JUMP_TO_RESPONDERR_VIEW, 0, (void *)errnote.c_str(), errnote.length()); + #ifdef SUPPORT_BLE_SERVICE + SendMsgToUIService(UI_AI_JUMP_TO_RESPONDERR_VIEW, 0, (void *)errnote.c_str(), errnote.length()); + #endif return; } else if (AiVoiceModel::AI_RESPONSE_END) // 如果是AI 回应结束 @@ -548,7 +551,9 @@ namespace OHOS WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceModel::GetErrnote is empty!!"); AiVoiceModel::GetInstance().SetErrnote("响应内容为空"); std::string str = AiVoiceModel::GetInstance().GetErrnote(); - //SendMsgToUIService(UI_AI_JUMP_TO_RESPONDERR_VIEW, 0, (void *)str.c_str(), str.length()); + #ifdef SUPPORT_BLE_SERVICE + SendMsgToUIService(UI_AI_JUMP_TO_RESPONDERR_VIEW, 0, (void *)str.c_str(), str.length()); + #endif return; } } @@ -561,7 +566,9 @@ namespace OHOS { aiAnswerStr += str; WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "接受字的符串:%s", aiAnswerStr.c_str()); - //SendMsgToUIService(UI_UPDATE_AI_ANSWER_STR, 0, nullptr, 0); + #ifdef SUPPORT_BLE_SERVICE + SendMsgToUIService(UI_UPDATE_AI_ANSWER_STR, 0, nullptr, 0); + #endif } } } @@ -609,8 +616,7 @@ namespace OHOS int type = GetCurUsingAiModelType(); WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "type = %d", type); #ifdef SUPPORT_BLE_SERVICE - // streamingRecordAndSend_AI(type);//实时发送录音数据 - #endif + streamingRecordAndSend_AI(type);//实时发送录音数据 #else std::string audioPath = AiVoiceModel::GetInstance().GetAIAudioPath(); if (uapi_delete_files(audioPath.c_str())) // 先删除文件 @@ -630,6 +636,7 @@ namespace OHOS #endif uapi_save_runtime_log(RUNTIME_LOG_RECORD_START_AI);//TOOD* AudioCaptureSample(6, (const char **)defaultArgs); +#endif #endif } return; @@ -736,7 +743,9 @@ namespace OHOS AiVoiceModel::GetInstance().AIVoice_StopTimer(); AiVoiceModel::GetInstance().SetErrnote("连接超时,请重新开始对话"); std::string str = AiVoiceModel::GetInstance().GetErrnote(); - //SendMsgToUIService(UI_AI_JUMP_TO_RESPONDERR_VIEW, 0, (void *)str.c_str(), str.length()); + #ifdef SUPPORT_BLE_SERVICE + SendMsgToUIService(UI_AI_JUMP_TO_RESPONDERR_VIEW, 0, (void *)str.c_str(), str.length()); + #endif } else { @@ -747,7 +756,9 @@ namespace OHOS { AiVoiceModel::GetInstance().SetErrnote("手机蓝牙已断开"); std::string str = AiVoiceModel::GetInstance().GetErrnote(); - // SendMsgToUIService(UI_AI_JUMP_TO_RESPONDERR_VIEW, 0, (void *)str.c_str(), str.length()); + #ifdef SUPPORT_BLE_SERVICE + SendMsgToUIService(UI_AI_JUMP_TO_RESPONDERR_VIEW, 0, (void *)str.c_str(), str.length()); + #endif } #endif } @@ -1107,7 +1118,8 @@ namespace OHOS {2, {STR_AIMODELS_DOUBAO, 3}}, // {3, {STR_TONGYI_QIANWEN, 4}}, {3, {STR_DEEPSEEK, 4}}, - {4, {STR_IFLYTEK_SPARK, 5}}, + // {4, {STR_IFLYTEK_SPARK, 5}}, + {4, {STR_AIMODES_LINGXI, 5}}, {5, {STR_AIMODES_CHATGPT, 1}}, }; textId = STR_AIMODES_WENXINYIYAN; @@ -1121,7 +1133,8 @@ namespace OHOS {3, {STR_AIMODELS_DOUBAO, 3}}, // {4, {STR_TONGYI_QIANWEN, 4}}, {4, {STR_DEEPSEEK, 4}}, - {5, {STR_IFLYTEK_SPARK, 5}}, + // {5, {STR_IFLYTEK_SPARK, 5}}, + {5, {STR_AIMODES_LINGXI, 5}}, }; textId = STR_AIMODES_CHATGPT; } @@ -1134,7 +1147,8 @@ namespace OHOS {2, {STR_AIMODELS_DOUBAO, 3}}, {3, {STR_AIMODES_WENXINYIYAN, 0}}, {4, {STR_AIMODES_KIMI, 2}}, - {5, {STR_IFLYTEK_SPARK, 5}}, + // {5, {STR_IFLYTEK_SPARK, 5}}, + {5, {STR_AIMODES_LINGXI, 5}}, }; textId = STR_DEEPSEEK; diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AiVoiceView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AiVoiceView.cpp index 92f05dbe6..e5922c9d1 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AiVoiceView.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AiVoiceView.cpp @@ -157,8 +157,19 @@ namespace OHOS //TOOD: 待优化 if(labelconfig.textId == STR_DEEPSEEK) { label->SetText("DeepSeek"); - } else + }else if(labelconfig.textId == STR_AIMODES_LINGXI) { + int language = ConfigModel::GetInstance()->GetLanguage(); + if (language == 0) // 如果当前系统为中文 + { + label->SetText("九天大模型"); + } + else + { + label->SetText("jiutian"); + } + } else{ label->SetTextId(labelconfig.textId); + } label->SetLineBreakMode(labelconfig.lineBreakMode); label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); label->SetRollSpeed(23); @@ -409,9 +420,11 @@ namespace OHOS aiModelPicker->SetRotateFactor(1.0); aiModelPicker->RequestFocus(); aiModelPicker->RegisterSelectedListener(presenter_); - aiModelPicker->SetTextColor(Color::GetColorFromRGBA(0x00, 0x00, 0x00, 0xff), Color::GetColorFromRGBA(0xff, 0x00, 0x00, 0xff)); + // 设置文本颜色为透明 + aiModelPicker->SetTextColor(Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0x00), Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0x00)); const char *uiPicker1Data[] = {"0", "1", "2", "3", "4", "5"}; aiModelPicker->SetValues(uiPicker1Data, sizeof(uiPicker1Data) / sizeof(uiPicker1Data[0])); + // aiModelPicker->SetVisible(false);//屏蔽picker组件 } return true; @@ -902,15 +915,23 @@ namespace OHOS int textId = AiVoiceModel::GetInstance().GetAiModelTextId(); if (title) { - if(textId == STR_DEEPSEEK) - { + if(textId == STR_DEEPSEEK) { title->SetText("DeepSeek"); - } - else - { - title->SetTextId(textId); - title->ForceResetText(); + }else if(textId == STR_AIMODES_LINGXI) { + int language = ConfigModel::GetInstance()->GetLanguage(); + if (language == 0) // 如果当前系统为中文 + { + title->SetText("九天大模型"); + } + else + { + title->SetText("jiutian"); + } + } else{ + title->SetTextId(textId); } + + title->ForceResetText(); } if (aiModelImage) { diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AivoiceConnectTimeoutView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AivoiceConnectTimeoutView.cpp index babb77944..517752f38 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AivoiceConnectTimeoutView.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AivoiceConnectTimeoutView.cpp @@ -11,6 +11,7 @@ #include "wearable_log.h" #include "ui_resource_string.h" #include +#include "ConfigModel.h" namespace OHOS { static constexpr const int16_t LABEL_ROLL_SPEED = 70; @@ -84,8 +85,19 @@ namespace OHOS //TOOD: 待优化 if(labelconfig.textId == STR_DEEPSEEK) { label->SetText("DeepSeek"); - } else + }else if(labelconfig.textId == STR_AIMODES_LINGXI) { + int language = ConfigModel::GetInstance()->GetLanguage(); + if (language == 0) // 如果当前系统为中文 + { + label->SetText("九天大模型"); + } + else + { + label->SetText("jiutian"); + } + } else{ label->SetTextId(labelconfig.textId); + } label->SetLineBreakMode(labelconfig.lineBreakMode); label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelconfig.fontSize); @@ -269,15 +281,23 @@ namespace OHOS { if (title) { - if(textId == STR_DEEPSEEK) - { + if(textId == STR_DEEPSEEK) { title->SetText("DeepSeek"); - } - else - { - title->SetTextId(textId); - title->ForceResetText(); + }else if(textId == STR_AIMODES_LINGXI) { + int language = ConfigModel::GetInstance()->GetLanguage(); + if (language == 0) // 如果当前系统为中文 + { + title->SetText("九天大模型"); + } + else + { + title->SetText("jiutian"); + } + } else{ + title->SetTextId(textId); } + + title->ForceResetText(); } } diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AivoiceMobileDataFailedStartView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AivoiceMobileDataFailedStartView.cpp index 554cab823..4f9646455 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AivoiceMobileDataFailedStartView.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AivoiceMobileDataFailedStartView.cpp @@ -11,6 +11,7 @@ #include "wearable_log.h" #include "ui_resource_string.h" #include +#include "ConfigModel.h" namespace OHOS { @@ -89,11 +90,22 @@ namespace OHOS label->SetPosition(labelconfig.left, labelconfig.top, labelconfig.width, labelconfig.height); label->SetStyle(STYLE_TEXT_FONT, labelconfig.fontSize); label->SetStyle(STYLE_LINE_HEIGHT, labelconfig.lineHeigh); - //TOOD: 待优化 - if(labelconfig.textId == STR_DEEPSEEK) { + //TOOD: 待优化 + if(labelconfig.textId == STR_DEEPSEEK) { label->SetText("DeepSeek"); - } else + }else if(labelconfig.textId == STR_AIMODES_LINGXI) { + int language = ConfigModel::GetInstance()->GetLanguage(); + if (language == 0) // 如果当前系统为中文 + { + label->SetText("九天大模型"); + } + else + { + label->SetText("jiutian"); + } + } else{ label->SetTextId(labelconfig.textId); + } label->SetLineBreakMode(labelconfig.lineBreakMode); label->SetRollSpeed(23); label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); @@ -279,15 +291,23 @@ namespace OHOS { if (title) { - if(textId == STR_DEEPSEEK) - { + if(textId == STR_DEEPSEEK) { title->SetText("DeepSeek"); - } - else - { - title->SetTextId(textId); - title->ForceResetText(); + }else if(textId == STR_AIMODES_LINGXI) { + int language = ConfigModel::GetInstance()->GetLanguage(); + if (language == 0) // 如果当前系统为中文 + { + title->SetText("九天大模型"); + } + else + { + title->SetText("jiutian"); + } + } else{ + title->SetTextId(textId); } + + title->ForceResetText(); } } } \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AivoiceReturnResultTextView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AivoiceReturnResultTextView.cpp index 0d5611b31..1e0b85d3a 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AivoiceReturnResultTextView.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/aivoice/src/AivoiceReturnResultTextView.cpp @@ -13,7 +13,7 @@ #include #include #include "string" - +#include "ConfigModel.h" namespace OHOS { @@ -129,8 +129,19 @@ namespace OHOS //TOOD: 待优化 if(labelconfig.textId == STR_DEEPSEEK) { label->SetText("DeepSeek"); - } else + }else if(labelconfig.textId == STR_AIMODES_LINGXI) { + int language = ConfigModel::GetInstance()->GetLanguage(); + if (language == 0) // 如果当前系统为中文 + { + label->SetText("九天大模型"); + } + else + { + label->SetText("jiutian"); + } + } else{ label->SetTextId(labelconfig.textId); + } label->SetLineBreakMode(labelconfig.lineBreakMode); label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelconfig.fontSize); @@ -353,15 +364,23 @@ namespace OHOS { if (title) { - if(textId == STR_DEEPSEEK) - { + if(textId == STR_DEEPSEEK) { title->SetText("DeepSeek"); - } - else - { - title->SetTextId(textId); - title->ForceResetText(); + }else if(textId == STR_AIMODES_LINGXI) { + int language = ConfigModel::GetInstance()->GetLanguage(); + if (language == 0) // 如果当前系统为中文 + { + title->SetText("九天大模型"); + } + else + { + title->SetText("jiutian"); + } + } else{ + title->SetTextId(textId); } + + title->ForceResetText(); } } diff --git a/code/sdk/files/fd230/fs/user/res/AIVoice/aimodels/aimodels_lingxi.bin b/code/sdk/files/fd230/fs/user/res/AIVoice/aimodels/aimodels_lingxi.bin new file mode 100644 index 0000000000000000000000000000000000000000..a1cbcf37f24a846fe5e6ff7fcdbd8acfc0f66b15 GIT binary patch literal 9624 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 TW*HxdOQRP2xBW%=ds_d$&@$hx literal 0 HcmV?d00001 diff --git a/code/sdk/files/fd230/fs/user/res/AIVoice/aimodels/aimodes_deepseek.bin b/code/sdk/files/fd230/fs/user/res/AIVoice/aimodels/aimodes_deepseek.bin new file mode 100644 index 0000000000000000000000000000000000000000..0c32be31b5a1b147339825d2548721895542ebff GIT binary patch literal 9624 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 #include #include -#include +#include #include #include #include @@ -41,7 +41,8 @@ using Audio::AudioInterrupt; using Audio::AudioManager; #define PLAYER_CONTROL_CMD_LEN 20 #define READ_RETRY_TIME_US 10000 -#define READ_COUNT_MAX 1000 +// #define READ_COUNT_MAX 1000 //原 +#define READ_COUNT_MAX 17000*2 //改过的 20分钟 #define GET_AUDIO_TIME_INTERVAL_TIMES 100 #define MAX_ARGC 5 @@ -99,7 +100,8 @@ static NameAudioFormat g_audioCodecFormat[] = { {"g711a", G711A}, {"aaceld", AAC_ELD}, {"silk", SILK}, - {"pcm", PCM} + {"pcm", PCM}, + {"sbc",SBC} }; class CaptureInterruptListener : public InterruptListener { @@ -189,7 +191,7 @@ static void* AudioCaptureProcess(void* arg) fclose(pfd); AudioCaptureStop(); MEDIA_INFO_LOG("AudioCaptureProcess end"); - return nullptr; + return NULL; } static void AudioCaptureGetFormat(const char **argv, AudioCodecFormat &audioFormat) @@ -291,6 +293,7 @@ static int32_t AudioCaptureSetInfo(SampleAudioCapturerInfo audioCapturerInfo) { AudioCapturerInfo info = {}; ConvertCaptureInfo(info, audioCapturerInfo); + printf("info.audioFormat = %d\n",info.audioFormat); if (g_audioCap->SetCapturerInfo(info) != 0) { MEDIA_ERR_LOG("Can't SetCapturerInfo"); return -1; @@ -341,7 +344,6 @@ static int32_t ActivateAudioInterrupt(AudioSession &sessionId) static int32_t CheckInputParam(int32_t argc, const char **argv) { - MEDIA_UNUSED(argv); if (argc != 0x6) { // must be 6 parameters MEDIA_ERR_LOG("argc:%d is invalid, record start must be 6 parameters", argc); return -1; @@ -414,6 +416,145 @@ EXIT: return -1; } +/* ------------------------------- AI录音数据上传接口 ------------------------------- */ +#define AI_RECORD_TEST 0 //若需要调试可以打开该宏 +#include "bleService.h" +static uint32_t AI_audio_size=0; +static uint8_t Cur_AI_Model= 0; +static void* AudioCaptureProcess_AI(void* arg) +{ + #if AI_RECORD_TEST + FILE *pfd = (FILE *)arg; + #endif + int32_t readCnt = 0; + Timestamp timeStamp; + g_audioSourceProcessInput.bThreadRun = true; + uint8_t start_data[19]={0}; + + AI_data_assembly(1,start_data, Cur_AI_Model); + send_msg_data_into_Ai_msg_queue((void *)start_data,19,1); + AI_audio_size=0; + + while (!g_sample.needStop && !g_interruptHintStop) { + int32_t ret = g_audioCap->Read(g_audioSourceProcessInput.buffer, g_audioSourceProcessInput.framesize, false); + if (ret == -1) { + MEDIA_ERR_LOG("audioCap Read failed:0x%x", ret); + continue; + } + if (ret == ERR_RETRY_READ) { + usleep(READ_RETRY_TIME_US); + continue; + } + #if AI_RECORD_TEST + int32_t writeLen = fwrite(g_audioSourceProcessInput.buffer, 1, ret, pfd); + if (writeLen != ret) { + MEDIA_ERR_LOG("errno:%d, errmsg:%s", errno, strerror(errno)); + break; + } + #endif + AI_audio_size+=ret; + + + // 蓝牙接口发送实时录音数据 + send_msg_data_into_Ai_msg_queue((void *)g_audioSourceProcessInput.buffer,(uint16_t)ret,0); + + if (readCnt++ > READ_COUNT_MAX) { + break; + } + #if AI_RECORD_TEST + if (readCnt % GET_AUDIO_TIME_INTERVAL_TIMES == 0) { + if (g_audioCap->GetAudioTime(timeStamp, Timestamp::Timebase::MONOTONIC)) { + MEDIA_INFO_LOG("read %d frames timestamp seconds:%ld, nanoseconds:%ld", + readCnt, timeStamp.time.tv_sec, timeStamp.time.tv_nsec); + } + } + MEDIA_INFO_LOG("audioCap Read readCnt = %d, size = %d", readCnt, ret); + #endif + } + #if AI_RECORD_TEST + fclose(pfd); + #endif + MEDIA_ERR_LOG("AI_audio_size %d",AI_audio_size); + + AI_data_assembly(0,start_data,Cur_AI_Model); + send_msg_data_into_Ai_msg_queue((void *)start_data,19,2); + + + AudioCaptureStop(); + MEDIA_INFO_LOG("AudioCaptureProcess end"); + return NULL; +} + +int32_t streamingRecordAndSend_AI(int type) +{ + const char *argv[] = {"01", "sbc", "16000", "1", "16", "/user/aiRecord.sbc"}; + int32_t argc = 6; + Cur_AI_Model = type; + if (g_audioSourceProcessInput.bThreadRun) { + return HandleAudioCaptureCmd(argc, argv); + } + std::string filePath = ""; + g_sample.needStop = false; + g_interruptHintStop = false; + g_sample.mutex = MediaMutexCreate(nullptr); + if (g_sample.mutex == nullptr) { + MEDIA_ERR_LOG("create mutex failed"); + g_audioSourceProcessInput.bThreadRun = false; + return -1; + } + SampleAudioCapturerInfo audioCapturerInfo = {}; + AudioSession sessionId = AUDIO_SESSION_ID_NONE; + FILE *pfd = nullptr; + MediaThreadattr attr = { "AudioCaptureTask", 0x2000, THREAD_SCHED_INVALID, 0, true }; + int32_t ret = CheckInputParam(argc, argv); + if (ret != 0) { + goto EXIT; + } + ret = AudioCaptureGetInfo(argv, audioCapturerInfo, filePath); + if (ret != 0) { + goto EXIT; + } + ret = ActivateAudioInterrupt(sessionId); + if (ret != 0) { + goto EXIT; + } + g_audioCap = std::make_shared(); + if (g_audioCap == nullptr || g_audioCap.get() == nullptr) { + MEDIA_ERR_LOG("audio capture is nullptr"); + (void)g_amInstance.DeactivateAudioInterrupt(g_sample.interrupt); + goto EXIT; + } + #if AI_RECORD_TEST + pfd = fopen(filePath.c_str(), "w+"); + if (pfd == NULL) { + MEDIA_ERR_LOG("open file failed"); + g_audioCap.reset(); + (void)g_amInstance.DeactivateAudioInterrupt(g_sample.interrupt); + goto EXIT; + } + #endif + audioCapturerInfo.sessionID = sessionId; + audioCapturerInfo.inputSource = AUDIO_MIC; + audioCapturerInfo.streamType = AUDIO_STREAM_VOICE_RECORD; + ret = AudioCaptureSetInfo(audioCapturerInfo); + if (ret != 0) { + #if AI_RECORD_TEST + fclose(pfd); + #endif + g_audioCap.reset(); + (void)g_amInstance.DeactivateAudioInterrupt(g_sample.interrupt); + goto EXIT; + } + g_sample.audioCaptureProcess = MediaThreadCreate(AudioCaptureProcess_AI, pfd, &attr); + if (g_sample.audioCaptureProcess == nullptr) { + MEDIA_ERR_LOG("thread create failed"); + goto EXIT; + } + return 0; +EXIT: + g_audioSourceProcessInput.bThreadRun = false; + return -1; +} #ifdef __cplusplus }; #endif diff --git a/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.h b/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.h index 11337f116..fbc42bd57 100644 --- a/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.h +++ b/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.h @@ -16,6 +16,8 @@ extern "C" { int32_t AudioCaptureSample(int32_t argc, const char *argv[]); +int32_t streamingRecordAndSend_AI(int type); + #ifdef __cplusplus }; #endif -- 2.17.1