Unity+chatgpt+webgl实现声音录制+语音识别

一、前言 

        AI二次元女友这个项目持续更新,在window端的语音识别和语音合成的功能,在上一篇博文里已经详细说明了微软Azure语音服务的代码实现。也是为了实现一次代码,多端复用这样的诉求,所以全部的代码实现都改成了web api的方式。然而在实测发布到webgl的时候,就发现了一个问题,因为这个项目涉及到麦克风录制声音,用作语音识别,结果在发布的时候,引擎报错,提示unity发布到webgl失败了,查了一下相关资料,原来是unity内置的microphone类是不支持webgl了,所以只好另找解决方案。

        ·我在网上也查了不少资料,从unity官方也得到了一些信息,解决方案的思路,参见unity官方文档,文档里描述了unity如何调用js的方法,涉及到unity端*.jslib的拓展方法,unity文档:

https://docs.unity3d.com/cn/2020.3/Manual/webgl-interactingwithbrowserscripting.html

        因为自己技术能力也有限,所以找了好几个现成的解决方案,做了实测,最后找到一个博主提供的解决方案以及源码。把他的源码集成到我项目里,确实是解决了我的问题,是实现了发布到webgl之后,可以调用麦克风录音,并且通过Azure的语音识别,正确识别到文本了。这过程其实也遇到不少问题,花了点时间,不过最终都解决了,怕自己忘记了,所以就赶忙写个文档留存,以防未来需要的时候,可以查阅。我参考的博主的解决方案里,除了在unity端调用js代码外,还有js回传数据到unity。部分代码实现是在js里实现了,所以在发布webgl后,需要修改一点代码,并加入js库,具体配置方法,见下文。

二、发布Webgl

        unity发布webgl项目的设置,首先确保引擎安装了webgl平台的拓展,这个在buildsetting里如果切换不到webgl平台,那就上官网下在安装包,安装上就可以了。转换一下平台即可。发布之前确认一下工程的路径,保证工程的路径是全英文的,不然导出webgl会报错。

        发布设置方面:

        1、Other Settings里,Color Space修改为Gamma

        

        2、Publishing Settings里,勾选Decompression Fallback

        

         如果说在发布webgl过程发现其他问题,自行到百度或其他渠道去搜一下,这方面的资料很多,基本上都可以找到相关问题的解决方案,以上是我在发布时遇到的一些配置问题,做一下记录。

三、脚本说明

        项目涉及到unity端还有js端两部分的代码。

        1、unity端代码说明

        在unity端,参见官方解决方案,需要在unity的Plugins文件下,创建*jslib文件,在这个库里,按照unity官方提供的示例编写js代码,然后在C#脚本里按照指定的方式引用就可以在unity端调用js代码了。

        jslib官方代码示例(这个文件要放在Plugins文件夹下面)

mergeInto(LibraryManager.library, {Hello: function () {window.alert("Hello, world!");},
});

        在C#端,根据官方示例,编写以下代码就可以引用到js的方法了

 [DllImport("__Internal")]private static extern void Hello();

        以上是C#调用js代码的示例,在项目功能里已经把录音和结束录音的功能封装好了,直接调用就可以了,根据自己的需要,调用StartRecord()开始录制,调用StopRecord()结束录制

    [DllImport("__Internal")]private static extern void StartRecord();[DllImport("__Internal")]private static extern void StopRecord();

      2、js代码说明

        源码提供了js代码,因为项目涉及到js端完成录制后,需要把录音数据回传到unity中使用,所以还需要增加一部分的js代码,实现上述功能。源码里提供了相关的代码,我们只需要在导出的webgl包里,修改相应的代码文件,就可以了。具体的修改方法,见下一节内容。

四、脚本配置

        这节里详细说明一下在导出的webgl包中的代码配置内容。

        1、添加js脚本

        找到[recorder.wav.min.js]脚本,把脚本拷贝到输出的webgl包,index.html相同的文件夹下[根目录]即可。

        

        2、修改index.html 

        先找到[AddToIndex.js]文件,后续需要添加的代码都在这个文件里了,直接复制就可以了。

        ①在index.html中引用/recorder.wav.min.js脚本

        在[AddToIndex.js]文件,里拷贝"<script src="./recorder.wav.min.js"></script>",添加到index.html里,引用[recorder.wav.min.js]脚本。

 <script src="./recorder.wav.min.js"></script><script>var container = document.querySelector("#unity-container");var canvas = document.querySelector("#unity-canvas");var loadingBar = document.querySelector("#unity-loading-bar");var progressBarFull = document.querySelector("#unity-progress-bar-full");var fullscreenButton = document.querySelector("#unity-fullscreen-button");var warningBanner = document.querySelector("#unity-warning");....后续面代码略
