ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LD3320离线语音识别芯片与STM32低成本语音交互实战指南

LD3320离线语音识别芯片与STM32低成本语音交互实战指南 搞嵌入式这几年我给不少DIY项目加过语音交互但真正让我觉得“便宜又够用”的还是LD3320这颗离线语音识别芯片。这芯片最大的特点就是不需要联网也不需要云端服务器本地就能完成关键词识别成本压到几十块钱以内配合一块STM32单片机就能让设备同时拥有“耳朵”语音识别和“嘴巴”语音播报。这组合非常适合智能家居控制、语音提醒装置、无障碍辅助设备以及各种毕业设计、课程设计项目。这篇文章我打算把LD3320从选型、接线、驱动代码到常见坑位一次性讲透给想快速上手的你一条能直接走通的路。1. 为什么选LD3320离线语音识别的项目定位1.1 离线方案与在线方案怎么选很多人在做语音识别时第一反应是“用现成云平台”比如各种在线语音识别服务。这类方案确实聪明但架不住它依赖网络断网就哑火延迟要看网速而且SDK集成成本和功耗都比较高。对STM32这种资源不算富裕的MCU来说动不动塞一个需要大量内存和网络协议的在线语音SDK很容易把整个工程拖垮。LD3320走的是完全不同的路线它是一颗专用语音识别芯片内部集成了声学模型和识别引擎。你把需要识别的关键词通过寄存器写进去它就可以在本地匹配用户说的话识别结果直接通过SPI总线返回给MCU。好处非常明显离线可用、响应速度快、不占MCU太多资源、没有服务器费用。用一句我常跟朋友说的话“它就是一个能听懂几个单词的‘专用耳朵’。”那什么时候该选在线方案呢如果你需要识别自由说法、长句子、多人对话、方言大模型那就别折腾LD3320了直接上带网络模块的语音模组。但如果你只是想让设备听清楚“开灯”“关灯”“打开风扇”“关闭风扇”这类固定指令LD3320完全够用。它做的是关键词检测不是语义理解这一点必须心里有数。1.2 低成本到底低在哪低成本的账要算清楚。一块LD3320模块的市场价大概在十几块到二十几块人民币核心芯片本身更便宜。相比那些动辄上百块的智能语音模组这个价格几乎等于不要钱。你不需要外接Flash存储音频模型不需要额外的DSP也不需要专门的语音识别协处理器因为LD3320把前端的信号处理、特征提取、模式匹配都做完了。另外它的外围电路也极其简单。模块板上通常已经集成了麦克风、功放电路和喇叭接口你只要给模块供电然后用SPI接几根线到STM32就行。对比一下如果用在线语音方案你得加Wi-Fi模块、配网、处理云端鉴权、编写网络协议栈光调试时间就够你去喝好几杯咖啡了。LD3320的低成本不仅是物料成本低更是“开发时间成本”低。1.3 适合的项目场景我实际做过的和见到过的LD3320项目大概可以分为这么几类第一类是智能家居控制比如语音控制的台灯、窗帘、风扇、空调红外遥控器。这类设备的共同点是指令固定、场景固定用户离设备近非常适合离线识别。第二类是语音提醒和交互装置比如药盒提醒器、语音留言板、考勤打卡器。LD3320识别到“吃药提醒”之类的话STM32就驱动屏幕显示信息同时用语音播报模块把内容读出来形成一个完整的交互闭环。第三类是竞赛和毕业设计。每年都有大量基于STM32的毕业设计用到LD3320因为它既有技术含量又容易演示。现场评委说一句“打开电机”设备就真的动了这种直观的交互效果非常加分。2. 硬件准备与接线STM32如何接出“耳朵”2.1 模块选型与引脚说明市面上的LD3320模块很多但大多核心是一样的区别主要在板载功放、麦克风座、喇叭接口和调试LED上。我的建议是选那种带SPI接口、板载功放和喇叭接口的模块这样你只需要接4根信号线和电源线后面接个小喇叭就能出声。拿最常见的模块来说主要引脚有这些引脚名称功能说明连接到STM32VCC电源正极通常3.3V或5V3.3V或5VGND电源地GNDSCKSPI时钟SPI1_SCKPA5MISOSPI主机输入从机输出SPI1_MISOPA6MOSISPI主机输出从机输入SPI1_MOSIPA7CS片选信号低电平有效SPI1_NSSPA4软件控制RST复位引脚任意GPIO如PB0IRQ中断请求输出识别完成时为低任意GPIO如PB1SPK / SPK-喇叭输出接8Ω/1W小喇叭这里要特别强调模块上的RST和IRQ不是SPI自动管理的需要STM32用GPIO手动控制。很多新手把RST直接接高电平结果芯片复位时序不对死活初始化不了这是第一个坑。2.2 SPI方式接线四线制详解LD3320支持并行和SPI两种接口方式。对于STM32来说我强烈建议用SPI因为并行接口要占掉十几个GPIO布线麻烦而且在一些封装比较小的STM32板子上根本不够用。SPI四线制算上RST和IRQ也就六根线清爽得很。接线的逻辑是这样的STM32作为SPI主机LD3320作为从机。SCK提供时钟MOSI负责把数据从STM32发给LD3320MISO负责把LD3320的数据读回来CS用于选中芯片。我用的是STM32F103C8T6这个经典款SPI1的引脚定义固定所以接线如下SCK - PA5MISO - PA6MOSI - PA7CS - PA4 用软件GPIO控制不用硬件NSS避免和SPI模式冲突RST - PB0IRQ - PB1CS用软件GPIO控制是因为LD3320的SPI时序要求比较灵活硬件NSS有时候对不上芯片的片选要求不如GPIO直接拉低了省心。RST建议也单独用一个GPIO不要直接接电源。2.3 供电与音频输出的注意事项LD3320的工作电压一般支持3.3V很多模块板上还带了稳压给5V也能工作。但我的经验是尽量统一用3.3V给模块供电因为STM32F103的GPIO是3.3V电平如果模块在5V下工作SPI信号电平可能会有兼容性问题。喇叭选择上模块板载功放一般驱动8Ω/1W的小喇叭没问题别接太大功率的喇叭否则会过流。接线时注意喇叭正负不要接反虽然不会烧但音质会明显变差。还有一个容易忽略的点麦克风位置。LD3320的板载麦克风是驻极体麦克风它的拾音方向和灵敏度很关键。如果你把模块装在金属外壳里或者麦克风背对使用者识别率会直线下降。我在项目里一般把麦克风位置尽量靠近外壳的开孔或者用飞线把麦克风引到设备正面效果会好很多。电源滤波也要注意。LD3320在识别的时候需要相对稳定的电源如果和电机、继电器共用一个开关电源识别时电流波动容易导致误识别或者识别失败。最好在模块电源引脚旁边加一个100uF电解电容和0.1uF瓷片电容做退耦实测能明显减少误触发。3. 驱动LD3320的核心流程让芯片真正“听懂”3.1 寄存器读写基本功LD3320就像一个带了一堆寄存器的外设你通过SPI写寄存器来配置它通过读寄存器来获取状态和结果。所以驱动芯片的第一步就是把底层读写函数写好。我在工程里通常封装了这么几个函数// SPI写一个字节 void LD3320_WriteByte(uint8_t value) { while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) RESET); SPI_I2S_SendData(SPI1, value); } // SPI读一个字节 uint8_t LD3320_ReadByte(void) { while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) RESET); return SPI_I2S_ReceiveData(SPI1); } // 写LD3320寄存器 void LD3320_WriteReg(uint8_t addr, uint8_t data) { CS_LOW(); LD3320_WriteByte(0x40); // 写命令地址最高位为1 LD3320_WriteByte(addr); LD3320_WriteByte(data); CS_HIGH(); } // 读LD3320寄存器 uint8_t LD3320_ReadReg(uint8_t addr) { uint8_t val; CS_LOW(); LD3320_WriteByte(0xC0); // 读命令最高位为1次高位为1 LD3320_WriteByte(addr); val LD3320_ReadByte(); CS_HIGH(); return val; }这里有两个关键细节。第一SPI通信的字节序和命令格式必须和芯片手册完全一致LD3320读操作和写操作的第一字节不同同时地址字节后面紧跟数据字节顺序不能乱。第二CS片选要在整个读或写操作期间保持低电平一个字节一个字节地释放CS是驱动失败最常见的原因。SPI的初始化参数也有讲究。LD3320的SPI时钟频率不能太高我一般通过分频把SPI时钟控制在400kHz到1MHz左右太快的时钟会导致通信不稳定。时钟极性CPOL和相位CPHA要按芯片手册设置常见的是CPOL0、CPHA0也就是SPI模式0但如果你用的模块或者库版本不同最好以手册为准。3.2 词条写入与识别启动流程LD3320的识别流程我用大白话拆解一下第一步芯片上电后先软复位让它进入一个干净的初始状态。这有点像电脑重启后清理内存。第二步往芯片里写一些固定的PLL和时钟配置寄存器。这些值通常是芯片厂商推荐的固定配置不需要改照抄官方例程即可。它们的目的是让芯片内部的时钟和模拟前端进入正常工作状态。第三步把要识别的关键词写入芯片。这步其实是往一个FIFO缓冲区里写数据每个词条用编号代表。写入时需要先设置FIFO起始地址然后连续写入词条文本对应的拼音串最后加上结束码。第四步启动识别让芯片进入“听”的状态。之后芯片会不断检测麦克风输入一旦它认为有人在说话就会拿语音和预置词条做匹配。第五步查询中断状态。识别完成后芯片会拉低IRQ引脚或者你可以通过读寄存器来查看中断标志。如果有识别结果从结果寄存器里面读出编号再映射回对应词条完成整个逻辑。3.3 一个可直接落地的识别例程下面是我在STM32F103工程里实际用过的识别初始化代码你可以直接参考。注意这个代码是按“写词条、启动识别、等待中断、读结果”的顺序组织的核心流程都在。// 词条定义 #define CODE_SWITCH_ON 1 #define CODE_SWITCH_OFF 2 #define CODE_FAN_ON 3 #define CODE_FAN_OFF 4 // 重置LD3320 void LD3320_Reset(void) { RST_HIGH(); Delay_Ms(10); RST_LOW(); Delay_Ms(100); RST_HIGH(); Delay_Ms(100); } // 向FIFO写入词条 void LD3320_WriteData(uint8_t data) { LD3320_WriteReg(0x35, 0x04); // FIFO操作写数据 LD3320_WriteReg(0x29, data); // FIFO数据寄存器 } // 写入拼音词条kaideng void LD3320_AddKeyword(uint8_t code, char *pinyin) { LD3320_WriteReg(0x35, 0x04); // 写FIFO指令 LD3320_WriteReg(0x29, code); // 词条编号 while (*pinyin) { LD3320_WriteData((uint8_t)(*pinyin)); pinyin; } LD3320_WriteData(0x00); // 词条结束符 } // 初始化并启动识别 uint8_t LD3320_Start(void) { LD3320_Reset(); // 下面这些固定寄存器配置来自官方例程用于PLL和时钟初始化 LD3320_WriteReg(0x06, 0x07); // 软复位 Delay_Ms(10); LD3320_WriteReg(0x06, 0x04); // 解除复位 Delay_Ms(10); LD3320_WriteReg(0x88, 0x04); LD3320_WriteReg(0x89, 0x08); LD3320_WriteReg(0x8A, 0x0E); // 更完整的PLL配置建议以芯片手册的推荐值为准 // 写入词条 LD3320_AddKeyword(CODE_SWITCH_ON, kaideng); LD3320_AddKeyword(CODE_SWITCH_OFF, guandeng); LD3320_AddKeyword(CODE_FAN_ON, kaifengshan); LD3320_AddKeyword(CODE_FAN_OFF, guanfengshan); // 启动识别 LD3320_WriteReg(0x35, 0x04); LD3320_WriteReg(0x29, 0x01); // 写入固定命令表示开始识别 LD3320_WriteReg(0xB0, 0x01); // 触发识别 return 0; }实际循环里我一般这样处理while (1) { // 检查IRQ引脚是否变低表示识别完成 if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) RESET) { uint8_t status LD3320_ReadReg(0xB3); // 读中断状态 if (status 0x10) { // 有识别结果 uint8_t code LD3320_ReadReg(0x23); // 识别结果编号 switch (code) { case CODE_SWITCH_ON: LED_ON(); break; case CODE_SWITCH_OFF: LED_OFF(); break; case CODE_FAN_ON: FAN_ON(); break; case CODE_FAN_OFF: FAN_OFF(); break; default: break; } } LD3320_Start(); // 重新启动下一次识别 } // 其他任务 }这段代码虽然简化了一些细节但流程是完整能跑的。识别结果寄存器0x23里的值就是之前写入词条时对应的编号MCU拿到编号后执行相应动作这就是“听懂”的过程。3.4 词条设计的三个关键原则词条写得不好识别率再高的芯片也白搭。我踩过不少坑总结出三个原则。第一个原则是词条尽量短。两到四个汉字的效果最好比如“开灯”“关灯”“风扇”。词条越长需要匹配的语音片段越多出错的概率就越高。你要是写“请帮忙把客厅的那盏吊灯打开”芯片很容易听成别的。第二个原则是总词条数控制在50条以内。LD3320的RAM有限词条太多不仅存储压力大而且识别时计算量增大响应会变慢。对大多数DIY项目来说十到三十个词条完全够用。第三个原则是避免近音词比如“开灯”和“关灯”还好但“关风扇”和“开水扇”这种就容易混。如果实在避不开可以在词条前后加一些有区分度的词比如“启动风扇”和“停止风扇”从语音特征上拉大距离。实际测试的时候这两个词比“开风扇”和“关风扇”更容易分开。4. 给设备加“嘴巴”语音播报的两种低成本方案4.1 用LD3320自身播报先搞清楚边界很多朋友以为LD3320识别到词条后可以直接“说出”一段话其实不是。LD3320的核心能力是语音识别它在音频处理上的功能主要是采集和处理麦克风输入并不具备文本转语音TTS的能力。虽然芯片上也有音频输出路径但那是用来播放预置的语音提示音不能动态合成任意句子。所以“嘴巴”有两个方向可以走。如果你的交互只需要固定的提示语比如“已开灯”“已关灯”“温度过高请注意”可以考虑用支持TTS的语音合成模块。如果只需要简单的提示音比如“嘀嘀”两声那用LD3320模块上的功放或者一个蜂鸣器就能解决。项目里到底用哪种取决于你要播报的内容会不会变化。我个人的建议是动态内容用TTS模块固定内容用预置音频。TTS模块可以随时把一串汉字转成语音播报而预置音频适合播放固定的短句或者提示音实现更简单。4.2 接入SYN6288/WT588接线与命令要给STM32设备加一个能“说话”的模块我最常用的是SYN6288中文TTS合成模块。它通过UART串口接收文本然后直接喇叭朗读出来接线非常省事。SYN6288的典型接线如下SYN6288引脚连接到STM32VCC3.3V或5V看模块规格GNDGNDTX接STM32的USART_RX如PA10RX接STM32的USART_TX如PA9串口波特率一般默认9600。发数据的格式是固定的每个命令包以0xFD开头后面跟着数据长度、命令字和文本内容。举个例子播报“灯已打开”的发送代码uint8_t tts_buf[32]; tts_buf[0] 0xFD; tts_buf[1] 0x00; tts_buf[2] 0x08; // 文本长度 校验字节后的长度 tts_buf[3] 0x01; // 命令字合成播放 tts_buf[4] 0x10; // 编码格式GBK tts_buf[5] d; tts_buf[6] e; tts_buf[7] n; tts_buf[8] g; tts_buf[9] 0x00; // 结束符实际中如果你用汉字要把汉字转成GBK编码字符串直接存在数组里发过去就可以。SYN6288识别到结束符后就开始合成语音。这个模块的缺点是发音听起来有点机械但胜在便宜、稳定、离线可用对大多数项目足够。如果只想播放固定的WAV文件或者MP3也可以选WT588系列语音模块它支持你提前烧录好音频文件然后通过IO口或串口触发播放。比如识别到“开灯”STM32把相应IO拉一下模块就播放“灯已打开”的录音。这种方式音质可以做得很自然因为录音是真人录制或高质量的TTS生成的。4.3 用WM8960/DFPlayer等播放固定提示音除了专门的TTS模块还有一种思路是把语音播报和音乐播放结合起来。比如DFPlayer Mini这种MP3模块能把SD卡里的MP3文件编号播放。STM32通过串口发送指令就可以指定播放第几首非常适合做提示音和背景音。DFPlayer的接线也不复杂VCC接3.3V或5VGND接地TX/RX接STM32的串口。播放指令格式网上很多我常用的播放指定曲目的指令是这样的uint8_t playCmd[] {0x7E, 0xFF, 0x06, 0x03, 0x00, 0x00, 0x01, 0xFE, 0xEF}; // 参数含义起始字节、版本、长度、命令字0x03播放指定曲目、反馈、保留、曲目号、校验、结束不过要提醒一句DFPlayer Mini和LD3320一样工作电压有讲究别直接把喇叭和功放电源接错。而且SD卡格式必须FAT16或FAT32音频命名也有规则不然模块会一直“滴滴”地报错。5. STM32工程集成与代码优化5.1 工程结构怎么组织LD3320驱动只是整个STM32工程里的一部分。如果不把代码分层组织好一旦项目膨胀到几十个文件后期维护会想哭。我的习惯是把LD3320驱动单独放一个文件比如ld3320.c和ld3320.h里面只暴露几个接口void LD3320_Init(void); uint8_t LD3320_Start(void); uint8_t LD3320_GetResult(void); void LD3320_SetKeyword(uint8_t code, const char *pinyin);主程序里只需要关心状态机转换系统处于空闲状态时启动识别识别到结果后处理动作处理完再回到空闲状态。不要在主循环里堆一大堆LD3320寄存器操作那样代码根本没法看。同样TTS模块的代码也单独放一个文件比如tts.c里面封装PlayASRResult或者SayText这类函数。上层逻辑只要调用“识别然后播报”底层实现细节全部隔离这样后续换一个TTS模块改动只集中在tts.c里。5.2 中断与轮询的选择LD3320的IRQ引脚在识别完成时会拉低这是硬件发给MCU的通知。处理这个通知有两种方式轮询和中断。我的经验是轮询适合简单项目反正主循环本来就在转中断适合系统有较多任务时要及时响应的场景。轮询的缺点是MCU要不断去检查IRQ引脚如果在检查前有其他耗时任务可能会错过识别完成信号。但实际上LD3320识别完成后的结果寄存器会一直保留只要在下次启动识别前读取就来得及所以轮询大多数情况够用。如果使用中断方式建议在IRQ引脚的下降沿触发中断然后在中断服务函数里置一个标志位不做耗时操作回到主循环后再读寄存器。这是因为SPI读操作本身有时序要求放在中断里容易被打断。5.3 低功耗与实时性调优很多便携设备对功耗敏感。LD3320本身的功耗不算大但一直让它处于识别状态会持续耗电。一个比较常用的做法是默认让芯片进入低功耗模式或不启动识别只有当用户按下按键或者通过其他传感器触发时才调用LD3320_Start()让芯片开始监听。识别完后如果一段时间内没有再次触发再让芯片休眠能省不少电。还有一种做法是用定时器做超时管理。启动识别后等待IRQ比如设置2秒超时超过2秒没有识别到就重新启动识别或者进入待机这样可以避免芯片在无意义的噪音环境中长时间空转。实时性方面要注意LD3320的识别过程需要几百毫秒到一秒左右这是芯片自身的处理时间MCU改不了。但MCU可以在芯片识别期间先干别的事比如刷新屏幕、读取传感器等IRQ触发再切换过来。合理利用这段时间整个系统看起来就流畅很多。6. 常见问题与避坑实录6.1 识别成功率低怎么办这是我被问得最多的问题。识别成功率低先别急着换芯片按这个顺序排查。第一看词条。是不是词条太长、太拗口或者几个词条之间有近音冲突。我建议先把词条改成两个字的动词加名词组合比如“开启灯光”和“关闭灯光”多测几遍再慢慢扩展。第二看麦克风位置。模块麦克风如果被遮挡或者朝向不对识别率会掉得吓人。我遇到过把模块放盒子里结果识别率从90%掉到30%的情况后来在盒子上开了一个小孔才恢复正常。麦克风一定要“见光”也就是要能直接接收到用户的声音。第三看电源纹波。如果识别时其他设备在动作比如继电器吸合电源一瞬间跌落LD3320的模拟前端就会出错。给模块单独加一颗LDO电源端加100uF电解电容通常能解决。第四看环境噪声。LD3320对稳态背景噪声有一定抑制能力但如果背景里有电视声、音乐声或者有人在旁边说话误识别的概率会明显增加。这种场景下只能通过设计交互方式来规避比如要求用户先喊一个唤醒词再下达指令避免环境噪声直接把控制指令“带偏”。6.2 芯片发烫/不开机LD3320正常工作温度应该只是微温如果发烫厉害十有八九是电源引反了或者电压过高。模块上一般有防反接二极管但如果你自己搭板子一定要检查VCC和GND。还有一种情况是模块上电后IRQ引脚一直为低看起来像没开机。这通常是因为RST引脚没有正确的复位时序。LD3320上电后必须有一个完整的复位过程才能进入正常工作状态如果芯片卡在某个状态IRQ就会异常。处理方法是检查RST的接法和控制代码确保先拉低再拉高中间延时足够。6.3 与STM32的SPI通信失败排查SPI通信失败是最让人头大的问题因为它不报错只是所有寄存器读写都不对。我的排查顺序是第一用万用表量SPI引脚的电平确认MOSI、SCK在通信时确实有跳变。如果SCK一直不动问题出在STM32的SPI初始化上。第二确认CS是否在整个读写期间保持低电平。可以先用GPIO点灯的方式在CS拉低和拉高之间加一个LED翻转看时序是否正常。第三检查SPI时钟极性CPOL和相位CPHA。LD3320一般用SPI模式0但如果你复用了其他外设或者改了SPI配置很容易出错。最好的办法是在逻辑分析仪上抓一下波形对比芯片手册确认数据是否在正确时钟沿被采样。第四如果读回来的数据都是0xFF很可能是MISO没接对或者SPI速率过快。适当降低SPI时钟分频比如从8分频改成16分频能解决很多“看起来很难找”的通信问题。6.4 经验速查表问题可能原因解决办法识别成功率低词条过长或近音冲突缩短词条控制在2~4字避免近音识别灵敏度忽高忽低电源波动或MIC位置不对加退耦电容外引MIC到设备正面SPI读写返回全0xFFMISO接触不良或电平不匹配检查接线确认3.3V电平域IRQ一直为高芯片未启动识别或复位失败检查RST时序确认调用LD3320_Start()IRQ一直为低芯片上电异常或死机重新上电检查电源和复位电路模块发烫电源引反或电压过高立即断电检查VCC/GND播报无声音喇叭接错或功放未使能检查SPK接线确认功放电源6.5 调试时最好用的三板斧调试LD3320项目时我最常用的三个工具是逻辑分析仪、串口打印和LED指示灯。逻辑分析仪用来抓SPI波形看命令字节、地址字节和数据字节是否和预期一致。很多SPI问题肉眼根本看不出来但波形一抓就原形毕露。串口打印用来输出识别结果状态每执行一步就打印一条日志比如“Start recognition”“Get result code 1”这样你可以对着日志定位代码走到哪一步。LED指示灯是最朴素的调试手段在IRQ触发、识别完成、动作执行这些关键节点上点一个LED不需要任何调试器就能看到程序运行脉络。这三个手段组合起来就算LD3320和STM32接口出问题半小时内基本都能定位到原因。7. 后续还能怎么扩展如果你已经跑通了“LD3320识别关键词 STM32执行动作 TTS播报结果”的完整链路那恭喜你你已经掌握了一套非常实用的离线语音交互框架。这之后还能玩出很多花样。可以接OLED或LCD屏把识别到的指令实时显示出来做成一个可视化交互面板。可以加温湿度传感器让语音控制系统和传感器联动比如你说“报告温度”设备就播报当前的温湿度。可以和ESP8266或ESP32联动让离线语音识别到的结果通过局域网转发给其他智能设备实现全屋语音控制。我之前还试过把LD3320和鱼缸控制系统结合起来通过语音控制水泵、灯光和喂食器这就是网上很火的“STM32鱼缸”方向整体成本非常可控效果却很有科技感。你也可以往这个方向拓展语音识别只是一个入口真正的价值在于后面接的设备生态。最后再说一句个人的体会LD3320这套方案的定位从来不是“无所不能的AI”而是“固定场景下低成本、高可靠的语音交互”。把词条设计好、供电做好、交互逻辑理清楚它的稳定性完全可以满足日常项目需求。只要方向对了剩下的事情就是动手试错而已。
返回列表