写在前面的
首先,非常感谢地平线官方给予这次旭日X3派开发板的测评机会,旭日X3派不同于其他派,全黑的外观倍感神秘,像一个深邃的黑洞,让人忍不住去探索!板载资源上不仅诚意满满,更是细节满满,处处为用户体验考虑,例如标准的HDMI接口,不需要使用转接头可以直接连接显示器等等。

零、项目研发意义与摘要
在上一期的项目开发(点击可跳转)中,我们已经实现了聋哑人士与健听人士的单向无障碍沟通,即手语的实时翻译并播报,那么,接下来我们要做的就是实现双向无障碍的沟通,即需要一个实时的语音转写系统,将健听人士的语音实时转写展示给聋哑人士。基于Web API和Tinker的聋哑人士语音转写系统,其优点是词库广泛,识别快速准确。项目由转写终端和云服务器组成,由终端采集用户语音后处理并上传到云服务器进行实时语音转写,支持除中文和英语外的51种外语,24种方言和1种民族语言,实现健听人士与聋哑人士的无障碍沟通交流,真正意义上双向无障碍沟通,这不仅仅是有温度的AI,更是科技的向善!

一、准备工作
我们将准备工作分为硬件部分和软件部分
硬件部分:旭日X3派,USB麦克风,电源适配器,烧录Ubuntu系统的SD卡,显示屏(或者VNC/SSH远程连接)

注意:购买麦克风时要购买二合一的USB麦克风,切勿购买3.5mm耳机接口传输的麦克风,因为开发板上面没有这种比较落后的3.5mm耳机孔

我这里使用的是上个项目的摄像头,因为这个摄像头内置了麦克风,妥妥的资源的充分利用了哈哈哈!!!
软件部分:Thonny集成开发环境
首先就是我们老生常谈的更新一下软件源和所有软件,只需要使用快捷键ctrl+alt+T打开命令行,输入以下命令,耐心等待即可
//更新软件源
apt-get update
// 更新升级所有软件
apt-get upgrade
开发工具依然是沿用我们上期的老搭档——Thonny,这里就不再赘述,直接上安装命令!
flatpak install org.thonny.Thonny //Flatpak
sudo apt install thonny //Debian,Raspbian,Ubuntu,Mintand others
sudo dnf install thonny //FedoraFedora
安装完成后同样是使用快捷键ctrl+alt+T打开命令行,输入Thonny启动,然后开始我们项目的重头戏,安装项目依赖库,选择左上方工具>>管理包

需要用到的第三方库和版本如下,大家可以根据这个顺序进行安装,以免遗漏(也可以复制到一个新的txt文件利用pip一次性安装)
cffi==1.12.3
gevent==1.4.0
greenlet==0.4.15
pycparser==2.19
six==1.12.0
websocket==0.2.1
websocket-client==0.56.0
注意,有些库安装失败的话代码可能不会有高亮提示,但运行时会报错,所以,出现报错第一时间检查第三方库是否成功安装!
这里我们着重介绍一下需要用到的Python标准GUI库——Tkinter
首先在Python程序中,Tkinter是Python的一个模块,它可以像其他模块一样在Python交互式shell中(或者“.py”程序中)导入,导入Tkinter模块后,就可使用Tkinter模块中的函数、方法等进行GUI编程。开发者可以使用Tkinter库中的文本框、按钮、标签等组件实现GUI开发。而GUI编程,又有点像我们小时候玩的积木,每个积木应该放在什么位置,每个积木要显示多大,即对每个元素的位置和大小进行管理,这便是布局管理器的任务。
然后第一件事能是检查Tkinter是否成功导入,代码如下
import tkinter
如果运行无误则说明导入成功,否之,则需要重新安装Tkinter库啦
接着我们学习然后创建一个窗口,先使用http://tkinter.Tk生成一个主窗口对象,然后才能使用Tkinter模块中其他的函数和方法等元素。生成主窗口以后才可以向里面添加组件,或者直接调用其mainloop()方法进行消息循环。示例如下:
import tkinter #导入Tkinter模块
top = tkinter.Tk()#生成一个主窗口对象
top.mainloop()#进入消息循环

