风之轻云之白 发表于 2020-5-9 10:38

【RTOS】麻雀一号连接京东云实现语音识别

本帖最后由 风之轻云之白 于 2020-5-9 11:02 编辑

先开一个帖子,内容之后更新
麻雀一号有一个麦克风还可以联网,是不是可以干一些大事情呢,语音识别看起来很不错,这就来试一试首先说一下为什么使用JD云服务吧,JD每天有5000条免费语音识别调用,是不是很诱人,50000条至少调试是足够了,其他的云都很少,这可能是JD用这种方式吸引用户,不过管他呢,对于我们方便就好了。硬件:基于RT-Thread的Micropython环境
语言:Python
IDE :VSCode

目录
一、麻雀一号实现录音功能
二、在JD云开启语音识别功能
三、增加请求方式
四、实现MD5加密用能
五、同步网络时间
六、将录音文件发送到JD云识别



风之轻云之白 发表于 2020-5-9 11:08

本帖最后由 风之轻云之白 于 2020-5-9 11:27 编辑

一、麻雀一号实现录音功能
要把大象装冰箱需要几步
第一步:找到官方例程
第二步:自己修改修改
第三步:测试验证

from recorder import recorder
from player import player
import time

def myrecoder(filename,tim):
    print("Start recording...")
    record = recorder()         # 实例录音机设备
    record.start(filename)      # 设置录音文件文件名并开始录音
    time.sleep(tim)             # 设置录音时间
    record.stop()               # 停止录音

def myplayer(filename):
    play = player()             # 实例播放器设备
    play.opensong(filename)   # 设置音频文件文件名
    play.set_volume(60)         # 设置播放音量大小
    play.play()               # 开始播放

def main():
    print("Welcome to RT-Thread MicroPython!")
   
if __name__ == '__main__':
    filename = 'voice.wav'
    main()
    myrecoder(filename,7)
    myplayer(filename)

写完代码以后,下载到开发板中运行,终端显示:
Welcome to RT-Thread MicroPython!
Start recording...
The fil ename is : voice.wav
save filename = voice.wav
record stop
song path/url = voice.wav
player set volume
player play并能听到刚才说的话就OK啦


21ic小喇叭 发表于 2020-5-9 16:28

感谢分享,论坛送您1000家园币,可以兑换礼品。以及论坛给您寄出一份礼品,以示鼓励~ 您继续加油,尽快把帖子完成哦~

风之轻云之白 发表于 2020-5-10 10:14

二、在JD云开启语音识别功能
应该JD云正处于推广阶段,才能让我们baipiao这么多免费使用的机会,JD语音识别开通也十分简单,上云操作也不复杂
1.baidu搜索”京东人工智能服务平台“就可以了,因为本渣渣等级太低不能添加链接,就请各位大大自行搜索啦。就是下面这个网站

2.在下方的产品及服务中找到”语音识别“,在下一个页面点击立即使用,进入购买页面,会发现价格是0元,点击购买就可以啦,好像到这里需要认证一下,跟着做就行,我之前已经认证过来,这里就不写啦

3.购买完成之后就可以试试语音识别的效果了,找到测试界面
    首先要录制一份音频,因为我们开发板保存的文件是wav格式,我们就用手机或者电脑的录音机录制一段声音备用。
    在测试界面选择我们刚才录制的音频,点击测试,就可以看到结果啦

这里可以看到它的调试信息和响应的结果
4.在SDK界面可以下载PYTHON SDK,在SDK中我们主要需要的就是他的”wx_sdk.py"这个文件
    我们先在电脑的python环境中测试一下这个代码
    使用VSCode打开下载的sdk,他给的demo中并不是测试所用的代码,这里将网站测试界面的代码复制下来,替换掉原本demo的代码,
    替换完成之后还要更改代码中的“your secretKey”为你的密钥,你的密钥可以在JD个人中心找到,右上角点击你的头像就可以看到
    然后我们就可以运行啦


WX13823153201 发表于 2020-5-14 09:56

21ic小喇叭 发表于 2020-6-5 10:20

大大,别忘记及时更新哦!

风之轻云之白 发表于 2020-6-7 17:27

本帖最后由 风之轻云之白 于 2020-6-7 17:33 编辑

