云来山更佳,云去山如画,山因云晦明,云共山高下,欢迎来到我的博客,这里便是山云汇雾之处~

一个语音对话+实时渲染+跨平台的图灵机

作品 PG7GO 34℃ 0评论

一、简介

把之前做了一半的课题又接着做了,结合语音对话+实时渲染+跨平台的图灵机。

人脸识别还没搞,做个麦克风适配16k赫兹都够呛,光编程语言都用到了 js、webgl、c#、java、python。

该AI最大的特点是无聊时喜欢嘲讽你,如果你的麦声音太杂,可能会影响她思考。

测试网页(网速可能比较慢):https://ficman.doingtest.top/

测试有问题请告诉我,服务器最大并发数为2

(实际上手机也是可以测试的,点击很小的那个ok,手机横屏,然后点击全屏按钮,但是要你浏览器足够优秀才能调用语音设备,不然只能被AI换着花样骂还不了嘴,不要用QQ自带的浏览器,那个输名字都输不了)

这是支持使用录音API的浏览器列表,录音API用的是W3C在H5制定的新标准

二、坑

实际上这个还是蛮难的。

首先Unity的Microphone API在WebGL上是完全不能用的,这里需要使用外部的Js去获取浏览器信息,选择适配的代码,再获取麦克风的信息和权限,并录制语音,之后再往WebGL传递信息。因为要录制16000Hz的音频用于分析,这里使用了AudioContext,浏览器适配参考:https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/AudioContext

在WebGL收到信息后,会将信息传递给Unity的C#脚本,再之后,会将语音信息float数组用一个拆分位移的办法去变成一个byte数组,然后C#脚本会使用HTTP协议,往我服务器上的Springboot服务发送这个语音信息,并在服务器上调用JAVA写的另一个处理线程,读取Token,往语音处理服务器上继续发送一个HTTP包,之后将返回的文字信息包装一下,发给Unity这边,之后会有一个本地处理,然后再来一次这个过程,接受一个byte数组,将byte数组转成float数组,然后再转成UnityClip,之后播放。

这里有不少坑都是不存在轮子的,UnityAssetStore有WebGL的Microphone库,不过功能是在是少,频率也不能改动,这里我是重写了份。byte数组与float数组则是参考了别人的一则代码,虽然没搞懂一些常数的含义,但是还是把功能实现了。另外由于网络部分代码写得少,导致我c#与java传递byte数组时,出现了编码问题,java收到的数据大小是c#的两倍,后来研究发现是unity的网络函数封装过度,自己弄了个不必要的编码。

当一切弄完,测试好了后,部署到服务器上又出现了一些新的问题。比如说前后端跨域问题、录音API需要SSL证书认知的网页才能用……于是申请证书……特别麻烦,前端申请一个,后端申请一个,还给CDN申请一个,真的是配置得吐血了,证书还只有一年的有效期,就是说过期还得重新去申请……

 

三、感想

原以为两天能搞定的结果搞了可能五天吧,累死累活地肝,每天都在3点左右才睡觉,第二天10点又爬起来继续肝。想了想,这样对身体也太不好了,以后还是得作息规律,早睡早起比较好。

不得不说,虽然很多东西是基于我之前的现成代码,但是我依然学到了很多,这种完整的项目更有锻炼的意味在里面。

兴趣使然而作,实际上并不是为了什么课题,不过顺便能报个课题什么的也不错吧。

 

 

 


PG7GO , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:一个语音对话+实时渲染+跨平台的图灵机
喜欢 (1)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. You could definitely see your enthusiasm in the work you write. Randell Longerbeam
    bets10 giris2022-08-20 20:50 回复