• [问题求助] 【cc-gateway】【cc-gateway-接口开发,通过接口放音】
    【功能模块】IVR中通过呼叫转移到一个已签入坐席后,坐席应答时,首先播报一段工号XXX,为您服务的note语音提示。【操作步骤&问题现象】应答已通过系统集成后,事件监听处理,目前was服务器上可配置这段语音,但是工号是was服务器上坐席工号,需要调整为我们自己系统的工号。不知道如何实现?【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [行业资讯] 路灯控制器物联网卡资费如何?
    城市照明是是现代城市形象的重要组成部分,随着城市夜景多样化和规模扩大,传统的人工控制远远无法满足更高效的运营管控和更节能环保的迫切需求,安装路灯控制器物联卡的智能路灯更高效管理运营方式广受欢迎。一、路灯控制器物联卡对路灯来说有什么作用?我们都知道物联网卡是三大运营商发布针对企业用户用于智能硬件设备联网的卡,不支持语音通话和发短信,而路灯控制器物联卡就是应用于路灯控制器设备上的流量卡。可以使路灯控制器连接网络,实现远程数据传输、远程控制路灯,实现路灯的智能化管控。二、路灯控制器物联卡稳定吗?物联网卡采用独立网元,专用号段,能够更好的传输数据信息,指令等,远程控制灯光效果。三、路灯控制器物联卡的资费?物联卡是专用于智能硬件设备的行业卡,没有语音通话功能和短信功能,因此资费相对比较便宜,并且路灯控制器主要是为了给路灯联网传输数据指令,消耗的流量也少。四、路灯控制器物联卡的购买渠道?路灯控制器物联网的购买渠道有两种,一种是运营商处一种是物联卡代理平台。先来说说运营商处购买,不用多说,好处是正规,不太建议量少客户;在来说说物联卡代理平台,因其性价比高,福利政策多,比较受欢迎,能给企业用户提供管理平台和增值服务。物联卡市场复杂,小编建议采购时选择资质深、跟三大运营商有直接合作的大平台处购买。
  • [技术干货] 基于STM32设计的智能家居控制系统(华为云IOT+语音控制+环境检测)
    这是基于物联网设计的语音和环境检测的控制系统,支持本地语音控制、支持云端远程控制,支持本地环境检测自动执行控制,根据环境检测结果控制相应的执行机构协作当光照低于一定程度(比如低于5OLux)且有人在家里自动开灯,没人在家时自动关灯等等。 ## 1. 前言 如今的智能家居越来越深入人心,越来越受人们的欢迎。智能家居作为与人们日常生活息息相关的科技智能产物,可以给我们的生活带来舒适便利。随着物联网、云计算、无线通信等新技术的发展,智能家居得到了快速发展,能让用户利用智能手机来控制家中的设备,实现远程控制、场景控制、联动控制和定时控制等功能。在安全防护上,智能家居安防系统则够在原来的基础上提供立体化防护,帮助用户时刻守护住宅安全,更符合人们的安全需求。节能减排方面的也有积极作用。比如说,智能家居照明系统,它充分利用了自然光的照明作用,自动调节灯具的亮度,在保证室内明亮度的同时,将能耗降到最低,而对于洗手间、储藏室等地方,更是做到了人来灯亮、人走灯灭,一方面方便了用户的日常生活,另一方面也能防止用户忘记及时关灯而造成浪费。 ## 2. 设计要求总结 设计题目:基于物联网的语音和环境检测的智能家居控制系统设计 第一种:控制方式需经结合语音命令控制, **控制开关门、灯、电视、开关空调、开关电扇、开关窗帘等。** 第二种:控制方式是基于环境检测自动执行控制,根据环境检测结果控制相应的执行机构协作,比如: 当光照低于一定程度(比如低于5OLux)且有人在家里自动开灯,没人在家时自动关灯;如温度高于阈值并且有人在家时打开空调,没人在家时自动关闭等;如光照强度低于一定程度会自动关闭窗帘。电脑和手机APP两端云平台可以展示温湿度,光照等信息,还有各家居的状态,可以在云平台控制家居的开关,可以在云平台进行两种控制方式的切换。 **技术选项总结:** (1)物联网平台采用华为云IOT:华为云IOT是华为旗下的物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接,快速完成产品开发部署,为智能硬件、智能家居产品提供完善的物联网解决方案。 (2)主控芯片采用:STM32F103C8T6 (3)语音控制芯片采用:LD3320 支持普通话识别。 (4)开关空调、开关风扇 采用继电器模拟:两个1路5V继电器控制 (5)开关窗帘采用步进电机模拟: 28BYJ4步进电机模拟 (6)室内照明灯(卧室、客厅):2盏 3W大功率LED灯模拟 (7)环境光检测检测:BH1750数字传感器 (8)联网的WIFI :选择ESP8266 (9)OLED屏幕:模拟电视显示 (11)温湿度检测:DHT11模块 **其中:** (1)STM32主控芯片、语音控制芯片LD3320、室内照明大功率LED灯、环境光检测BH1750、ESP8266-WIFI 通过排母插在PCB板子上。 (2)步进电机UL2003驱动板、继电器 使用排针外接。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611484616986572.png) **上位机运行效果:** ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655614493914243610.png) ## 3. 硬件选型 ### 3.1 STM32F103C8T6 STM32F103C8T6是一款基于ARM Cortex-M 内核STM32系列的32位的微控制器,程序存储器容量是64KB,需要电压2V~3.6V,工作温度为-40°C ~ 85°C。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611521515764837.png) ### 3.2 语音识别模块: LD3320 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611532055419734.png) ### 3.3 ESP8266 -串口WIFI ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611540864773305.png) ### 3.4 LED灯-RGB灯 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611551893936618.png) ### 3.5 3W大功率LED灯 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611565027307360.png) ### 3.6 OLED模块 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611574863185270.png) ### 3.7 步进电机模块 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611587964406841.png) ### 3.8 继电器模块 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611595994187180.png) ### 3.9 杜邦线(母对母) ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611604689314411.png) ### 3.10 红外寻迹/循迹模块 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611614059429511.png) ### 3.11 温湿度-DHT11 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611626220730833.png) ### 3.12 BH1750光敏传感器 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611635443201761.png) ## 4. 华为云创建产品与设备 ### 4.1 创建产品、配置产品模型 华为云官网: [https://www.huaweicloud.com/](https://www.huaweicloud.com/) 在产品选项框里找到华为云的IOT产品。选择`设备接入 IoTDA` ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655614648462368380.png) **设备接入 IoTDA:** [https://www.huaweicloud.com/product/iothub.html](https://www.huaweicloud.com/product/iothub.html) ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655614744295859753.png) 点击产品页面,先创建产品。产品一个项目的模型,产品下面可以创建多个具体的设备。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655614782785763071.png) 根据自己的实际产品信息填充。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655614848404647629.png) 创建成功。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655614869058123831.png) 查看产品的详情。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655614896155565677.png) 在详情页,创建产品的模型。这个产品的模型就是传感器数据的属性,根据自己上传的传感器数据实际创建。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655614922241791340.png) 创建自定义模型。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655614999948871350.png) ```cpp 服务ID SmartHome 服务类型 SmartHome 服务描述 智能家居 ``` 添加属性。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655615086032358484.png) 接来来根据自己设备的实际情况添加属性即可。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655615130343232634.png) 所有的属性创建完毕,属性的名字可以使用中文。但是要注意,设备上传时,中文数据的编码要正确,否则会乱码。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655615301757521452.png) ### 4.2 创建设备 接在在左边选项页面选择设备,创建一个设备。 设备可以调用API在程序里自动创建也可以的。 地址: [https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/device/all-device](https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/device/all-device) ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655615463722268721.png) 单设备注册。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655615518494453085.png) 注册之后,保存设备信息,接下来生成MQTT参数需要。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655615532973948329.png) ```cpp { "device_id": "62aead8b538e623c4287ef43_Smart_home_dev_1", "secret": "12345678" } ``` ## 5. MQTT协议登录 ### 5.1 MQTT服务器地址信息 ```cpp 华为云物联网平台的域名是: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com 华为云物联网平台的IP地址是: 121.36.42.100 端口号是 1883 ``` ### 5.1 MQTT订阅主题,发布主题 帮助文档:[https://support.huaweicloud.com/iothub/index.html](https://support.huaweicloud.com/iothub/index.html) ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655616047438951722.png) ```cpp 格式: $oc/devices/{device_id}/sys/messages/down //订阅主题: 平台下发消息给设备 $oc/devices/62aead8b538e623c4287ef43_Smart_home_dev_1/sys/messages/down 格式: $oc/devices/{device_id}/sys/properties/report //设备上报数据 $oc/devices/62aead8b538e623c4287ef43_Smart_home_dev_1/sys/properties/report 上属性的数据格式: //上报的属性消息 (一次可以上报多个属性,在json里增加就行了) {"services": [{"service_id": "SmartHome","properties":{"空调":1}}]} ``` ### 5.2 MQTT参数生成 设备创建完成接来下生成MQTT登录账号、密匙,方便设备登录云端平台。 官网工具地址:[ https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/]( https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/) ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655616082722954994.png) ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655616102514319232.png) ```cpp ClientId 62aead8b538e623c4287ef43_Smart_home_dev_1_0_0_2022061905 Username 62aead8b538e623c4287ef43_Smart_home_dev_1 Password 1052c27bd7ccce57b316005a677f50291cf4a50fc90e0bb1c33dee6beda1ae53 ``` ### 5.3 MQTT客户端模拟登录测试 MQTT客户端下载地址: [https://download.csdn.net/download/xiaolong1126626497/18784012](https://download.csdn.net/download/xiaolong1126626497/18784012) 在MQTT工具里填上MQTT的登录参数,主题发布、订阅信息进行登录测试。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655616277239373829.png) 然后打开设备页面,可以看到设备已经在线了。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655616351384218952.png) 并且在设备页面详情里可以看到刚才上传的数据。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655616394695636600.png) 主题发布时,一次可以上传多个状态。 例如: ```cpp {"services": [{"service_id": "SmartHome","properties":{"空调":1,"风扇":1,"电视":0,"卧室灯":1}}]} ``` ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655616484447749815.png) ## 6. LD3320语音识别模块编程 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611725992215257.png) 下载程序示例。 将开发板的串口通过USB转TTL模块连接电脑即可。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611742117493271.png) 波特率是9600,语音识别时,想要说`小杰`,唤醒语音识别,然后再说出指令,唤醒语音识别就,模块上有一个红色的LED灯会亮。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611759958979893.png) **当前支持的指令如下:** ```cpp 小杰,开卧室灯 小杰,关卧室灯 小杰,开客厅灯 小杰,关客厅灯 小杰,打开电视 小杰,关闭电视 小杰,打开风扇 小杰,关闭风扇 小杰,打开窗帘 小杰,关闭窗帘 小杰,打开空调 小杰,关闭空调 ``` ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611778420798578.png) ## 7. STM32设备端开发 ### 7.1 程序下载 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611815867426325.png) ### 7.2 原理图 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611835725398097.png) ### 7.3 硬件接线 ```cpp 本设计的硬件接线说明: (1)OLED显示屏接线: D0----(SCK)------------------->>PB14 D1----(MOSI)------------------>>PB13 RES—(复位脚低电平有效)-------->>PB12 DC--(数据和命令控制管脚)------>>PB1 CS--(片选引脚)---------------->>PA7 GND--------------------------->>GND VCC--------------------------->>3.3V或者5V (2)ATK-ESP8266 WIFI接线 PA2(TX)--RXD 模块接收脚 PA3(RX)--TXD 模块发送脚 GND---GND 地 VCC---VCC 电源(3.3V~5.0V) (3)LD3320语音识别模块接线说明 GND----GND VCC---3.3V PB11----LD3320语音模块_TX PB10----LD3320语音模块_RX (4)开关空调:1路5V继电器控制 PA6------LED (5)开关风扇:1路5V继电器控制 PA4------LED (6)开关窗帘采用步进电机模拟: 28BYJ4步进电机模拟 ULN2003接线: IN-D: PB5 d IN-C: PB4 c IN-B: PB3 b IN-A: PB2 a + : 5V - : GND (7)卧室照明灯:一盏3W大功率LED灯模拟 PB8------LED (8)客厅照明灯:一盏3W大功率LED灯模拟 PB9------LED (9)环境光检测检测:BH1750数字传感器 SDA-----PB7 SCL-----PB6 GND---GND 地 VCC---VCC 电源(3.3V~5.0V) (10)温湿度传感器: DHT11 VCC--VCC GND---GND DAT---PA5 (11)红外寻迹/循迹模块 VCC--3.3V GND---GND DAT---PA8 (--)板载LED灯:低电平亮 LED1--PC13 BEEP2--PC14 (--)板载按键: KEY1--PA0 按下为高电平 ``` ### 7.4 核心代码 连接华为云服务器采用ESP8266WIFI,加上MQTT协议实现数据通信。标准的ESP8266本身不带MQTT协议栈,也就是说ESP8266默认是没有MQTT协议相关的指令,不能直接通过指令连接MQTT服务器通信,但是也可以自己烧写第三方的SDK,用于支持MQTT指令。 我这里的代码是自己实现的MQTT协议,包括我的其他物联网相关的文章里,只要用到ESP8266的都是自己写的MQTT协议,也就是在代码里实现了MQTT协议栈,使用ESP8266普通的TCP相关的指令就可以完成数据传输,不依赖于ESP8266的SDK版本,任何ESP8266都可以直接使用,为的就是方便移植,通用--通用-通用。 ESP82+STM32实现的MQTT协议栈工程在这里,如果需要带完整MQTT协议工程的可以去这里下载。 这份工程里实现了ESP8266与华为云IOT平台实现数据交互,数据通信,也就是登录、主题发布、订阅,心跳包等操作。 [https://download.csdn.net/download/xiaolong1126626497/58012912](https://download.csdn.net/download/xiaolong1126626497/58012912) ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655611912683781454.png) ```cpp #include "stm32f10x.h" #include "delay.h" #include "led.h" #include "key.h" #include "sys.h" #include "usart.h" #include #include #include "timer.h" #include "oled.h" #include "fontdata.h" #include "esp8266.h" #include "app.h" #include "mqtt.h" #include "iic.h" #include "bh1750.h" #include "dht11.h" #include "motor.h" /* 本设计的硬件接线说明: (1)OLED显示屏接线: D0----(SCK)------------------->>PB14 D1----(MOSI)------------------>>PB13 RES—(复位脚低电平有效)-------->>PB12 DC--(数据和命令控制管脚)------>>PB1 CS--(片选引脚)---------------->>PA7 GND--------------------------->>GND VCC--------------------------->>3.3V或者5V (2)ATK-ESP8266 WIFI接线 PA2(TX)--RXD 模块接收脚 PA3(RX)--TXD 模块发送脚 GND---GND 地 VCC---VCC 电源(3.3V~5.0V) (3)LD3320语音识别模块接线说明 GND----GND VCC---3.3V PB11----LD3320语音模块_TX PB10----LD3320语音模块_RX (4)开关空调:1路5V继电器控制 PA6------LED (5)开关风扇:1路5V继电器控制 PA4------LED (6)开关窗帘采用步进电机模拟: 28BYJ4步进电机模拟 ULN2003接线: IN-D: PB5 d IN-C: PB4 c IN-B: PB3 b IN-A: PB2 a + : 5V - : GND (7)卧室照明灯:一盏3W大功率LED灯模拟 PB8------LED (8)客厅照明灯:一盏3W大功率LED灯模拟 PB9------LED (9)环境光检测检测:BH1750数字传感器 SDA-----PB7 SCL-----PB6 GND---GND 地 VCC---VCC 电源(3.3V~5.0V) (10)温湿度传感器: DHT11 VCC--VCC GND---GND DAT---PA5 (11)红外寻迹/循迹模块 VCC--3.3V GND---GND DAT---PA8 (--)板载LED灯:低电平亮 LED1--PC13 BEEP2--PC14 (--)板载按键: KEY1--PA0 按下为高电平 */ //物联网服务器的设备信息 #define MQTT_ClientID "dev1" #define MQTT_UserName "507546" #define MQTT_PassWord "version=2018-10-31&res=products%2F507546%2Fdevices%2Fdev1&et=1680445911&method=md5&sign=qgaS0NCoxqSnIFZGL%2Fz81Q%3D%3D" //订阅与发布的主题 #define SET_TOPIC "$sys/507546/dev1/#" //订阅 #define POST_TOPIC "$sys/507546/dev1/dp/post/json" //发布 //设置连接的路由器信息 #define CONNECT_WIFI "DS小龙哥" //将要连接的路由器名称 --不要出现中文、空格等特殊字符 #define CONNECT_PASS "12345678" //将要连接的路由器密码 #define CONNECT_SERVER_IP "183.230.40.96" //服务器IP地址 #define CONNECT_SERVER_PORT 1883 //服务器端口号 char mqtt_message[100]; //WIFI发送数据存储区域 char data_buff[500]; u8 esp8266_state=0; double Longitude=120.196517; //经度 double latitude=30.194493; //纬度 float bh1750=0; u8 dht11_temp; u8 dht11_humidity; u8 sw1=0; u8 sw2=0; u8 sw3=0; u8 sw4=0; u8 sw5=0; u8 sw7=0; /* 主函数: 程序执行的入口 */ int main(void) { u8 dian_shi=0; //1表示电视开 0表示电视关 u8 mode=0; //0 表示手动模式 1表示自动模式 u32 i=0; u8 key_val; u32 TimeCnt=0; u32 wifi_TimeCnt=0; JTAG_Set(); USART1_Init(115200); //串口1的初始化 USART2_Init(115200); //串口-WIFI TIMER2_Init(72,20000); //超时时间20ms USART3_Init(9600); //串口-语音模块 TIMER3_Init(36,20000); //超时时间20ms //板载按键初始化 KEY_Init(); //板载LED灯初始化 LED_Init(); //外接LED初始化 LED2_Init(); //BH1750的IIC接口 IIC_Init(); //初始化DHT11 DHT11_Init(); //步进电机初始化 Moto_Init(); //初始化 APP_Init(); printf("正在初始化OLED...\r\n"); OLED_Init(0xc8,0xa1); //OLED显示屏初始化--正常显示 OLED_Clear(0x00);//清屏 printf("正在初始化ESP8266..\r\n"); for(i=0;i5;i++) { if(ESP8266_Init()==0) { esp8266_state=1; break; } else { esp8266_state=0; printf("ESP8266硬件检测错误.\n"); } } if(esp8266_state) { printf("准备连接服务器....\r\n"); //非加密端口 printf("WIFI:%d\n",ESP8266_STA_TCP_Client_Mode(CONNECT_WIFI,CONNECT_PASS,CONNECT_SERVER_IP,CONNECT_SERVER_PORT,1)); //2. MQTT协议初始化 MQTT_Init(); //3. 连接服务器 for(i=0;i5;i++) { if(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord)==0) { esp8266_state=1; break; } esp8266_state=0; printf("服务器连接失败,正在重试...\n"); delay_ms(500); } printf("服务器连接成功.\n"); //3. 订阅主题 if(MQTT_SubscribeTopic(SET_TOPIC,0,1)) { printf("主题订阅失败.\n"); } else { printf("主题订阅成功.\n"); } } ........ ........ ........ ........ ``` ## 8. QT上位机软件开发 ### 8.1 应用层下发的指令 为了更方便的展示设备数据,与设备完成交互,还需要开发一个配套的上位机,官方提供了应用侧开发的API接口、SDK接口,为了方便通用一点,我这里采用了API接口完成数据交互,上位机软件采用QT开发。 帮助文档地址: [https://support.huaweicloud.com/usermanual-iothub/iot_01_0045.html](https://support.huaweicloud.com/usermanual-iothub/iot_01_0045.html) ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655612803832262425.png) ### 8.2 查询设备属性接口 设备属性就是设备上传的传感器状态数据信息,应用侧提供了API接口,可以主动向设备端下发请求指令;设备端收到指令之后需要按照约定的数据格式上报数据;所以,要实现应用层与设备端的数据交互,需要应用层与设备端配合才能完成。 **应用层下发的指令:** 帮助文档地址: [https://support.huaweicloud.com/api-iothub/iot_06_v5_0034.htm](https://support.huaweicloud.com/api-iothub/iot_06_v5_0034.htm)l 接口的在线调试地址: [https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=IoTDA&api=ListProperties](https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=IoTDA&api=ListProperties) ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655612876645553248.png) 如果请求参数和返回值不清楚,写代码前,先使用在线调试接口体验一下,验证数据交互是否OK。 请求参数里比较总要的两个必填参数,是设备ID和服务ID,这两个参数在第3章节就介绍过如何获取了,在产品页面创建自定义属性时可以看到服务ID。 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655612889420288630.png) ### 8.2 开发环境介绍 上位机软件采用Qt框架设计,Qt是一个跨平台的C++图形用户界面应用程序框架。Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。简单来说,QT可以很轻松的帮你做带界面的软件,甚至不需要你投入很大精力。 **QT官网:** [https://www.qt.io/](https://www.qt.io/) ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655613296524780062.png) ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655613335122227544.png) ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655613377188762268.png) ### 8.3 主要的代码 ![image.png](https://bbs-img.huaweicloud.com/blogs/img/20220619/1655614528832743112.png) 下面代码里介绍了更新token、获取token、查询设备属性,上传设备属性等主要请求代码。 ```cpp /* 功能: 获取token */ void Widget::GetToken() { //表示获取token function_select=3; QString requestUrl; QNetworkRequest request; //设置请求地址 QUrl url; //获取token请求地址 requestUrl = QString("https://iam.%1.myhuaweicloud.com/v3/auth/tokens") .arg(SERVER_ID); //自己创建的TCP服务器,测试用 //requestUrl="http://10.0.0.6:8080"; //设置数据提交格式 request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=UTF-8")); //构造请求 url.setUrl(requestUrl); request.setUrl(url); QString text =QString("{\"auth\":{\"identity\":{\"methods\":[\"password\"],\"password\":" "{\"user\":{\"domain\": {" "\"name\":\"%1\"},\"name\": \"%2\",\"password\": \"%3\"}}}," "\"scope\":{\"project\":{\"name\":\"%4\"}}}}") .arg(MAIN_USER) .arg(IAM_USER) .arg(IAM_PASSWORD) .arg(SERVER_ID); //发送请求 manager->post(request, text.toUtf8()); } //更新token void Widget::on_pushButton_update_token_clicked() { GetToken(); } //查询设备属性 void Widget::Get_device_properties() { //表示获取token function_select=0; QString requestUrl; QNetworkRequest request; //设置请求地址 QUrl url; //获取token请求地址 requestUrl = QString("https://iotda.%1.myhuaweicloud.com/v5/iot/%2/devices/%3/properties?service_id=%4") .arg(SERVER_ID) .arg(PROJECT_ID) .arg(device_id) .arg(service_id); //自己创建的TCP服务器,测试用 //requestUrl="http://10.0.0.6:8080"; //设置数据提交格式 request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json")); //设置token request.setRawHeader("X-Auth-Token",Token); //构造请求 url.setUrl(requestUrl); request.setUrl(url); //发送请求 manager->get(request); } //更新设备属性 void Widget::on_pushButton_update_device_clicked() { Get_device_properties(); } ```
  • [问题求助] 【Hilens产品】【语音功能】应用pyttsx3文本转语音调试错误
    问题:---------------------------------------------------------------------------在Hilens studio中测试pyttsx3文本转音频,出现错误注:已安装pyttsx包和espeak包源代码如下:-------------------------------------------------------------------------#! /usr/bin/python3.7import osimport cv2import hilensimport pyttsx3import espeakdef run(work_path):    # 系统初始化,参数要与创建技能时填写的检验值保持一致    hilens.init("hello")    engine = pyttsx3.init()    engine.say('HERE PASS THE TEXT TO CONVERT INTO  SPEECH')    engine.runAndWait()if __name__ == "__main__":    run(os.getcwd())错误提示:-------------------------------------------------------------------------[huser@studio-ide-679f67bb45-866xw Hello_haq]$ cd /home/huser/projects/Hello_haq[huser@studio-ide-679f67bb45-866xw Hello_haq]$ python3 /home/huser/projects/Hello_haq/start.pyTraceback (most recent call last):  File "/home/huser/projects/Hello_haq/start.py", line 5, in <module>    import main  File "./src/main/python/main.py", line 7, in <module>    import espeakModuleNotFoundError: No module named 'espeak'[huser@studio-ide-679f67bb45-866xw Hello_haq]$ pip3 install espeak --userWARNING: When the --extra-index-url option is used, the installation package is downloaded from an unverified URL. Exercise caution when using this option.Looking in indexes: http://mirrors.myhuaweicloud.com/pypi/web/simpleCollecting espeak  Downloading http://mirrors.myhuaweicloud.com/pypi/web/packages/31/36/30bbc9d4d8a3d7e5edc046cfaf0410434f583a36461122849c1cdfd363eb/espeak-0.1.0.tar.gzRequirement already satisfied: requests in /usr/lib64/python3.7/site-packages (from espeak) (2.26.0)Requirement already satisfied: certifi>=2017.4.17 in /usr/lib64/python3.7/site-packages (from requests->espeak) (2021.10.8)Requirement already satisfied: charset-normalizer~=2.0.0; python_version >= "3" in /usr/lib64/python3.7/site-packages (from requests->espeak) (2.0.7)Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/lib64/python3.7/site-packages (from requests->espeak) (1.26.7)Requirement already satisfied: idna<4,>=2.5; python_version >= "3" in /usr/lib64/python3.7/site-packages (from requests->espeak) (3.3)Installing collected packages: espeak  Running setup.py install for espeak ... doneSuccessfully installed espeak-0.1.0[huser@studio-ide-679f67bb45-866xw Hello_haq]$ cd /home/huser/projects/Hello_haq[huser@studio-ide-679f67bb45-866xw Hello_haq]$ python3 /home/huser/projects/Hello_haq/start.py[SFW]2022-06-18 09:00:14.889[INFO](14031-device_checker.cpp:71)----- start DetectDevice ------[DEVICE]2022-06-18 09:00:14.911[INFO](14031-acl_mediaplugin.cpp:19)-----------load acl_C75 Media---------[DEVICE]2022-06-18 09:00:15.163[INFO](14031-acl_inferplugin.cpp:26)-----------load acl_C75 Infer---------Traceback (most recent call last):  File "/home/huser/.local/lib/python3.7/site-packages/pyttsx3/__init__.py", line 20, in init    eng = _activeEngines[driverName]  File "/usr/lib64/python3.7/weakref.py", line 137, in __getitem__    o = self.data[key]()KeyError: NoneDuring handling of the above exception, another exception occurred:Traceback (most recent call last):  File "/home/huser/projects/Hello_haq/start.py", line 17, in <module>    main.run(work_path)  File "./src/main/python/main.py", line 13, in run    engine = pyttsx3.init()  File "/home/huser/.local/lib/python3.7/site-packages/pyttsx3/__init__.py", line 22, in init    eng = Engine(driverName, debug)  File "/home/huser/.local/lib/python3.7/site-packages/pyttsx3/engine.py", line 30, in __init__    self.proxy = driver.DriverProxy(weakref.proxy(self), driverName, debug)  File "/home/huser/.local/lib/python3.7/site-packages/pyttsx3/driver.py", line 50, in __init__    self._module = importlib.import_module(name)  File "/usr/lib64/python3.7/importlib/__init__.py", line 127, in import_module    return _bootstrap._gcd_import(name[level:], package, level)  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import  File "<frozen importlib._bootstrap>", line 983, in _find_and_load  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked  File "<frozen importlib._bootstrap_external>", line 728, in exec_module  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed  File "/home/huser/.local/lib/python3.7/site-packages/pyttsx3/drivers/espeak.py", line 9, in <module>    from . import _espeak, toUtf8, fromUtf8  File "/home/huser/.local/lib/python3.7/site-packages/pyttsx3/drivers/_espeak.py", line 18, in <module>    dll = cdll.LoadLibrary('libespeak.so.1')  File "/usr/lib64/python3.7/ctypes/__init__.py", line 437, in LoadLibrary    return self._dlltype(name)  File "/usr/lib64/python3.7/ctypes/__init__.py", line 359, in __init__    self._handle = _dlopen(self._name, mode)OSError: libespeak.so.1: cannot open shared object file: No such file or directory麻烦帮忙看下如何解决,谢谢!截图如下:-----------------------------------------------------------------------
  • [高校开发者专区] 体验文字转语音功能
  • [高校开发者专区] 体验文字转定制化语音功能
  • [体验官] 五分钟体验文字转语音,太神奇了
    我随手打了一个hello world,太神奇了
  • [高校开发者专区] 【HCSD华为云实践营·成都东软学院站】实践篇:体验5分钟完成文字转定制化语音,赢取华为耳机、周边等好礼
  • [高校开发者专区] 【HCSD华为云实践营·成都东软学院站】实践篇:体验5分钟完成文字转定制化语音,赢取华为耳机、周边等好礼
  • [高校开发者专区] 语音转换测试
  • [其他] ModelArts的数据标注简介
    人工标注对于不同类型的数据,用户可以选择不同的标注类型。当前ModelArts支持如下类型的标注作业:    图片        图像分类:识别一张图片中是否包含某种物体。        物体检测:识别出图片中每个物体的位置及类别。        图像分割:根据图片中的物体划分出不同区域。    音频        声音分类:对声音进行分类。        语音内容:对语音内容进行标注。        语音分割:对语音进行分段标注。    文本        文本分类:对文本的内容按照标签进行分类处理。        命名实体:针对文本中的实体片段进行标注,如“时间”、“地点”等。        文本三元组:针对文本中的实体片段和实体之间的关系进行标注。    视频    视频标注:识别出视频中每个物体的位置及分类。目前仅支持mp4格式。智能标注除了人工标注外,ModelArts还提供了智能标注功能,快速完成数据标注,为您节省70%以上的标注时间。智能标注是指基于当前标注阶段的标签及图片学习训练,选中系统中已有的模型进行智能标注,快速完成剩余图片的标注操作。目前只有“图像分类”和“物体检测”类型的数据集支持智能标注功能。团队标注数据标注任务中,一般由一个人完成,但是针对数据集较大时,需要多人协助完成。ModelArts提供了团队标注功能,可以由多人组成一个标注团队,针对同一个数据集进行标注管理。团队标注功能当前仅支持“图像分类”、“物体检测”、“文本分类”、“命名实体”、“文本三元组”、“语音分割”类型的数据集。不同类型数据集支持的功能列表其中,不同类型的数据集,支持不同的功能数据集类型标注类型人工标注智能标注团队标注图片图像分类支持支持支持物体检测支持支持支持图像分割支持--音频声音分类支持--语音内容支持--语音分割支持-支持文本文本分类支持-支持命名实体支持-支持文本三元组支持-支持视频视频标注支持--自由格式----表格----
  • [技术干货] 基于华为云ModelArts深度学习算法的语音识别实践
    前言利用新型的人工智能(深度学习)算法,结合清华大学开源语音数据集THCHS30进行语音识别的实战演练,让使用者在了解语音识别基本的原理与实战的同时,更好的了解人工智能的相关内容与应用。通过这个实践可以了解如何使用Keras和Tensorflow构建DFCNN的语音识别神经网络,并且熟悉整个处理流程,包括数据预处理、模型训练、模型保存和模型预测等环节。实践流程基础环境准备OBS准备ModelArts应用开始语音识别操作开始语言模型操作1.基础环境准备在使用 ModelArts 进行 AI 开发前,需先完成以下基础操作哦(如有已完成部分,请忽略),主要分为4步(注册–>实名认证–>服务授权–>领代金券):使用手机号注册华为云账号:点击注册点此去完成实名认证,账号类型选"个人",个人认证类型推荐使用"扫码认证"。 点此进入 ModelArts 控制台数据管理页面,上方会提示访问授权,点击【服务授权】按钮,按下图顺序操作: 进入 ModelArts 控制台首页,如下图,点击页面上的"彩蛋",领取新手福利代金券!后续步骤可能会产生资源消耗费用,请务必领取。 以上操作,也提供了详细的视频教程,点此查看:ModelArts环境配置基于深度学习算法的语音识别具体步骤什么是OBS?对象存储服务(Object Storage Service,OBS)是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力,包括:创建、修改、删除桶,上传、下载、删除对象等。2.OBS准备1).将本地准备的data.zip和语音数据包data_thchs30.tar上传到OBS中,为后续步骤准备。创建OBS桶将光标移动至左边栏,弹出菜单中选择“服务列表”->“ 存储”->“对象存储服务 OBS”,如下图:进去对象存储服务 OBS后,点击创建桶,配置参数如下:区域:华北-北京四,数据冗余存储策略:多AZ存储,桶名称:自定义(请记录,后续使用),存储类别:标准存储,桶策略:私有,默认加密:关闭,归档数据直读:关闭,点击“立即创建”,完成创建后跳转到桶列表,如下图所示:2)创建AK/SK登录华为云,在页面右上方单击“控制台”,进入华为云管理控制台。图1 控制台入口在控制台右上角的帐户名下方,单击“我的凭证”,进入“我的凭证”页面。图2 我的凭证在“我的凭证”页面,选择“访问密钥>新增访问密钥”,如图3所示。图3 单击新增访问密钥填写该密钥的描述说明,单击“确定”。根据提示单击“立即下载”,下载密钥。图4 新增访问密钥密钥文件会直接保存到浏览器默认的下载文件夹中。打开名称为“credentials.csv”的文件,即可查看访问密钥(Access Key Id和Secret Access Key)。3).安装OBS客户端首先下载OBS工具到云服务器,在自己电脑打开命令行界面,执行如下命令:mkdir /home/user/Desktop/data; cd /home/user/Desktop/data; wget https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_amd64.tar.gz输入解压缩指令,并查看当前目录列表:tar -zxf obsutil_linux_amd64.tar.gz; ls -l执行如下指令配置OBS工具,操作说明:自己获取的密钥的AK/SK填入-i -k参数后面执行如下查看对象列表指令,验证是否配置成功,指令如下:./obsutil ls配置成功结果如下图:4)上传语音资料执行如下指令下载实验相关资料:注:由于语音资料较大(7个多g),需要耐心等待cd ../; wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/speech-recognition/data.zip; wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/speech-recognition/data_thchs30.tar下载完毕,执行如下查看指令:ll输入以下指令,将刚刚下载好 的语音文件上传到创建的OBS桶nlpdemo中:./obsutil_linux_amd64_5.*/obsutil cp ./data.zip obs://nlpdemo; ./obsutil_linux_amd64_5.*/obsutil cp ./data_thchs30.tar obs://nlpdemo上传完毕后【大约60分钟,上传的速率较慢】建议华为云优化一下OBS的上传速度,在华为云控制台依次选择“控制台”->“服务列表”->“ 存储”->“对象存储服务OBS”,进入服务界面,点击创建的桶名称nlpdemo进入详情页,于页面左侧选择“对象”,点击后于页面右侧可查看到刚传入的资料,2.ModelArts应用什么是ModelArts?ModelArts是面向AI开发者的一站式开发平台,提供海量数据预处理及半自动化标注、大规模分布式训练、自动化模型生成及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期AI工作流。1) 创建Notebook在服务列表中找到并进入人工智能服务 ModelArts,然后点击ModelArts 页面中左侧的【开发环境】选项一点击【notebook】 进入notebook 页面。点击【创建】按钮进入创建页面,并按以下参数进行配置:名称:自定义,自动停止:自定义 12小时(在选择非[限时免费]规格后显示),镜像:公共镜像:在第二页选择tensorflow1.13-cuda10.0-cudnn7-ubuntu18.0.4-GPU算法开发和训练基础镜像,预置AI引擎Tensorflow1.13.1,资源池:公共资源池,类型:CPU,规格:8核64GiB,存储配置:云硬盘(30GB)。点击“下一步”->“提交”->“返回Notebook列表”,Notebook列表如下图所示:注:大约3分钟后状态由“启动中”变为“运行中”,可点击列表右上角的“刷新”查看最新状态。3.开始语音识别操作采用CNN+CTC的方式进行语音识别。1)导入包创建成功,返回NoteBook列表,等待状态变为“运行中”【约等待3分钟】,点击“打开”,进入NoteBook详情页。在页面中选择“TensorFlow-1.13.1”,如下图所示:在新建的Python环境页面的输入框中,输入以下代码:import moxing as mox import numpy as np import scipy.io.wavfile as wav from scipy.fftpack import fft import matplotlib.pyplot as plt %matplotlib inline import keras from keras.layers import Input, Conv2D, BatchNormalization, MaxPooling2D from keras.layers import Reshape, Dense, Lambda from keras.optimizers import Adam from keras import backend as K from keras.models import Model from keras.utils import multi_gpu_model import os import pickle点击“代码旁边的小三角形”run,查看执行结果,如下图:2)数据准备继续在下方空白的输入框中输入以下代码,从上传到OBS的数据拷贝到当前目录:注:下方框选的部分是之前创建的OBS桶名点击“run”,查看执行结果,如下图:current_path = os.getcwd() mox.file.copy('s3://nlpdemo/data.zip', current_path+'/data.zip') mox.file.copy('s3://nlpdemo/data_thchs30.tar', current_path+'/data_thchs30.tar')继续在下方空白的输入框中输入以下代码,解压缩数据:!unzip data.zip !tar -xvf data_thchs30.tar点击“run”,查看执行结果,如下图:3)数据处理继续在下方空白的输入框中输入以下代码,生成音频文件和标签文件列表:注:考虑神经网络训练过程中接收的输入输出。首先需要batch_size内数据具有统一的shape。格式为:[batch_size, time_step, feature_dim],然而读取的每一个sample的时间轴长都不一样,所以需要对时间轴进行处理,选择batch内最长的那个时间为基准,进行padding。这样一个batch内的数据都相同,就可以进行并行训练了。source_file = 'data/thchs_train.txt' def source_get(source_file): train_file = source_file label_data = [] wav_lst = [] with open(train_file,"r",encoding="utf-8") as f: lines = f.readlines() for line in lines: datas = line.split("\t") wav_lst.append(datas[0]) label_data.append(datas[1]) return label_data, wav_lst label_data, wav_lst = source_get(source_file) print(label_data[:10]) print(wav_lst[:10])点击“run”,查看执行结果,如下图:继续在下方空白的输入框中输入以下代码,进行label数据处理(为label建立拼音到id的映射,即词典):def mk_vocab(label_data): vocab = [] for line in label_data: line = line.split(' ') for pny in line: if pny not in vocab: vocab.append(pny) vocab.append('_') return vocab vocab = mk_vocab(label_data) def word2id(line, vocab): return [vocab.index(pny) for pny in line.split(' ')] label_id = word2id(label_data[0], vocab) print(label_data[0]) print(label_id)点击“run”,查看执行结果,如下图:继续在下方空白的输入框中输入以下代码,进行音频数据处理:def compute_fbank(file): x=np.linspace(0, 400 - 1, 400, dtype = np.int64) w = 0.54 - 0.46 * np.cos(2 * np.pi * (x) / (400 - 1) ) fs, wavsignal = wav.read(file) time_window = 25 window_length = fs / 1000 * time_window wav_arr = np.array(wavsignal) wav_length = len(wavsignal) range0_end = int(len(wavsignal)/fs*1000 - time_window) // 10 data_input = np.zeros((range0_end, 200), dtype = np.float) data_line = np.zeros((1, 400), dtype = np.float) for i in range(0, range0_end): p_start = i * 160 p_end = p_start + 400 data_line = wav_arr[p_start:p_end] data_line = data_line * w data_line = np.abs(fft(data_line)) data_input[i]=data_line[0:200] data_input = np.log(data_input + 1) #data_input = data_input[::] return data_input fbank = compute_fbank(wav_lst[0]) print(fbank.shape)点击“run”,查看执行结果,如下图:继续在下方空白的输入框中输入以下代码,生成数据生成器:total_nums = 10000 batch_size = 4 batch_num = total_nums // batch_size from random import shuffle shuffle_list = list(range(10000)) shuffle(shuffle_list) def get_batch(batch_size, shuffle_list, wav_lst, label_data, vocab): for i in range(10000//batch_size): wav_data_lst = [] label_data_lst = [] begin = i * batch_size end = begin + batch_size sub_list = shuffle_list[begin:end] for index in sub_list: fbank = compute_fbank(wav_lst[index]) fbank = fbank[:fbank.shape[0] // 8 * 8, :] label = word2id(label_data[index], vocab) wav_data_lst.append(fbank) label_data_lst.append(label) yield wav_data_lst, label_data_lst batch = get_batch(4, shuffle_list, wav_lst, label_data, vocab) wav_data_lst, label_data_lst = next(batch) for wav_data in wav_data_lst: print(wav_data.shape) for label_data in label_data_lst: print(label_data) lens = [len(wav) for wav in wav_data_lst] print(max(lens)) print(lens) def wav_padding(wav_data_lst): wav_lens = [len(data) for data in wav_data_lst] wav_max_len = max(wav_lens) wav_lens = np.array([leng//8 for leng in wav_lens]) new_wav_data_lst = np.zeros((len(wav_data_lst), wav_max_len, 200, 1)) for i in range(len(wav_data_lst)): new_wav_data_lst[i, :wav_data_lst[i].shape[0], :, 0] = wav_data_lst[i] return new_wav_data_lst, wav_lens pad_wav_data_lst, wav_lens = wav_padding(wav_data_lst) print(pad_wav_data_lst.shape) print(wav_lens) def label_padding(label_data_lst): label_lens = np.array([len(label) for label in label_data_lst]) max_label_len = max(label_lens) new_label_data_lst = np.zeros((len(label_data_lst), max_label_len)) for i in range(len(label_data_lst)): new_label_data_lst[i][:len(label_data_lst[i])] = label_data_lst[i] return new_label_data_lst, label_lens pad_label_data_lst, label_lens = label_padding(label_data_lst) print(pad_label_data_lst.shape) print(label_lens)代码执行成功,如下图:执行结果输出如下图:继续在下方空白的输入框中输入以下代码,点击“run”运行,生成用于训练格式的数据生成器(此段代码无输出):4)模型搭建继续输入以下代码:说明:训练输入为时频图,标签为对应的拼音标签,搭建语音识别模型,采用了 CNN+CTC 的结构。def conv2d(size): return Conv2D(size, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal') def norm(x): return BatchNormalization(axis=-1)(x) def maxpool(x): return MaxPooling2D(pool_size=(2,2), strides=None, padding="valid")(x) def dense(units, activation="relu"): return Dense(units, activation=activation, use_bias=True, kernel_initializer='he_normal') def cnn_cell(size, x, pool=True): x = norm(conv2d(size)(x)) x = norm(conv2d(size)(x)) if pool: x = maxpool(x) return x def ctc_lambda(args): labels, y_pred, input_length, label_length = args y_pred = y_pred[:, :, :] return K.ctc_batch_cost(labels, y_pred, input_length, label_length) class Amodel(): """docstring for Amodel.""" def __init__(self, vocab_size): super(Amodel, self).__init__() self.vocab_size = vocab_size self._model_init() self._ctc_init() self.opt_init() def _model_init(self): self.inputs = Input(name='the_inputs', shape=(None, 200, 1)) self.h1 = cnn_cell(32, self.inputs) self.h2 = cnn_cell(64, self.h1) self.h3 = cnn_cell(128, self.h2) self.h4 = cnn_cell(128, self.h3, pool=False) # 200 / 8 * 128 = 3200 self.h6 = Reshape((-1, 3200))(self.h4) self.h7 = dense(256)(self.h6) self.outputs = dense(self.vocab_size, activation='softmax')(self.h7) self.model = Model(inputs=self.inputs, outputs=self.outputs) def _ctc_init(self): self.labels = Input(name='the_labels', shape=[None], dtype='float32') self.input_length = Input(name='input_length', shape=[1], dtype='int64') self.label_length = Input(name='label_length', shape=[1], dtype='int64') self.loss_out = Lambda(ctc_lambda, output_shape=(1,), name='ctc')\ ([self.labels, self.outputs, self.input_length, self.label_length]) self.ctc_model = Model(inputs=[self.labels, self.inputs, self.input_length, self.label_length], outputs=self.loss_out) def opt_init(self): opt = Adam(lr = 0.0008, beta_1 = 0.9, beta_2 = 0.999, decay = 0.01, epsilon = 10e-8) #self.ctc_model=multi_gpu_model(self.ctc_model,gpus=2) self.ctc_model.compile(loss={'ctc': lambda y_true, output: output}, optimizer=opt) am = Amodel(len(vocab)) am.ctc_model.summary()点击“run”,执行结果如下图:5)训练模型 继续输入以下代码创建语音识别模型:total_nums = 100 batch_size = 20 batch_num = total_nums // batch_size epochs = 8 source_file = 'data/thchs_train.txt' label_data,wav_lst = source_get(source_file) vocab = mk_vocab(label_data) vocab_size = len(vocab) print(vocab_size) shuffle_list = list(range(100)) am = Amodel(vocab_size) for k in range(epochs): print('this is the', k+1, 'th epochs trainning !!!') #shuffle(shuffle_list) batch = data_generator(batch_size, shuffle_list, wav_lst, label_data, vocab) am.ctc_model.fit_generator(batch, steps_per_epoch=batch_num, epochs=1)执行结果如下图【大约需要11分钟,如果需要更好效果可以调整参数epochs为50次】:)6)保存模型将训练模型保存到OBS中。继续输入如下代码(此段代码无输出):操作说明:用创建的OBS桶名填写参数am.model.save("asr-model.h5") with open("vocab","wb") as fw: pickle.dump(vocab,fw) mox.file.copy("asr-model.h5", 's3://nlpdemo/asr-model.h5') mox.file.copy("vocab", 's3://nlpdemo/vocab')7)测试模型继续输入如下代码,点击“run”运行,用以导入包及加载模型和数据(此段代码无输出):#导入包 import pickle from keras.models import load_model import os import tensorflow as tf from keras import backend as K import numpy as np import scipy.io.wavfile as wav from scipy.fftpack import fft #加载模型和数据 bm = load_model("asr-model.h5") with open("vocab","rb") as fr: vocab_for_test = pickle.load(fr)继续输入如下代码,点击“run”运行,获取测试数据(此段代码无输出):def wav_padding(wav_data_lst): wav_lens = [len(data) for data in wav_data_lst] wav_max_len = max(wav_lens) wav_lens = np.array([leng//8 for leng in wav_lens]) new_wav_data_lst = np.zeros((len(wav_data_lst), wav_max_len, 200, 1)) for i in range(len(wav_data_lst)): new_wav_data_lst[i, :wav_data_lst[i].shape[0], :, 0] = wav_data_lst[i] return new_wav_data_lst, wav_lens #获取信号的时频图 def compute_fbank(file): x=np.linspace(0, 400 - 1, 400, dtype = np.int64) w = 0.54 - 0.46 * np.cos(2 * np.pi * (x) / (400 - 1) ) # 汉明窗 fs, wavsignal = wav.read(file) # wav波形 加时间窗以及时移10ms time_window = 25 # 单位ms window_length = fs / 1000 * time_window # 计算窗长度的公式,目前全部为400固定值 wav_arr = np.array(wavsignal) wav_length = len(wavsignal) range0_end = int(len(wavsignal)/fs*1000 - time_window) // 10 # 计算循环终止的位置,也就是最终生成的窗数 data_input = np.zeros((range0_end, 200), dtype = np.float) # 用于存放最终的频率特征数据 data_line = np.zeros((1, 400), dtype = np.float) for i in range(0, range0_end): p_start = i * 160 p_end = p_start + 400 data_line = wav_arr[p_start:p_end] data_line = data_line * w # 加窗 data_line = np.abs(fft(data_line)) data_input[i]=data_line[0:200] # 设置为400除以2的值(即200)是取一半数据,因为是对称的 data_input = np.log(data_input + 1) #data_input = data_input[::] return data_input def test_data_generator(test_path): test_file_list = [] for root, dirs, files in os.walk(test_path): for file in files: if file.endswith(".wav"): test_file = os.sep.join([root, file]) test_file_list.append(test_file) print(len(test_file_list)) for file in test_file_list: fbank = compute_fbank(file) pad_fbank = np.zeros((fbank.shape[0]//8*8+8, fbank.shape[1])) pad_fbank[:fbank.shape[0], :] = fbank test_data_list = [] test_data_list.append(pad_fbank) pad_wav_data, input_length = wav_padding(test_data_list) yield pad_wav_data test_path ="data_thchs30/test" test_data = test_data_generator(test_path)继续输入以下代码进行测试:def decode_ctc(num_result, num2word): result = num_result[:, :, :] in_len = np.zeros((1), dtype = np.int32) in_len[0] = result.shape[1]; r = K.ctc_decode(result, in_len, greedy = True, beam_width=10, top_paths=1) r1 = K.get_value(r[0][0]) r1 = r1[0] text = [] for i in r1: text.append(num2word[i]) return r1, text for i in range(10): #获取测试数据 x = next(test_data) #载入训练好的模型,并进行识别语音 result = bm.predict(x, steps=1) #将数字结果转化为拼音结果 _, text = decode_ctc(result, vocab_for_test) print('文本结果:', text)点击“run”,执行成功如下图所示:.4.开始语言模型操作训练语言模型是采用捕捉特征能力更强的Transformer,创建基于自注意力机制的语言模型,在实验的过程中会跟大家介绍具体的实现步骤。1)导入包继续输入如下代码,点击“run”运行,导入相关包(此段代码无输出):from tqdm import tqdm import tensorflow as tf import moxing as mox import numpy as np2)数据处理继续输入如下代码,点击“run”运行:with open("data/zh.tsv", 'r', encoding='utf-8') as fout: data = fout.readlines()[:10000] inputs = [] labels = [] for i in tqdm(range(len(data))): key, pny, hanzi = data[i].split('\t') inputs.append(pny.split(' ')) labels.append(hanzi.strip('\n').split(' ')) print(inputs[:5]) print() print(labels[:5]) def get_vocab(data): vocab = ['<PAD>'] for line in tqdm(data): for char in line: if char not in vocab: vocab.append(char) return vocab pny2id = get_vocab(inputs) han2id = get_vocab(labels) print(pny2id[:10]) print(han2id[:10]) input_num = [[pny2id.index(pny) for pny in line] for line in tqdm(inputs)] label_num = [[han2id.index(han) for han in line] for line in tqdm(labels)] #获取batch数据 def get_batch(input_data, label_data, batch_size): batch_num = len(input_data) // batch_size for k in range(batch_num): begin = k * batch_size end = begin + batch_size input_batch = input_data[begin:end] label_batch = label_data[begin:end] max_len = max([len(line) for line in input_batch]) input_batch = np.array([line + [0] * (max_len - len(line)) for line in input_batch]) label_batch = np.array([line + [0] * (max_len - len(line)) for line in label_batch]) yield input_batch, label_batch batch = get_batch(input_num, label_num, 4) input_batch, label_batch = next(batch) print(input_batch) print(label_batch)执行成功结果如下图:3)模型搭建模型采用self-attention的左侧编码器,如下图:继续输入如下代码,点击“run”运行,用以实现图片结构中的layer norm层(代码无输出):#layer norm层 def normalize(inputs, epsilon = 1e-8, scope="ln", reuse=None): with tf.variable_scope(scope, reuse=reuse): inputs_shape = inputs.get_shape() params_shape = inputs_shape[-1:] mean, variance = tf.nn.moments(inputs, [-1], keep_dims=True) beta= tf.Variable(tf.zeros(params_shape)) gamma = tf.Variable(tf.ones(params_shape)) normalized = (inputs - mean) / ( (variance + epsilon) ** (.5) ) outputs = gamma * normalized + beta return outputs继续输入如下代码,点击“run”运行,以实现图片结构中的embedding层(代码无输出):def embedding(inputs, vocab_size, num_units, zero_pad=True, scale=True, scope="embedding", reuse=None): with tf.variable_scope(scope, reuse=reuse): lookup_table = tf.get_variable('lookup_table', dtype=tf.float32, shape=[vocab_size, num_units], initializer=tf.contrib.layers.xavier_initializer()) if zero_pad: lookup_table = tf.concat((tf.zeros(shape=[1, num_units]), lookup_table[1:, :]), 0) outputs = tf.nn.embedding_lookup(lookup_table, inputs) if scale: outputs = outputs * (num_units ** 0.5) return outputs继续输入如下代码,点击“run”运行,以实现multihead层(此段代码无输出):继续输入如下代码,点击“run”运行,以实现feedforward层(此段代码无输出):继续输入如下代码,点击“run”运行,以搭建模型(此段代码无输出):4) 训练模型继续输入如下代码,点击“run”运行,用于参数设定(此段代码无输出):继续输入以下代码,点击“run”运行,用于模型训练:import os epochs = 3 batch_size = 4 g = Graph(arg) saver =tf.train.Saver() with tf.Session() as sess: merged = tf.summary.merge_all() sess.run(tf.global_variables_initializer()) if os.path.exists('logs/model.meta'): saver.restore(sess, 'logs/model') writer = tf.summary.FileWriter('tensorboard/lm', tf.get_default_graph()) for k in range(epochs): total_loss = 0 batch_num = len(input_num) // batch_size batch = get_batch(input_num, label_num, batch_size) for i in range(batch_num): input_batch, label_batch = next(batch) feed = {g.x: input_batch, g.y: label_batch} cost,_ = sess.run([g.mean_loss,g.train_op], feed_dict=feed) total_loss += cost if (k * batch_num + i) % 10 == 0: rs=sess.run(merged, feed_dict=feed) writer.add_summary(rs, k * batch_num + i) print('epochs', k+1, ': average loss = ', total_loss/batch_num) saver.save(sess, 'logs/model') writer.close()执行成功输出内容如下图【大约10分钟执行完成,如果需要更好效果请将参数epochs调整为15】:5) 模型测试继续输入如下代码,进行拼音测试:arg.is_training = False g = Graph(arg) saver =tf.train.Saver() with tf.Session() as sess: saver.restore(sess, 'logs/model') while True: line = input('Input Test Content: ') if line == 'exit': break line = line.strip('\n').split(' ') x = np.array([pny2id.index(pny) for pny in line]) x = x.reshape(1, -1) preds = sess.run(g.preds, {g.x: x}) got = ''.join(han2id[idx] for idx in preds[0]) print(got)点击“run”运行后,出现输入框提示输入,如下图:我输入以下拼音nian2 de bu4 bu4 ge4 de shang4 shi2 qu1 pei4 wai4 gu4 de nian2 ming2 de zi4 ren2 na4 ren2 bu4 zuo4 de jia1 zhong4 shi2 wei4 yu4 you3 ta1 yang2 mu4 yu4 ci3单击键盘回车键后,模型返回中文内容,如下图:继续在输入框中输入“exit”,回车后出现提示停止运行,如下图:6) 保存模型继续输入如下代码,点击“run”运行后,保存模型到OBS桶中,方便其他notebook使用:操作说明:用自己创建的OBS桶名代替“OBS”字符,我的是nlpdemo!zip -r languageModel.zip logs #递归压缩模型所在文件夹 mox.file.copy("languageModel.zip", 's3://nlpdemo/languageModel.zip')至此基于深度学习算法的语音识别实践全部完成,整个流程下来体验还是很不错的!总结整个流程用到了很多的华为云服务,例如OBS和ModelArts的NoteBook,功能非常强大,体验感很好,对深度学习算法的语音识别有了一定的了解,也对整个实践的过程有了认识,欢迎大家一起在华为云社区交流学习。如有不当之处,欢迎指正!感恩能与大家在华为云遇见!希望能与大家一起在华为云社区共同成长。
  • [体验官] 5分钟玩转AI语音合成
    实验准备:华为云账号(已实名认证),如没有账号信息,请先先注册华为云账号信息,参考实名认证介绍_帐号中心_用户指南_实名认证_华为云 (huaweicloud.com)电脑Chrome浏览器实验过程:点击API Explorer_开发者社区-华为云 (huaweicloud.com),进入API Explorer页面,选择【语音交互服务--语音合成接口--RunTts】在Body体的text输入想要转换的内容,再点击调试按钮。(注意红色*为必填项)调试成功后,会提示提示成功或者失败。失败的话,请仔细查看对应的错误码信息,按照下方链接,找到对应的解决方法错误码_语音交互服务 SIS_API参考_附录_华为云 (huaweicloud.com)在成功界面,复制响应体内容,再打开华为云内置的CloudIDE,体验项目。(若未开通CloudIDE,进入CloudIDE_集成开发环境_WebIDE_华为云 (huaweicloud.com)点击【立即体验】免费开通即可)双击json文件,将上一步复制的响应体内容粘贴进去点击运行温馨提示:刚才复制的响应体内容,建议先下载,在赋值。小编刚通过自带的复制按钮,复制的不全,导致JSON格式异常,运行报错。运行成功后,返回到Explorer下,选择mp3文件,右键,选择download。在电脑中找到刚下载的文件,打开,就能听到转换后的语音内容了。实验过程到此结束,赶快体验吧,5分钟真的可以实现文本到语音的转换,转换后还是个美女小姐姐的声音哦。
  • [已解决问题归档] AICC对接科大智能语音助手的问题
    【问题来源】【必填】    【可选问题来源:某地12345新建AICC项目】【问题简要】:AICC系统怎么对接科大的智能助手【问题类别】    【可选问题分类:坐席智能助手】【AICC解决方案版本】【必填】    【AICC可选择版本:AICC 8.15.0】    【UAP可选择版本:UAP9600 V100R005C00SPC018】    【CTI可选择版本:ICD V300R008C23】【期望解决时间】越快越好【问题现象描述】【必填】         某地12345需要新建一套AICC系统,采用入驻式模式,第三方CRM集成坐席接续,智能化由科大提供。         我知道华为云租户是有坐席实时转写功能的,入驻式的有没有这个功能,装哪些组件能实现?具体的步骤配置有哪些?现在科大给了份智能助手的接口文档,需要我们AICC侧完成对接,         我们仅仅是用平台的自带功能就能实现,还是需要一定的开发才能完成?        
  • [获奖公告] 【华为云·微话题(第52期)】 不负光阴“粽”享AI,体验AI语音祈福送多重好礼~
    端午至,粽子香佳节到,祈福愿送上一份有“声”的祝福 敢于开口,方能出“粽”文字转语音,MP3文件上传到回帖,再配上您的体验感受即可具体方法可查看体验API Explore,花样玩转AI语音合成接口期望看到大家精彩的评论:1、体验过程中有哪些优化建议2、还能在哪些场景中使用AI语音合成接口3、期待华为云开发其他哪些接口?【本期微话题】AI语音佳节祈福【活动时间】22年5月28日~22年6月10日【参与方式】1、直接回复本帖,就微话题题目进行回答讨论2、为你觉得优质回复的楼层点赞或发表评论【本期奖品】优质回复奖:奖品抽取数量有效回复楼层数需达到华为三脚架自拍杆无线Pro版(黑色)120华为智选欧普读写台灯 白色140幸运回复奖:奖品抽取数量有效回复楼层数需达到华为云定制雨伞220华为云定制笔记本套装340【活动规则】1、开发者用户回复的内容,必须与本期的微话题相关,回复其他内容均视为无效内容,否则取消该用户获奖资格2、开发者用户回复内容的字数需≥100字,禁止复制其他楼层内容或改编自其它楼层内容(包括本人发布在其他楼层的内容),如经发现,取消该用户获奖资格3、本次活动不限用户的总回复数及连续回复数,但需保证回复质量,如华为云社区小编认定参与用户有恶意刷楼嫌疑,则取消该用户获奖资格 【评奖方式】1、在本帖所有有效回复的用户中抽取若干名幸运开发者获得幸运回复奖,奖品及数量见上方示例。2、在所有参加回复的用户中,根据其回复质量及被回复的数量,综合评选优秀奖,奖品见上方示例。3、本次活动将根据实际参与情况发放奖励,包括但不限于用户百分之百中奖或奖项轮空的情况。4、每期活动预计于结束后三天内完成奖项公示,并于结束后15个工作日内完成邮寄。 【温馨提示】1、请务必使用个人实名账号参与活动(IAM、企业账号等账号参与无效)。如一个实名认证对应多个账号,只有一个账号可领取奖励,若同一账号填写多个不同收件人或不同账号填写同一收件人,均不予发放奖励。2、所有获得奖品的获奖用户,请于获奖后3日内完成实名认证,否则视为放弃奖励。
总条数:375 到第
上滑加载中