使用启英泰伦离线语音模块制作的一个智能语音小黄人。配合一个MP3-TF-16P模块实现播放离线音频资源,例如儿童音乐和童话故事,还能模仿消防车、警车、救护车,还有彩灯和小夜灯功能。
本项目示例语音内容:
1. 你好、晚安
2. 小黄人魔性笑声
3. 模仿消防车、警车、救护车
4. 儿童诗歌朗诵
5. 成语故事
6. 童话故事
7. 儿歌
8. 童声歌曲
9. 播放特定歌曲
其他功能:
RGB彩灯,小夜灯,眼部运动,播放音频眼睛LED律动
原创首次公开。
GPL3.0
离线语音识别使用启英泰伦的CI-C22GS02S模块,为了实现TF卡离线资源的播放,配合使用了型号为MP3-TF-16P的MP3模块,由语音模块通过串口1来发送命令进行控制。。
本项目经过了4个版本的迭代:
- 第一版测试了基本功能,但是LED律动功能不正常。
这个版本使用了两个喇叭,一个用于语音模块响应词的播放,一个用于MP3模块资源的播放。MP3模块喇叭输出设计了一个倍压电路,用于音频LED律动。但是因为串联了LED而且电压不足的原因,安装到外壳内部之后效果几乎看不到。
- 第二版将LED律动倍压电路电容更改为电解电容,但是仍然效果不好。
- 第三版在软件和硬件上都进行了进行了大幅改进:
-
- 直接使用MP3模块播放响应词,这样可以移除语音模块的喇叭,将原先的2个喇叭减少为1个。响应词播放音质也比使用语音模块播放有了较大提升。由此带来的另外一个好处是如果不变更命令词,而仅仅更新播报词,那么无需重新编译和烧录固件,只需更新MP3模块对应的播报词音频文件即可。
- LED律动倍压电路改为4倍压,律动功能可以正常工作了(参见演示视频)。
- 增加语音命令反馈眼部的物理运动。通过控制一个小型电磁铁来实现。第一次设计有一个小bug,割线+飞线后调试成功。第四版修复了此线路问题。
- 增加了TP4056锂电池充电电路。
- 增加了RGB彩色LED灯带,其中三个灯珠放在背面向外发光,其他灯珠在内部发光。RGB彩灯代码使用了官方SDKcolor_light组件的部分代码,但是移除了HSV相关代码,因为加入HSV代码之后引入了math库,会导致固件体积过大而编译报错。
- 增加警灯、彩灯、小夜灯功能。
- 增加了一个电源钮子开关。
- 为了实现以上功能,语音模块所有可用的GPIO都利用上了。包括RX0/TX0/RX1/TX1/MCLK和三路PWM。
- 第四版进行了如下升级:
a. 修复了电磁铁电路的问题。
b. 调整了RGB LED的插座类型。
c. 增加了RGB LED的数量。
d. 小夜灯同时打开RGB灯带和眼部LED。
e. MP3 BUSY引脚增加一个跳线,烧录的时候需要断开此引脚,否则烧录的时候会干扰串口导致固件下载失败。
f. 晚安自动打开小夜灯。 - 为了不再改动第三版的PCB面积,第四版将非常少量的元件贴在了背面。
离线资源均包括播报音的音频文件均放置在MP3模块的TF卡上,相同类型的音频资源放在同一个文件夹下,语音模块通过串口命令控制MP3模块播放指定文件。
1. 到启英泰伦AI平台注册账号。
3.如下图所示,选择左侧菜单栏的“开发资料”,进入开发资料主界面;
4. 第三步:如下图所示,选择“软件和固件(SDK开发包,标准Demo固件等)”;
5. 选择您需要下载的SDK版本,如下图所示(此图以“CI112X_SDK_V1.2.9”为例);
6.如下图所示,点击”CI112X_SDK_V1.2.9.zip”进行下载操作;
7. 如下图所示,等待加载完成后,进行文件的另存;
请注意:加载的过程当中请勿退出或者刷新界面,否则制作进度将会终止!
8. 选择指定文件夹存放SDK压缩包;
获取IDE
官方已经配置好了一个绿色版的Eclipse,在“开发资料”-“相关工具及手册”页面,获取百度网盘下载地址。
软件开发
将下载的Eclipse IDE 和 SDK 分别解压(注意必须是英文文件夹),然后使用Eclipse导入SDK项目,即可开始开发。
关键是修改user_msg_deal.c文件,根据cmd_id执行函数。cmd_id就是“语言模型”中“命令词列表”前面的序号,其中cmd_id从2开始即为命令词(cmd_id=1是唤醒词)。
语音模块使用的是freeRTOS,编程语言是C语言。
核心业务逻辑代码如下所示:
play_chengyu()这个函数我做了很多封装,但是实质是循环播放一个文件夹(文件夹参数dir是数字形式的文件夹名称,我把相同类型的文件放在数字文件夹里面,比如01,02,03,04,这是MP3模块对文件访问的要求)。
从串口发送命令的函数如下:
其中校验计算部分可以参考MP3模块文档的调试手册。
语音模块SDK开发更多内容请参考启英泰伦AI平台文档。
创建语言模型
详细内容可以参考文档中心的新手指南相关部分
首先进入启英泰伦AI平台,左侧菜单栏中选择语言模型,点击创建,进入语言模型制作主界面。
英文样例如下图:
日文样例如下图:
保存后即可下载声学模型和语言模型,声学模型只需要第一次下载然后合并到固件即可。未来如果同一产品的命令词有更新,只需重新建立一个语言模型,然后再次下载并更新语言模型即可,声学模型可以保持不变。
播报音合成
点击左侧的菜单中的“播报音合成”进入该模块,如下图所示:
请用户参考如下流程进行操作(注意下方数字标识对应下图中的数字标识),便可进入定制播报音的主界面:
- ①选择菜单栏左侧的“播报音合成”按键
- ②点击创建,即可进入主界面。
- ①语音合成项目名称:用户填写对应的项目名称;
- ②语言类型:目前提供中文以及英文播报音制作;
- ③人声分类:目前提供成年男声,成年女声,男童声,女童声这四种人声制作;
- ④语速:有20个等级,默认等级为10,等级越高语速越快;
- ⑤合成人声:选择完成人声分类后,选择对应的人声;
- ⑥下载样例:选择语言类型后,提供制作表格样例的下载链接;
- ⑦音量:有20个等级,默认等级为10,等级越高音量越大;
- ⑧语音合成文件上传:用户可以按要求的格式将希望生成播报音的词条填入一个文件中,按此按钮上传到平台中,平台使用该文件制作对应的播报音;
- ⑨试听样音:用户可以根据自己的合成人声进行样音试听;
- ⑩填写说明:用户可以及时查看相应的说明;
- ⑪保存or丢弃:确认无误后,选择保存,进行固件生成。
- 该功能窗口可将文本批量转换成SDK中需要的播报语音。
- 根据需求选择相应的参数,点击试听按钮试听。
- 标注“推荐“字样的为推荐发音人。
- 语速:0最快-20最慢,推荐值10。
- 音量:0最小-10最大,推荐值10。
注意
- 上传的EXCEL中,第一列为音频序号,第二列为音频名,第三列为待合成文本。
- 音频名不宜过长且不能包含空格,待合成文本不宜超过四十字。
- 现仅支持上传EXCEL文件,请在“样例中”下载EXCEL模板。
传的播报音样例文件格式模板可以通过创建表单界面中的“下载样例”获取。用户可以按照该模板的格式,填写需要的播报语句,以及其内容,保存后上传。
中文的样例如下图所示:
英文的样例如下图所示:
用户在合成播报音时,需先新建表单,填写好表单中对应的内容,如下图所示:
填写完成后,点击“上传你的文件”,上传已经按照规范做好的excel文件。
上传完成后,点击左上角的“保存”按键;
等待文件被平台加载;
请注意:加载的过程当中请勿退出或者刷新界面,否则制作进度将会终止!
播报音合成成功后,选择“下载语音合成文件”,便可得到生成的播报音。
1. 打开下载的语言模型文件夹中 CmdWordStructure 目录下配置文件[60000]{cmd_info}.xls
2. 将<0>cmd这个表格中的“播报音1ID”,改为从0开始依次递增。如果你需要开机播放欢迎语,那就把<welcome>一行的播报音ID改为一个与表格上方不重复的数字,本例中改为68。<Inactive>和<beep>播报音ID改为文件名前缀不会使用的一个大数字,比如1000。
3. 将<1>wake表格中的“播报音1ID”的第一行改为0,即唤醒词“小黄人”的对应播报音ID为0,与第一个表格一致。如果你需要开机播放欢迎语,那就把<welcome>一行的播报音ID改为<0>cmd表格中<welcome>一行相同的播报音ID,上面是68,所以这里也是68。<Inactive>和<beep>播报音ID改为文件名前缀不会使用的一个大数字,比如1000。
解压上面合成并下载的播报音压缩文件,里面的文件名前缀应该是对应了上面那个<0>cmd表格中的播报音ID。
如果你在上面设置了欢迎语播报音ID,也可以在上面播报音合成步骤,将它加入播报音合成列表。或者也可以使用一段音乐作为开机欢迎语,关键是要将它的前缀改为<welcome>那一行设置的播报音ID,在上例中我们设置开机欢迎语播报音ID为68,那么开机欢迎语的文件名就应该是"[68]开机欢迎.wav"或者"[68]开机欢迎.mp3"。
注:上述步骤是将播报音合成到固件中。而本项目中使用MP3模块播放所有播报音,所以本项目是把所有播报音放在TF卡上,由操作系统发出命令来控制MP3模块播放指定文件。虽然我使用MP3模块播放播报音,但是固件合成仍然需要对应的播报音(既然实际不使用模块播报,可以使用任意的文件替代,但是不能没有),如果固件内缺少播报音会无法正常运行。播放指定文件夹串口命令,请参考上文代码。
- 语言模型压缩包内各文件夹说明
CmdWordStructure:该文件夹存放的内容为{cmd_info}表格,为用户词条置信度相关参数配置文件;
GfstCmd:该文件夹存放的内容为平台生成的命令词模型文件;
GfstWake:该文件夹存放的内容为平台生成的唤醒词模型文件;
- 语言模型文件替换方式
SDK语言模型文件夹位置:CI112X_SDK_ASR_Offline_V1.x.xsampleinternalsample_110xfirmware
用户将下载的语言模型文件夹中 GfstCmd 以及 GfstWake 这两个文件夹里的[0]asr_chinese_SE292_CI1122_normal.dat和[1]asr_chinese_SE292_CI1122_normal.dat文件替换SDK语言模型文件位置内的asr文件夹里的内容。
用户将下载的语言模型文件夹中 CmdWordStructure 目录下配置文件[60000]{cmd_info}.xls,放入SDK语言模型文件夹位置的 user_filecmd_info 内并替换原先的内容;(文件名必须要"[60000]"开头,可以改为类似"[60000](小黄人{cmd_info}.xls"之类的名称)
- 声学模型文件替换方式
SDK声学模型文件夹位置:CI112X_SDK_V1.x.xCI112X_SDKsampleinternalsample_1122firmwarednn
用户将下载的声学模型里的内容放到SDK声学模型夹位置内,替换SDK原有的内容,即可使用。
- 播报音文件替换
文件夹位置:CI112X_SDK_ASR_Offline_V1.x.xsampleinternalsample_110xfirmwarevocie
用户将新生成的播报音文件放入上述指定的目录中。
在烧录前需要先将USB转串口的电源地(GND)、串口(TXD、RXD)收发引脚分别和模块对应的引脚连接起来,注意USB转串口的RXD和TXD分别对应模块的UART0_TX和UART0_RX。
1. 第一步:打开“合成分区bin文件.bat”;
2. 第二步:如下图所示,合并分区时会提示选择音频格式,新手用户请选择“adpcm”,选择完成后,按回车键,待加载完成后,该界面会自动关闭;
3. 第三步:打开“打包升级.bat”;
4. 第四步:选择您购买的开发板对应的芯片型号(此操作为第一次使用出现,后续使用请直接进行第五步);
5. 第五步:确认好芯片型号后,点击“固件打包”按钮,进入升级界面;
6. 第六步:固件升级信息填写:
-
在版本信息区填写软硬件相关信息。
-
选择或填写各分区bin文件路径。
-
点击“刷新地址”,点击“打包固件”。
-
如果弹窗提示地址冲突,调整各分区大小,重新执行上一步。
- 弹窗提示“固件已生成”表示打包成功。如下图所示
第一步:打开“打包升级.bat”;
第二步:选择您购买的开发板对应的芯片型号(此操作为第一次使用出现,后续使用请直接进行第三步);
第三步:确认好芯片型号后,点击“固件升级”按钮,进入升级界面;
第四步:固件升级
- 选择或填写固件路径。
- 勾选待升级的设备所连接的串口。
- 其他选择:强制更新所有分区,鉴权文件,加密。
- 待升级模块切换到升级模式(短接PG、EN两个引脚)。
- 重启待升级设备或者给设备重新上电,开始升级。
- 等待升级完成,如果顺利的话,升级成功后会进度条会显示100%, 表示更新成功,设备会自动引导进固件代码,如果有上电播报音,能听到上电播报。
- 首次烧录固件时间会较长,以后再次烧录就只会更新固件有改动的部分。
- 如果烧录过程中不小心断电,可能会导致下次烧录后无法正常工作,此时勾选“强制更新所有分区”即可。
PCB裸板及Logo验证。
演示视频请参看B站链接,文件太大无法上传。
https://www.bilibili.com/video/BV1V34y1X7jH/