随着人工智慧(AI)在2022-2023的爆炸性成长,我们迎来了AI世代,无论是交通、工业、金融、制造、医疗等各领域,AI已被广泛的应用来解决各类问题与加速发展。伴随著AI走入我们的生活,我们也在所拥有的各类智慧装置上,看到各式各样的AI工具与产品的身影。
图一:MediaTek Genio 130 chip (资料内容取自 MediaTek)
ChatGPT,我们熟知且广泛使用的自然语言生成式模型;ChatGPT 由 OpenAI 所开发并在2022推出。透过 ChatGPT,我们除了能以人类自然语言与其互动外。还可传递文字、音讯、图像、多媒体等资讯,为使用者提出的询问给予近乎真人且基于深度学习后相应的回应内容。
这样的先进的AI技术,被广泛的应用在各类领域、场景。在 IoT 领域,联发科技将自家解决方案:Genio 130,为一款单芯片整合了 Arm Cortex-M33 MCU、Wi-Fi 6 和蓝牙 5.2 连接子系统、电源管理单元(PMU)和可选音频 DSP 为基础,结合 OpenAI API,打造新一代智慧联网 AI 装置,可应用在各类 IoT 场景及情境。
图二:MediaTek Genio 130 block diagram
本篇方案将进一步介绍 Genio 130 结合 ChatGPT 功能的解决方案 :
- Genio 130 环境 & SDK 架设
- OpenAI API 导入 & 行为设计
- 实际操作展示
Genio 130 环境 & SDK 架设
图三:MediaTek Genio 130 EVK (资料内容取自 AcSip)
透过搭建 Linux 开发环境(ex. VM + Ubuntu 20.04 LTS)后,导入 Genio 130 SDK,便可开始进行 OpenAI 功能实作。
关于如何架设 Genio 130 开发环境,并进一步建置专案、烧录专案 binary file 到 Genio 130 EVK,详细可以参考大大通博文:MediaTek Genio 130/130A 快速上手(一)
在导入 OpenAI API 之前,我们需要将以下功能实作,以配合 OpenAI API 所需,Genio 130 SDK 已具备部分功能。
- Audio data capture from microphone:撷取麦克风音讯。
- Audio playback:用以播放 OpenAI 回应内容。
- HTTP Client:收发 Genio 130 与 OpenAI Server 网路封包。
OpenAI API 导入 & 行为设计
参考 OpenAI 开发文件,我们可以从中查找各类 OpenAI API 并整合在 Genio 130 上,利用 HTTP Request 来完成,以下是一个使用 Chat Completions API 的 HTTP Request 范例:
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-4o-mini",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "What is a LLM?"
}
]
}'
值得一提的是,开发 OpenAI API 需要在 OpenAI 注册帐号并取得 OpenAI API Key(须付费)。
详细可参考 : OpenAI Platform
在 Genio 130 上我们设计使用 EVK 上的按钮(SW2)来触发麦克风收音,再透过 HTTP Requet 封包发送到 OpenAI Server,接着取得经过 OpenAI Server 处理后返回的音讯回应,最后利用 Audio playback 功能于 Speaker 播放结果。
图四:MediaTek Genio 130 EVK
实际操作展示
接下来是 Genio 130 实际操作 ChatGPT 功能展示,我们可以简单的将 Speaker 与 Genio 130 EVK 连接,完成后将 Gneio 130 EVK 连接电源,Gneio 130 EVK 将会快速的完成初始化并等待使用者执行下一步动作。
图五:MediaTek Genio 130 EVK
接着,我们需要将 Gneio 130 EVK 连接上已知的 WIFI AP;透过一连串的 WIFI CLI command 来建立 Gneio 130 EVK 的网路连线,这个 WIFI AP profile 也可储存在 Gneio 130 EVK 的 NVDM 中,之后的开机都将会自动套用 profile 进行 WIFI 连线。
$ wifi init
$ wifi config set ssid 0 SSID
$ wifi config set sec 0 7 6
$ wifi config set psk 0 PASSWORD
$ wifi config set reload
再来,我们透过已实作好的 ChatGPT CLI command 启动 ChatGPT 服务
$ chatgpt_start
完成后,我们便可透过按下 SW2 按钮,并使用自然语言做提问:你好,请自我介绍。
通过 OpenAI API 一连串的处理:audio/transcriptions --> chat/completions --> audio/speech。完成了一次的"对话",以下以封包形式展示:
[249093]<633>[common][I][openAI_chatGPT_task][1289]send audio data complete!
recv data_size:38,
{
"text": "你好,请自我介绍"
}
[249637]<634>[common][I][openAI_chatGPT_task][1294]httpclient_post https://api.openai.com/v1/audio/transcriptions success !
req: 你好,请自我介绍
[249639]<635>[common][I][openAI_chatGPT_task][1335]send chat request !
[249645]<636>[common][I][openAI_chatGPT_task][1351]send chat request complete!
recv data_size:757,
{
"id": "chatcmpl-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"object": "chat.completion",
"created": 1724683334,
"model": "gpt-4o-mini-2024-07-18",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "你好!我是聊天机器人助手,旨在回答问题、提供资讯和帮助解决各种需求。不论是学习新知识、寻找建议、撰写文本,还是其他各种话题,我都可以提供帮助。如果你有任何问题或需求,随时告诉我!",
"refusal": null
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 13,
"completion_tokens": 74,
"total_tokens": 87
},
"system_fingerprint": "fp_507c9469a1"
}
[251591]<637>[common][I][openAI_chatGPT_task][1355]httpclient_post https://api.openai.com/v1/chat/completions success !
req txt: 你好!我是聊天机器人助手,旨在回答问题、提供资讯和帮助解决各种需求。不论是学习新知识、寻找建议、撰写文本,还是其他各种话题,我都可以提供帮助。如果你有任何问题或需求,随时告诉我!
[251594]<638>[common][I][openAI_chatGPT_task][1397]send text!
[251601]<639>[common][I][openAI_chatGPT_task][1413]send text complete!
mp3_codec_start_play,829
[MP3 Codec]Open codec
[MP3 Codec]: mp3_decode_buffer 0x1067c0c8 (len 41000), mp3_codec_internal_handle 0x1057a1f0 (size 220), handle 0x1057a1f0
[MP3 Codec]mp3_codec_task_main create
[MP3 Codec Demo] first write data 4095.mp3_codec_start_play,848
[MP3 Codec Demo] play +
[MP3 Codec] mp3_codec_play_internal ++
[MP3 Codec] mp3_codec_play_internal --
[MP3 Codec Demo] play -
recv data done:total size:340800, this block:14400
[260847]<649>[common][I][openAI_chatGPT_task][1434]httpclient_post https://api.openai.com/v1/audio/speech success !
另一个操作展示:计算952加33再除以2 有小数点吗?小数点是多少?
[9323894]<699>[common][I][openAI_chatGPT_task][1289]send audio data complete!
recv data_size:76,
{
"text": "计算952加33再除以2 有小数点吗?小数点是多少?"
}
[9324831]<700>[common][I][openAI_chatGPT_task][1294]httpclient_post https://api.openai.com/v1/audio/transcriptions success !
req: 计算952加33再除以2 有小数点吗?小数点是多少?
[9324833]<701>[common][I][openAI_chatGPT_task][1335]send chat request !
[9324840]<702>[common][I][openAI_chatGPT_task][1351]send chat request complete!
recv data_size:707,
{
"id": "chatcmpl-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"object": "chat.completion",
"created": 1724692409,
"model": "gpt-4o-mini-2024-07-18",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "首先,我们先计算 \\( 952 + 33 \\)。\n\n\\[\n952 + 33 = 985\n\\]\n\n接下来,将这个结果除以 2:\n\n\\[\n\\frac{985}{2} = 492.5\n\\]\n\n因此,计算结果有小数点,且小数点是 **0.5**。",
"refusal": null
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 27,
"completion_tokens": 77,
"total_tokens": 104
},
"system_fingerprint": "fp_f3db212e1c"
}
[9326680]<703>[common][I][openAI_chatGPT_task][1355]httpclient_post https://api.openai.com/v1/chat/completions success !
req txt: 首先,我们先计算 \\( 952 + 33 \\)。\n\n\\[\n952 + 33 = 985\n\\]\n\n接下来,将这个结果除以 2:\n\n\\[\n\\frac{985}{2} = 492.5\n\\]\n\n因此,计算结果有小数点,且小数点是 **0.5**。
[9326683]<704>[common][I][openAI_chatGPT_task][1397]send text!
[9326690]<705>[common][I][openAI_chatGPT_task][1413]send text complete!
mp3_codec_start_play,829
[MP3 Codec]Open codec
[MP3 Codec]: mp3_decode_buffer 0x1067c0c8 (len 41000), mp3_codec_internal_handle 0x1057a1f0 (size 220), handle 0x1057a1f0
[MP3 Codec]mp3_codec_task_main create
[MP3 Codec Demo] first write data 4095.mp3_codec_start_play,848
[MP3 Codec Demo] play +
[MP3 Codec] mp3_codec_play_internal ++
[MP3 Codec] mp3_codec_play_internal --
[MP3 Codec Demo] play -
recv data done:total size:296640, this block:2880
[9330700]<715>[common][I][openAI_chatGPT_task][1434]httpclient_post https://api.openai.com/v1/audio/speech success !
参考资料:
MediaTek Genio 130(MT7931/MT7933)
- Website : MediaTek | MediaTek | Genio 130 Family | IoT Products
- Datasheet : https://d86o2zu8ugzlg.cloudfront.net/mediatek-craft/documents/MT7933CT_Datasheet.pdF
- Genio 130A (MT7933) EVK User Guide:https://mediatek-marketing.files.svdcdn.com/production/documents/EK-AI7933CLD_User-Guide-Ver.E.pdf?dm=1684470662
OpenAI
- Website: https://platform.openai.com/docs/overview
►场景应用图
►展示板照片
►方案方块图
►核心技术优势
品佳集团代理的 MediaTek Genio 130(MT7931/MT7933)微处理器产品,为基于Arm Cortex-M33架构处理器,时脉可达300MHz,内建最高8MB UHS PSRAM,提供高效运算能力。并提供 WiFi 6、BT 5.2 等无线连接技术,并具备双频(2.4GHz 和 5GHz)连接;此外,Genio 130 (MT7933 版本)内建 HiFi4 DSP、3 个 ADC、2 个 DAC 通道,提供语音活动检测和触发词功能,适合开发支援语音助理云服务的 IoT 设备。
►方案规格
联发科技(MediaTek)Genio 130 系列(MT7931/MT7933),具备:
• Arm Cortex-M33 处理器,时脉 300MHz
• Embedded 1MB SRAM and 8MB UHS(Ultra High Speed) PSRAM
• WiFi 6与双频 IEEE 802.11 a/b/g/n/ac/ax 2.4G/5G 连接子系统
• 蓝牙 5.2 连接子系统
• Audio Cadence® Tensilica® HiFi4 DSP@600MHz(注一)
• 硬体加密引擎(AES/DES/3DES/SHA/ECC/TRNG)
• 电源管理单元
• 支援 USB 2.0 OTG(注一)
• 丰富的周边界面如: USB、SDIO、SPI master/slave、I2C、I2S、UART、AUXADC、PWM 以及 最多46组 GIPO
• 提供 FreeRTOS 及 Arduino 开发 SDK 及多个范例专案,缩短开发时程 注一: HiFi4 DSP, USB 2.0 为 MT7933 支援之功能。