三、增加请求方式我们来分析一下这个wx_sdk.py的代码,首先看一下他的头文件,它用到了request、sys、hashlib、time和urllib这几个库。然后再看下Micro python的库,发现只有urllib没有。再看下它是在def file_get_contents(filename, use_include_path = 0, context =None, offset = -1, maxlen = -1)函数中使用的,嗯呢推测他应该是用来打开文件的,这里它用if判断的应该是文件的位置是网络上的资源还是本地资源,这里我们只是用本地的音频文件所以上面的if就可以删去,所以urllib这个库也就不需要了。可以看到这里使用了open函数进行文件打开,查找rtt文档,发现在uio这个库中有open函数,所以加入uio这个库。仔细对比发现wx_post_req函数会调用requests.post(url, params=params, data=ret)函数,但是rtt的request.post函数中没有params参数,这可咋办啊?我们先将请求更给为自己的服务器,看看它往服务器发送了什么吧。这里使用花生壳申请一个域名,并映射到电脑上,通过网络调试助手就可以看到他发送的消息了。哦哦,参数被放到了这里。再看看ruequests文件里面的requeest函数,s是发送消息的嵌套字,通过s.write函数发送数据,好吧我们来自己修改这个函数吧
def request(method, url, data=None,params=None, json=None, headers={}, stream=None):   try:       proto, dummy, host, path = url.split("/", 3)   except ValueError:       proto, dummy, host = url.split("/", 2)       path = ""   if proto == "http:":       port = 80   elif proto == "https:":       import ussl       port = 443   else:       raise ValueError("Unsupported protocol: " + proto)
   if ":" in host:       host, port = host.split(":", 1)       port = int(port)
   ai = usocket.getaddrinfo(host, port, 0, usocket.SOCK_STREAM)   ai = ai
    s= usocket.socket(ai, ai, ai)   try:       s.connect(ai[-1])       if proto == "https:":         s = ussl.wrap_socket(s, server_hostname=host)       s.write(b"%s /%s" %(method, path))       if params is not None:         s.write(urlencode(params))      s.write(b" HTTP/1.0\r\n")       if not "Host" in headers:         s.write(b"Host: %s\r\n" % host)       # Iterate over keys to avoid tuple alloc       for k in headers:         s.write(k)         s.write(b": ")         s.write(str(headers))         s.write(b"\r\n")       if json is not None:         assert data is None         import ujson         data = ujson.dumps(json)         s.write(b"Content-Type: application/json\r\n")       if data:         s.write(b"Content-Length: %d\r\n" % len(data))       s.write(b"\r\n")       if data:         s.write(data)
       l = s.readline()       #print(l)       l = l.split(None, 2)       status = int(l)       reason = ""       if len(l) > 2:         reason = l.rstrip()       while True:         l = s.readline()         if not l or l == b"\r\n":                break         #print(l)         if l.startswith(b"Transfer-Encoding:"):                if b"chunked" in l:                  raiseValueError("Unsupported " + l)         elif l.startswith(b"Location:") and not 200 <= status <=299:                raiseNotImplementedError("Redirects not yet supported")   except OSError:       s.close()       raise
   resp = Response(s)   resp.status_code = status   resp.reason = reason   return resp
def urlencode(query):   conversion = "?"   for key, val in query.items():       conversion += "%s=%s&" %(key,val)   return conversion[:-1]
欧对了参数里面的{"autoend":false,"encode":{"channel":1,"format":"wav","sample_rate":16000},"platform":"Linux","version":"0.0.0.1"}还需要转码,我暂时还不知道怎么转,因为这些信息是不变的直接使用图中转码之后的了,所以我的   params = {        'Domain' : 'general',       'Application-Id' : 'search-app',       'Request-Id' : '56a847e6-84c0-4c01-bf4b-d566f2d2dd11',       'Sequence-Id' : '-1',       'Asr-Protocol' : '1',       'Net-State' : '2',       'Applicator' : '0',       'Property' :'%7B%22autoend%22%3Afalse%2C%22encode%22%3A%7B%22channel%22%3A1%2C%22format%22%3A%22wav%22%2C%22sample_rate%22%3A16000%7D%2C%22platform%22%3A%22Linux%22%2C%22version%22%3A%220.0.0.1%22%7D',2ca1e20761013f17f6c6721f59a47436',       'secretkey' : '    }更改完成之后我们来测试一下电脑上成功的接收到了,看到参数格式没问题了只是顺序不对。

风之轻云之白 发表于 2020-6-7 17:28

21ic小喇叭 发表于 2020-6-5 10:20
大大,别忘记及时更新哦!

前段时间在准备毕设,耽误了一段时间{:titter:}
页: [1]
查看完整版本: 【RTOS】麻雀一号连接京东云实现语音识别