【RTOS】麻雀一号连接京东云实现语音识别
本帖最后由 风之轻云之白 于 2020-5-9 11:02 编辑先开一个帖子,内容之后更新
麻雀一号有一个麦克风还可以联网,是不是可以干一些大事情呢,语音识别看起来很不错,这就来试一试首先说一下为什么使用JD云服务吧,JD每天有5000条免费语音识别调用,是不是很诱人,50000条至少调试是足够了,其他的云都很少,这可能是JD用这种方式吸引用户,不过管他呢,对于我们方便就好了。硬件:基于RT-Thread的Micropython环境
语言:Python
IDE :VSCode
目录
一、麻雀一号实现录音功能
二、在JD云开启语音识别功能
三、增加请求方式
四、实现MD5加密用能
五、同步网络时间
六、将录音文件发送到JD云识别
本帖最后由 风之轻云之白 于 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啦
感谢分享,论坛送您1000家园币,可以兑换礼品。以及论坛给您寄出一份礼品,以示鼓励~ 您继续加油,尽快把帖子完成哦~ 二、在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个人中心找到,右上角点击你的头像就可以看到
然后我们就可以运行啦
大大,别忘记及时更新哦! 本帖最后由 风之轻云之白 于 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' : ' }更改完成之后我们来测试一下电脑上成功的接收到了,看到参数格式没问题了只是顺序不对。
21ic小喇叭 发表于 2020-6-5 10:20
大大,别忘记及时更新哦!
前段时间在准备毕设,耽误了一段时间{:titter:}
页:
[1]