那么,光有窗口肯定是不够的啦,我们要有交互,就需要有组件,组件与窗口一样,也是通过Tkinter模块中相应的组件函数生成的。在生成组件以后,就可以使用pack、grid或place等方法将它添加到窗口中。让我们来给窗口增添两个按钮吧。示例如下:
import tkinter #导入Tkinter模块
root = tkinter.Tk()#生成一个主窗口对象
label= tkinter.Label(root, text="Python, tkinter!")
label.pack()#将标签添加到窗口中
button1 = tkinter.Button(root, text="按钮1")#创建按钮1
button1.pack(side=tkinter.LEFT)#将按钮1添加到窗口中
button2 = tkinter.Button(root, text="按钮2")#创建按钮2
button2.pack(side=tkinter.RIGHT)#将按钮2添加到窗口中
root.mainloop()#进入消息循环

好的,至此,我们已经学会了用Tkinter库创建一个带交互功能的窗口,对于本项目而言已经足够!大家感兴趣可以继续学习其他组件,这里就不再赘述。
本地开发环境已经算是准备就绪了,那么接下来,我们来部署云服务器!
本项目选用科大讯飞云平台 (点击可进行跳转),登录平台后,通过右上角「控制台」,或右上角下拉菜单的「我的应用」进入控制台。不用担心,如果账户未曾创建过应用,平台会引导您创建您的第一个应用。应用创建完成之后,您就可以通过左侧的服务列表,选择要使用的服务。在服务管理面板中,将看到这个服务对应的可用量、历史用量、服务接口的验证信息,还有可以调用的API和SDK了。
那么,云服务器的部署重点来了!!!

要将应用创建后生成的APPID,APISecret和APIKey去替换代码中的APPID,APISecret和APIKey!!!并且一定要一一对应,否则会影响代码的正常运行!!!
def run():
global wsParam
wsParam = Ws_Param(APPID='你的APPID', APIKey='你的APIKey',APISecret='你的APISecret')
websocket.enableTrace(False)
wsUrl = wsParam.create_url()
ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close)
ws.on_open = on_open
ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE}, ping_timeout=2)
然后选择你需要的语种和服务即可,支持除中文和英语外的51种外语,24种方言和1种民族语言

二、实现原理
本项目主要就是利用python程序录制本地mp3格式的用户音频,并将音频上传到科大讯飞云平台进行实时转写,最后利用GUI库在屏幕上展示我们的转写结果。
关于云服务器的原理介绍,科大讯飞官方有详细文档 (点击可跳转),大家可以自行阅读,这里不做赘述
主要演示一下关于接收科大讯飞翻译文本的方法和窗口的实现
#定义接收科大讯飞翻译文本的方法
def thread_it(func, *args):
t = threading.Thread(target=func, args=args)
t.setDaemon(True)
t.start()
#窗口的实现
from tkinter import *
import threading
import tkinter
root = Tk() #初始化窗口
t = Text(root) #设置文本框
t.pack()
root.title("无障碍沟通交流系统") #设置标签
root.configure(bg='pink') #设置背景颜色
tkinter.Button(root, text='开始聆听', command=lambda :thread_it(run,)).pack() #设置按钮
三、效果展示
本项目对本地资源占用较小,得益旭日X3派的高算力和高性能,温度的控制让人十分满意。即使和上一个项目手语翻译终端同时运行也没有问题!


四、系统性能测试
系统测试方案:将程序导入旭日X3派中,接入电源后等待初始化完成,在安静的室内环境下,由我亲爱的小组成员们在麦克风前分别测试普通话,英语,方言(东北话),方言(四川话),将转写终端实时转写的准确率记录,同时将识别的总时长记录收集。
测试数据如下:


结果分析:接收到语音信息后到完成转写结果的显示总时长在0.5秒之内,实时返回结果,达到边说边返回的效果,对普通话和英文以及51种外语,24种方言和1种民族语言的识别率在95%以上。
结论:实现语音转写除了支持普通话和英语外,支持51个外国语种(包括日语,俄语,泰语,捷克语等等),支持24种方言(包括四川话,广东话,河南 话,上海话,台湾话等等),支持一种民族语言(彝语)。真正做到无障碍沟通交流。
那么本次的分享就到这里啦,喜欢的小伙伴不妨点个赞再走呀!!!
项目源码已经上传至附件,感兴趣的小伙伴可以下载哦
[地平线旭日X3派,开启你的嵌入式开发之旅],欢迎正在阅读的你申请试用,一起交流开发心得。