From 027a40d3a02e8e53f2ea3577848154fea997ad5d Mon Sep 17 00:00:00 2001 From: Irene-Maxine <114802521+Irene-Maxine@users.noreply.github.com> Date: Tue, 14 Oct 2025 14:20:52 +0800 Subject: [PATCH] =?UTF-8?q?mini=E5=A2=9E=E5=8A=A0=E4=BA=91=E7=AB=AF?= =?UTF-8?q?=E6=99=BA=E8=83=BD-=E8=AF=AD=E9=9F=B3=E4=BA=A4=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../micropython/blocks/ai_cloud.js | 108 ++++++++++++++++ boards/default_src/micropython/export.js | 4 + .../micropython/generators/ai_cloud.js | 48 +++++++ .../css/color_esp32c3_mixgocc.css | 10 ++ .../default_src/micropython_esp32c2/index.js | 4 + .../micropython_esp32c2/template.xml | 118 ++++++++++++++++++ common/msg/blockly/en.js | 10 +- common/msg/blockly/zh-hans.js | 10 +- common/msg/blockly/zh-hant.js | 10 +- 9 files changed, 319 insertions(+), 3 deletions(-) create mode 100644 boards/default_src/micropython/blocks/ai_cloud.js create mode 100644 boards/default_src/micropython/generators/ai_cloud.js diff --git a/boards/default_src/micropython/blocks/ai_cloud.js b/boards/default_src/micropython/blocks/ai_cloud.js new file mode 100644 index 00000000..78435c0d --- /dev/null +++ b/boards/default_src/micropython/blocks/ai_cloud.js @@ -0,0 +1,108 @@ +import * as Blockly from 'blockly/core'; +import { Variables } from '../../python/export'; +const AI_CLOUD_VOICE_HUE = '#88ada6'; + +export const init_xunfei_vi = { + init: function () { + this.setColour(AI_CLOUD_VOICE_HUE); + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.MIXLY_AS + Blockly.Msg.MIXLY_XUFEI + Blockly.Msg.MIXLY_AipSpeech_asr ); + this.appendValueInput('APPID') + .setCheck(String) + .appendField('APPID'); + this.appendValueInput('APISecret') + .setCheck(String) + .appendField('APISecret'); + this.appendValueInput('APIKey') + .setCheck(String) + .appendField('APIKey'); + this.setInputsInline(false); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + + +export const init_xunfei_Spark_Ultra = { + init: function () { + this.setColour(AI_CLOUD_VOICE_HUE); + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.MIXLY_AS + Blockly.Msg.MIXLY_XUFEI + 'Spark Ultra' +Blockly.Msg.MIXLY_LARGE_LANGUAGE_MODEL ); + this.appendValueInput('APPID') + .setCheck(String) + .appendField('APPID'); + this.appendValueInput('APISecret') + .setCheck(String) + .appendField('APISecret'); + this.appendValueInput('APIKey') + .setCheck(String) + .appendField('APIKey'); + this.setInputsInline(false); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const init_xunfei_vi_run = { + init: function () { + this.setColour(AI_CLOUD_VOICE_HUE); + this.appendValueInput('VAR') + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_RUN + Blockly.Msg.MIXLY_AipSpeech_asr); + this.appendValueInput('time') + .setCheck(Number); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXPY_AI_AUDIO_TIME); + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(Blockly.Msg.init_xunfei_vi_op_tooltip); + } +}; + +export const init_xunfei_Spark_Ultra_run = { + init: function () { + this.setColour(AI_CLOUD_VOICE_HUE); + this.appendValueInput('VAR') + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_RUN + Blockly.Msg.MIXLY_LARGE_LANGUAGE_MODEL); + this.appendValueInput('qus') + .setCheck(String) + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_SEND); + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(Blockly.Msg.init_xunfei_vi_run_tooltip); + } +}; + +export const init_xunfei_Spark_Ultra_clr_his = { + init: function () { + this.setColour(AI_CLOUD_VOICE_HUE); + this.appendValueInput('VAR') + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_RUN + Blockly.Msg.MIXLY_LARGE_LANGUAGE_MODEL + Blockly.Msg.MIXLY_EMPTY_HISTORY); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +export const llm_set_callback = { + init: function () { + this.setColour(AI_CLOUD_VOICE_HUE); + this.appendValueInput('VAR1') + .appendField(Blockly.Msg.MIXLY_LARGE_LANGUAGE_MODEL) + this.appendValueInput('callback') + .appendField(Blockly.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE) + this.appendValueInput('VAR') + .appendField(Blockly.Msg.MIXLY_PARAMS); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.llm_set_callback_tooltip); + } +}; \ No newline at end of file diff --git a/boards/default_src/micropython/export.js b/boards/default_src/micropython/export.js index c95f5751..b0afa2d5 100644 --- a/boards/default_src/micropython/export.js +++ b/boards/default_src/micropython/export.js @@ -4,6 +4,7 @@ import * as MicroPythonActuatorBlocks from './blocks/actuator'; import * as MicroPythonAISensorBlocks from './blocks/ai_sensor'; import * as MicroPythonAIBlocks from './blocks/ai'; import * as MicroPythonAILocalBlocks from './blocks/ai_local'; +import * as MicroPythonAICloudBlocks from './blocks/ai_cloud'; import * as MicroPythonBlynkBlocks from './blocks/blynk'; import * as MicroPythonCCG1Blocks from './blocks/cc_g1'; import * as MicroPythonCEGOBlocks from './blocks/ce_go'; @@ -32,6 +33,7 @@ import * as MicroPythonActuatorGenerators from './generators/actuator'; import * as MicroPythonAISensorGenerators from './generators/ai_sensor'; import * as MicroPythonAILocalGenerators from './generators/ai_local'; import * as MicroPythonAIGenerators from './generators/ai'; +import * as MicroPythonAICloudGenerators from './generators/ai_cloud'; import * as MicroPythonBlynkGenerators from './generators/blynk'; import * as MicroPythonCCG1Generators from './generators/cc_g1'; import * as MicroPythonCEGOGenerators from './generators/ce_go'; @@ -67,6 +69,7 @@ export { MicroPythonAISensorBlocks, MicroPythonAIBlocks, MicroPythonAILocalBlocks, + MicroPythonAICloudBlocks, MicroPythonBlynkBlocks, MicroPythonCCG1Blocks, MicroPythonCEGOBlocks, @@ -94,6 +97,7 @@ export { MicroPythonAISensorGenerators, MicroPythonAIGenerators, MicroPythonAILocalGenerators, + MicroPythonAICloudGenerators, MicroPythonBlynkGenerators, MicroPythonCCG1Generators, MicroPythonCEGOGenerators, diff --git a/boards/default_src/micropython/generators/ai_cloud.js b/boards/default_src/micropython/generators/ai_cloud.js new file mode 100644 index 00000000..b06a9436 --- /dev/null +++ b/boards/default_src/micropython/generators/ai_cloud.js @@ -0,0 +1,48 @@ +import { Boards } from 'mixly'; + +export const init_xunfei_vi = function (_, generator) { + generator.definitions_['import_mini_xunfei'] = "import mini_xunfei"; + var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var id = generator.valueToCode(this, 'APPID', generator.ORDER_ATOMIC); + var s = generator.valueToCode(this, 'APISecret', generator.ORDER_ATOMIC); + var key = generator.valueToCode(this, 'APIKey', generator.ORDER_ATOMIC); + var code = v + ' = mini_xunfei.ASR_WebSocket(' + id + ',' + key + ',' + s +')\n'; + return code; +} + +export const init_xunfei_Spark_Ultra = function (_, generator) { + generator.definitions_['import_mini_xunfei'] = "import mini_xunfei"; + var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var id = generator.valueToCode(this, 'APPID', generator.ORDER_ATOMIC); + var s = generator.valueToCode(this, 'APISecret', generator.ORDER_ATOMIC); + var key = generator.valueToCode(this, 'APIKey', generator.ORDER_ATOMIC); + var code = v + ' = mini_xunfei.LLM_WebSocket(' + id + ',' + key + ',' + s +')\n'; + return code; +} + +export const init_xunfei_vi_run = function (_, generator) { + var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var t = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC); + var code = v + '.run(' + t +')'; + var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var q = generator.valueToCode(this, 'qus', generator.ORDER_ATOMIC); + var code = v + '.run(' + q +')'; + return [code,generator.ORDER_ATOMIC]; +} + +export const init_xunfei_Spark_Ultra_clr_his = function (_, generator) { + var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = v + '.empty_history()\n'; + return code; +} + +export const llm_set_callback = function (_, generator) { + var v1 = generator.valueToCode(this, "VAR1", generator.ORDER_NONE) || "None"; + var v = generator.valueToCode(this, "VAR", generator.ORDER_NONE) || "None"; + var callback = generator.variableDB_.getName( + generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None", + Blockly.Procedures.NAME_TYPE + ); + var code = v1 +".function_call(" + callback + ", " + v + ")\n"; + return code; +} \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c2/css/color_esp32c3_mixgocc.css b/boards/default_src/micropython_esp32c2/css/color_esp32c3_mixgocc.css index e471b651..66a1ed30 100644 --- a/boards/default_src/micropython_esp32c2/css/color_esp32c3_mixgocc.css +++ b/boards/default_src/micropython_esp32c2/css/color_esp32c3_mixgocc.css @@ -485,4 +485,14 @@ div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div.blocklyTr #catBLEKM.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { background: url('../../../../common/media/mark/comuni2.png') no-repeat; background-size: 100% auto; +} + +#catVI.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/AIvoice.png') no-repeat; + background-size: 100% auto; +} + +#catVI.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/AIvoice2.png') no-repeat; + background-size: 100% auto; } \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c2/index.js b/boards/default_src/micropython_esp32c2/index.js index 799f3fbc..5e7438b2 100644 --- a/boards/default_src/micropython_esp32c2/index.js +++ b/boards/default_src/micropython_esp32c2/index.js @@ -39,6 +39,7 @@ import { MicroPythonAISensorBlocks, MicroPythonAIBlocks, MicroPythonAILocalBlocks, + MicroPythonAICloudBlocks, MicroPythonBlynkBlocks, MicroPythonCCG1Blocks, MicroPythonCEGOBlocks, @@ -59,6 +60,7 @@ import { MicroPythonAISensorGenerators, MicroPythonAIGenerators, MicroPythonAILocalGenerators, + MicroPythonAICloudGenerators, MicroPythonBlynkGenerators, MicroPythonCCG1Generators, MicroPythonCEGOGenerators, @@ -131,6 +133,7 @@ Object.assign( MicroPythonWeatherBlocks, MicroPythonAISensorBlocks, MicroPythonAILocalBlocks, + MicroPythonAICloudBlocks, MicroPythonSensorOnBoardBlocks, MicroPythonSensorExternBlocks, MicroPythonNetworkBlocks, @@ -172,6 +175,7 @@ Object.assign( MicroPythonWeatherGenerators, MicroPythonAISensorGenerators, MicroPythonAILocalGenerators, + MicroPythonAICloudGenerators, MicroPythonSensorOnBoardGenerators, MicroPythonSensorExternGenerators, MicroPythonNetworkGenerators, diff --git a/boards/default_src/micropython_esp32c2/template.xml b/boards/default_src/micropython_esp32c2/template.xml index ba6169ac..1cf85669 100644 --- a/boards/default_src/micropython_esp32c2/template.xml +++ b/boards/default_src/micropython_esp32c2/template.xml @@ -2811,6 +2811,124 @@ + + + + + + + asr + + + + + ba3917dd + + + + + Nzg4MWUyNGE1ZTcxOGZkNzM4NWQ4Yzdi + + + + + b47549319a8324f5eab3dd5c37dfa1dd + + + + + + + llm + + + + + ba3917dd + + + + + Nzg4MWUyNGE1ZTcxOGZkNzM4NWQ4Yzdi + + + + + b47549319a8324f5eab3dd5c37dfa1dd + + + + + + + asr + + + + + 3 + + + + + + + llm + + + + + question + + + + + + + llm + + + + + + + llm + + + + + cb_func + + + + + "参数名","类型","描述" + + + + + + + + cb_func + + + + + + cb------ + + + + + xx + + + + + + + diff --git a/common/msg/blockly/en.js b/common/msg/blockly/en.js index c0f10e2f..3108cfb8 100644 --- a/common/msg/blockly/en.js +++ b/common/msg/blockly/en.js @@ -176,7 +176,9 @@ En.MSG = { enablePythonToBlockly: "Blocks↔Code", catSearch: "Search", wiki: "Wiki", - catTinyWebDB: "TinyWebDB" + catTinyWebDB: "TinyWebDB", + catCloudAI:"Cloud Intelligence", + catVI:"Voice Isnteraction" }; /* 多重选择 */ @@ -4041,4 +4043,10 @@ En.MIXLY_TENSORFLOW_LOAD_MODEL = 'Use imported model'; En.MIXLY_TENSORFLOW_MODEL_NAME = 'Model name'; En.MIXLY_TENSORFLOW_PREPARE_PICTURE_TO_TENSOR = 'Preprocess image to tensor'; En.MIXLY_TENSORFLOW_PREPARE_PICTURE_READ_PICTURE = 'Read image'; +En.MIXLY_XUFEI = 'xunfei'; +En.MIXLY_LARGE_LANGUAGE_MODEL = 'large language model'; +En.init_xunfei_vi_op_tooltip = 'return text result of speech recognition'; +En.MIXLY_RUN = 'run'; +En.init_xunfei_vi_run_tooltip = 'return large language model text output'; +En.llm_set_callback_tooltip = 'tpyes (string,number(includde float),integer,boolean)' })(); diff --git a/common/msg/blockly/zh-hans.js b/common/msg/blockly/zh-hans.js index 5444af27..aee55ae5 100644 --- a/common/msg/blockly/zh-hans.js +++ b/common/msg/blockly/zh-hans.js @@ -187,7 +187,9 @@ ZhHans.MSG = { enablePythonToBlockly: "图文互换", catSearch: "查找", wiki: "Wiki", - catTinyWebDB: "TinyWebDB" + catTinyWebDB: "TinyWebDB", + catCloudAI:"云端智能", + catVI:"语音交互" }; /* 多重选择 */ @@ -4199,4 +4201,10 @@ ZhHans.MIXLY_TENSORFLOW_LOAD_MODEL = '使用导入模型'; ZhHans.MIXLY_TENSORFLOW_MODEL_NAME = '模型名'; ZhHans.MIXLY_TENSORFLOW_PREPARE_PICTURE_TO_TENSOR = '预处理图像为张量'; ZhHans.MIXLY_TENSORFLOW_PREPARE_PICTURE_READ_PICTURE = '读入图像'; +ZhHans.MIXLY_XUFEI = '讯飞'; +ZhHans.MIXLY_LARGE_LANGUAGE_MODEL = '大模型'; +ZhHans.init_xunfei_vi_op_tooltip = '返回 语音识别文字结果'; +ZhHans.MIXLY_RUN = '运行'; +ZhHans.init_xunfei_vi_run_tooltip = '返回 大模型文字结果'; +ZhHans.llm_set_callback_tooltip = '类型有(string-字符串类型,number-数字类型(含小数),integer-整数类型,boolean-布尔类型)' })(); \ No newline at end of file diff --git a/common/msg/blockly/zh-hant.js b/common/msg/blockly/zh-hant.js index de64d220..f3e868bd 100644 --- a/common/msg/blockly/zh-hant.js +++ b/common/msg/blockly/zh-hant.js @@ -187,7 +187,9 @@ ZhHant.MSG = { enablePythonToBlockly: "圖文互換", catSearch: "查找", wiki: "Wiki", - catTinyWebDB: "TinyWebDB" + catTinyWebDB: "TinyWebDB", + catCloudAI:"雲端智能", + catVI:"語音交互" }; /* 多重選擇 */ @@ -4194,4 +4196,10 @@ ZhHant.MIXLY_TENSORFLOW_LOAD_MODEL = '使用導入模型'; ZhHant.MIXLY_TENSORFLOW_MODEL_NAME = '模型名'; ZhHant.MIXLY_TENSORFLOW_PREPARE_PICTURE_TO_TENSOR = '預處理圖像為張量'; ZhHant.MIXLY_TENSORFLOW_PREPARE_PICTURE_READ_PICTURE = '讀入圖像'; +ZhHant.MIXLY_XUFEI = '訊飛'; +ZhHant.MIXLY_LARGE_LANGUAGE_MODEL = '大模型'; +ZhHant.init_xunfei_vi_op_tooltip = '返回 語音識別文字結果'; +ZhHant.MIXLY_RUN = '運行'; +ZhHant.init_xunfei_vi_run_tooltip = '返回 大模型文字結果'; +ZhHant.llm_set_callback_tooltip = '類型有(string-字符串類型,number-數字類型(含小數),integer-整數類型,boolean-布爾類型)' })();