</script>

        ②拷贝js处理代码到index.html中

        [AddToIndex.js]里拷贝第7行到110行的代码,到<script>脚本里(可以直接添加到" document.body.appendChild(script);"这行代码后面)


document.body.appendChild(script);这行不要拷贝,就是告诉你从哪行开始粘贴// 全局录音实例
let RecorderIns = null;//全局Unity实例   (全局找 unityInstance , 然后等于它就行)let UnityIns = null;// 初始化 ,   记得调用function initRecord(opt = {}) {let defaultOpt = {serviceCode: "asr_aword",audioFormat: "wav",sampleRate: 44100,sampleBit: 16,audioChannels: 1,bitRate: 96000,audioData: null,punctuation: "true",model: null,intermediateResult: null,maxStartSilence: null,maxEndSilence: null,};let options = Object.assign({}, defaultOpt, opt);let sampleRate = options.sampleRate;let bitRate = options.sampleBit;if (RecorderIns) {RecorderIns.close();}RecorderIns = Recorder({type: "wav",sampleRate: sampleRate,bitRate: bitRate,onProcess(buffers, powerLevel, bufferDuration, bufferSampleRate) {// 60秒时长限制 const LEN = 59 * 1000;if (bufferDuration > LEN) {RecorderIns.recStop();}},});RecorderIns.open(() => {// 打开麦克风授权获得相关资源console.log("打开麦克风成功");},(msg, isUserNotAllow) => {// 用户拒绝未授权或不支持console.log((isUserNotAllow ? "UserNotAllow," : "") + "无法录音:" + msg);});}// 开始function StartRecord() {RecorderIns.start();}// 结束function StopRecord() {RecorderIns.stop((blob, duration) => {console.log(blob,window.URL.createObjectURL(blob),"时长:" + duration + "ms");sendWavData(blob)},(msg) => {console.log("录音失败:" + msg);});}// 切片像unity发送音频数据function sendWavData(blob) {var reader = new FileReader();reader.onload = function (e) {var _value = reader.result;var _partLength = 8192;var _length = parseInt(_value.length / _partLength);if (_length * _partLength < _value.length) _length += 1;var _head = "Head|" + _length.toString() + "|" + _value.length.toString() + "|end" ;// 发送数据头UnityIns.SendMessage("SignalManager", "GetAudioData", _head);for (var i = 0; i < _length; i++) {var _sendValue = "";if (i < _length - 1) {_sendValue = _value.substr(i * _partLength, _partLength);} else {_sendValue = _value.substr(i * _partLength,_value.length - i * _partLength);}_sendValue = "Part|" + i.toString() + "|" + _sendValue;// 发送分片数据UnityIns.SendMessage("SignalManager", "GetAudioData", _sendValue);}_value = null;};reader.readAsDataURL(blob);}

        ③初始化代码

        这里需要注意添加一下实例化代码,需要在index.html里找到unityInstance的实例化代码块里,添加"UnityIns = unityInstance;  initRecord();" 这两行代码,(可以添加到"then((unityInstance) => {" 这段代码之后)

   script.onload = () => {createUnityInstance(canvas, config, (progress) => {progressBarFull.style.width = 100 * progress + "%";}).then((unityInstance) => {UnityIns = unityInstance;//拷贝代码initRecord();//拷贝代码loadingBar.style.display = "none";fullscreenButton.onclick = () => {unityInstance.SetFullscreen(1);};}).catch((message) => {alert(message);});};

        修改完上述代码,就配置完成了,可以部署webgl项目实测一下效果了。这里我实测原作者项目的时候,遇到过一个问题。因为我的项目是需要拿到录音数据,发送到语音识别api的,刚开始发现识别的结果有问题,一直不准确。后来在录制声音的配置上,把采样率调整未44100之后,就识别正常,这里做一下记录,我自己的源码就已经做过这个修改了。

        五、结束语

        这次这个方案,解决了unity语音识别功能发布到webgl失效的问题,现在这个项目可以顺利部署到webgl使用了。目前这个解决方案,在发布之后还需要做一些js的代码处理,相对麻烦一些,目前我还没有找到更简单的解决方案,未来如果找到更便捷的方案再做分享。

        项目的源码,目前还没整理,待我整理好源码之后,再补充到这里,先留个空地,待后续补充上。

AI二次元女友项目源码:

Github地址:https://github.com/zhangliwei7758/unity-AI-Chat-Toolkit

Gitee地址:https://gitee.com/DammonSpace/unity-ai-chat-toolkit

项目视频可参见我的B站主页:

【重大更新->简单部署+跨平台】重构AI二次元小姐姐项目,发布了新的unity工具包,更易用+实用的AI套件,开源代码等你来拿!!

        六、参考资料

        这个解决方案也查阅了很多大佬的资料,以下是查阅和参考的相关资料传送门:      

CSDN博客:https://blog.csdn.net/Wenhao_China/article/details/126779212?spm=1001.2014.3001.5502t

CSDN博文:https://blog.csdn.net/a987654sd/article/details/105551560

解决方案作者的源码地址:

Github:https://github.com/HiWenHao/UnityWebGLMicrophone

附加材料:

以下两个webgl使用microphone方案我尚未验证,也放在这里供参考

解决方案1:https://gitcode.net/mirrors/xiangyuecn/recorder?utm_source=csdn_github_accelerator

解决方案2:https://github.com/tgraupmann/UnityWebGLMicrophone/tree/maste

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31095.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI CEO中国首次演讲,称未来十年出现超强AI系统!AGI安全治理是重点

来源 | 新智元 硅谷独角兽&#xff0c;又来震撼世界了&#xff01; 这支名叫Character Technologies的独角兽的核心力量&#xff0c;来自前谷歌LaMDA团队。 大模型研究测试传送门 GPT-4传送门&#xff08;免墙&#xff0c;可直接测试&#xff0c;遇浏览器警告点高级/继续访问…

首周下载量碾压ChatGPT!谷歌20年老员工叛逃,创立第二个OpenAI?

来自&#xff1a;新智元 进NLP群—>加入NLP交流群 【导读】这款爆火的AI聊天新宠&#xff0c;首周下载量就碾压了ChatGPT。更有意思的是&#xff0c;产品背后的独角兽&#xff0c;就是谷歌的前LaMDA团队。婉拒劈柴&#xff0c;出走谷歌&#xff0c;这是要走向人生巅峰了&…

韩启德院士:关于生死,我向ChatGPT提了一个问题

来源&#xff1a;学术世界 图源&#xff1a;pexels 第五届北京大学清明论坛今天开幕了&#xff0c;我衷心祝贺&#xff01; 前四届论坛都取得了成功&#xff0c;讨论越来越深入&#xff0c;社会影响越来越广泛。人们对死亡由忌讳到热议&#xff0c;实质是大家对生命和人生意…

如何从零开始构建一个网络讨论帖分类模型?

Motivation 前几天搭建了一个对牛客网每天最新的工作信息进行爬取的程序&#xff0c;见牛客网爬虫&#xff0c;但从网上爬取下来的帖子有很多不是工作信息&#xff0c;需要把这部分干扰信息给排除掉&#xff0c;否则很影响使用心情。之前使用关键词与正则表达式进行了简单过滤…

chatgpt赋能python:Python画图设置指南

Python画图设置指南 引言 Python是一种高级编程语言&#xff0c;在数据科学及数据可视化领域中越来越受欢迎。Python拥有众多的绘图库&#xff0c;例如matplotlib和seaborn。但是&#xff0c;你需要花费时间和精力在图的布局、颜色、字体等方面的调整上&#xff0c;以提高图表…

今日份安利:智能写诗的软件哪个好?

在传统的文学领域中&#xff0c;诗歌是一种高度艺术化的表达方式。然而&#xff0c;在科技的加持下&#xff0c;AI写诗生成器已经成为了一种新的创作方式。这些机器人诗人可以从大量的语料库中学习和理解诗歌的结构和意义&#xff0c;进而生成出令人惊叹的诗歌作品。对于那些渴…

川核灵境|三月AIGC新品热潮,AI 2.0时代已扑面而来

在元宇宙、Web3.0等概念风靡的2022年&#xff0c;AI凭借“创作”强势崛起&#xff0c;这预示着AIGC元年已经开启&#xff0c;下一个万亿赛道即将爆发。2023年&#xff0c;将是AIGC与Web3、元宇宙密切结合并将爆发的一年。三月再次迎来AIGC新品热潮&#xff0c;一场资本的盛宴正…

GPT Demo 分享|日不落直播间接入虚拟人AI互动

摘要 虚拟人和数字人是人工智能技术在现实生活中的具体应用&#xff0c;它们可以为人们的生活和工作带来便利和创新。在直播间场景里&#xff0c;虚拟人和数字人可用于直播主播、智能客服、营销推广等。接入GPT的虚拟人像是加了超强buff&#xff0c;具备更强大的自然语言处理能…

虚拟数字人成短视频/直播主阵地,虚拟人提升数字内容生产效率

由于短视频在传播便携性、功能性和交互性等多个方面的优势&#xff0c;短视频已逐渐成为现代社会情感表达和信息传播的重要载体。尤其随着移动互联网的普及和碎片化信息迅捷传播需求的高涨&#xff0c;各行各业的内容创作者纷纷涌入视频内容赛道&#xff0c;短视频成为了许多企…

AI数字人主播营销崛起,李佳琦还能继续保持领先地位吗?

“你们能想象我们的客户1万多平方米办公室只剩下几千个数字人在通宵直播吗&#xff1f;一个晚上赚几百万&#xff0c;基本上成本一晚上就赚回来了。”这是一名网友对数字人的发言。 随着今年ChatGPT掀起的人工智能大模型热潮&#xff0c;数字人又迎来一轮更加磅礴的爆发&#…

chatgpt赋能python:Python并行线程介绍:提高程序运行效率

Python并行线程介绍&#xff1a;提高程序运行效率 概述 随着计算机硬件的发展&#xff0c;越来越多的应用需要充分利用计算机的资源来提高程序运行效率。并行计算通过同时使用多个计算资源&#xff08;如CPU或GPU&#xff09;来加速计算过程。Python语言作为一种高效、易读易…

上市公司高管CEO员工数据大全 1991-2021年上市公司高管CEO教育背景学历结构薪酬职务任期年龄出生地 员工学历结构人员结构

&#xff08;1&#xff09;上市公司高管教育背景、学历结构&#xff0c;且含有多份不同来源的100多万数据集&#xff1b;包含 简历、出生地、年龄、教育背景、学历结构、薪酬、职务、股权期权等 &#xff08;2&#xff09;上市公司CEO教育背景、学历结构数据集&#xff0c;包含…

2004-2020中小企业板上市公司财务报表股票交易董事高管等面板数据

1200变量&#xff01;中小企业板上市公司面板数据大全 2004-2020年 1、时间&#xff1a;2004-2020年 2、数据范围&#xff1a;共计973家上市公司 3、数据指标&#xff1a;包括财务报表、股票交易、董事高管等1200变量 4、用途&#xff1a;进行上市公司高管股权激励与公司绩…

【AI实战】快速搭建中文 Alpaca 33B 大模型 Chinese-Alpaca-33B

【AI实战】快速搭建中文 Alpaca 33B 大模型 Chinese-Alpaca-33B 中文 33B 大模型 Chinese-Alpaca-33B环境配置搭建过程1.拉取 chinese-alpaca-lora-33b2.合并lora权重3.llaa.cpp量化模型准备模型权重转换为ggml的FP16格式对FP16模型进行4-bit量化 测试参考 中文 33B 大模型 Chi…

OpenAI的人工智能语音识别模型Whisper详解及使用

1 whisper介绍 拥有ChatGPT语言模型的OpenAI公司&#xff0c;开源了 Whisper 自动语音识别系统&#xff0c;OpenAI 强调 Whisper 的语音识别能力已达到人类水准。 Whisper是一个通用的语音识别模型&#xff0c;它使用了大量的多语言和多任务的监督数据来训练&#xff0c;能够在…

Mixlab助力生态伙伴:ChatGPT火种节,开始报名了

10年推动100万大学生创业 ChatGPT火种节 是什么&#xff1f; ChatGPT火种节是校园VC与清华x-lab主办的创客马拉松活动。目的是挖掘AI大语言模型相关的早期项目&#xff0c;激活清华周边的人工智能创业者社群&#xff0c;活跃北京中关村的高校数字创业生态。 火种节将用48小时&a…

如何更好地蒸馏ChatGPT模型能力:Lion闭源大型语言模型的对抗性蒸馏模型原理及实验工作介绍...

来自&#xff1a;老刘说NLP 进NLP群—>加入NLP交流群 如何将ChatGPT的能力蒸馏到另一个大模型&#xff0c;是当前许多大模型研发的研发范式。当前许多模型都是采用chatgpt来生成微调数据&#xff0c;如self instruct&#xff0c;然后加以微调&#xff0c;这其实也是一种数据…

ChatGPT提示词工程师教程-摘要

我觉得这一期的内容比较划水&#xff0c;实际上还是上一期“迭代”的内容&#xff0c;只是将迭代的内容更具体地落到“摘要”这个功能上。 实际应用&#xff1a;可以对网站上大量的用户评论进行摘要&#xff0c;生成一个面板&#xff0c;可以通过点击摘要看具体的评论。

爆火的Auto-GPT:实战及运行体验

Auto-GPT可以说是目前AI应用方向最火爆的项目了&#xff0c;自从3月份上线以来&#xff0c;一个月疯狂拦下将近7万star&#xff08;截至本文写稿时69.5k&#xff09;。它的目的是探索诸如GPT-4这样的大语言模型自主完成任务的能力。业界也有一些大佬出来表示这个项目真的很有趣…

把你的阿里巴巴图标库转成你自己的@ant-design/icons

背景 我们使用iconfont-阿里巴巴矢量图标库来管理自己的一套图标&#xff0c;并且基于它的js资源&#xff0c;封装了自己的icons图标组件。封装的方法是使用了antd提供的createFromIconfontCN方法 但随着图标库越来越大&#xff0c;JS资源文件也变得越来越大。在业务中&#x…