打印
[uCOS/RTOS]

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

[复制链接]
1384|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 风之轻云之白 于 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个人中心找到,右上角点击你的头像就可以看到
    然后我们就可以运行啦


使用特权

评论回复
5
WX13823153201| | 2020-5-14 09:56 | 只看该作者

使用特权

评论回复
6
21ic小喇叭| | 2020-6-5 10:20 | 只看该作者
大大,别忘记及时更新哦!

使用特权

评论回复
7
风之轻云之白|  楼主 | 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[0]

    s= usocket.socket(ai[0], ai[1], ai[2])
   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[k]))
           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[1])
       reason = ""
       if len(l) > 2:
           reason = l[2].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' : '
    }
更改完成之后我们来测试一下
电脑上成功的接收到了,看到参数格式没问题了只是顺序不对。

使用特权

评论回复
8
风之轻云之白|  楼主 | 2020-6-7 17:28 | 只看该作者
21ic小喇叭 发表于 2020-6-5 10:20
大大,别忘记及时更新哦!

前段时间在准备毕设,耽误了一段时间

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

11

帖子

0

粉丝