[chatgpt+Azure]unity AI二次元小女友之使用微软Azure服务实现RestfulApi->语音识别+语音合成

1.简述

        如题所述,这个小项目是在unity引擎端,使用了chatgpt+微软azure的一个AI二次元女友对话的项目,实现原理也比较简单,即在unity端实现AI二次元女友的交互界面,接入chatgpt-3.5-turbo的api接口,借助chatgpt的自然语言生成能力,作为这个项目的聊天引擎。聊天功能也比较简单,通过接入微软Azure的语音识别api,在unity客户端接入麦克风采集说话的声音,调用语音识别api返回识别的文本,再通过拼接prompt,调用chatgpt接口,得到回复信息文本之后,再调用azure的语音合成接口,得到音频,最后播放出来,关联live2d模型的口型同步,这样基本上就实现了我希望的效果。这个项目我已经在Gitee开源有一段时间了,本来也有计划要写一些相关文档的,一直没有时间,这次就抽时间把项目里涉及到的Azure语音服务部分的代码整理成文档,也方面想学习这个小伙伴一个参考。

2.微软Azure

        微软 Azure是微软基于云计算的操作系统,是微软“软件和服务”技术的名称。Windows Azure的主要目标是为开发者提供一个平台,帮助开发可运行在云服务器、数据中心、Web和PC上的应用程序。 说这么多,其实Azure就是微软提供给开发者各种云服务,其中就包括了AI相关的服务,比如语音服务。

Azure地址传送门:

云计算服务 | Microsoft Azure

        关于Azure服务的使用,需要首先申请一个Azure的账号,申请账号成功之后,就可以申请使用Azure的各种服务了。Azure提供了不少免费的服务,对于白嫖党来说简直就是福利。但是这里有一点需要说明了,就是申请Azure账号的时候,需要填写一个visa或万事达的信用卡账号,如果没有的话,就申请不了账号了,这个可能会是一个门槛。注册成功之后,微软会给你的账号赠送200美元的体验金,这个有效期有一年的时间,也算是一个相当好的福利了,就是信用卡的问题,必须解决,这里算是一个经验提示吧。

        在申请语音服务的订阅过程,第一个月可以申请试用的订阅,有效期是一个月的时间,可以免费提供50万字的语音合成额度,基本上自己用完全无压力。到第二个月就需要更新订阅了,更新完订阅,语音服务依然可以选择免费的F0订阅,享受50万字每月的额度。

3.Azure语音合成的代码实现

        在Azure语音的代码实现方面,微软官方实际上提供有sdk,其中也有适用unity的插件包可用,插件的传送门如下:

安装语音 SDK - Azure Cognitive Services | Microsoft Learn

        不过本文所介绍的代码实现并不是使用上述插件的代码实现,主要是因为之前我用这个sdk发现发布到webgl就不可用了,只能windows使用,这个有点坑,所以就查阅了Azure的官方文档,找到了restful api的实现方式,所以就实现了调用restful api实现语音识别和语音合成的代码,在这边文章做一下记录和分享,下面,分享一下具体的代码实现。

3.1.Azure语音识别

        实现语音识别这部分功能,首先在unity端是有获取麦克风声音的接口,可以直接获取电脑接入的麦克风,采集声音信息的功能的,所以只需要关注如何使用restful api调用Azure语音识别api的方法就可以了。

        Azure语音识别的api地址:

        https://{region}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=zh-CN

        这里面,region的值就是你在Azure语音服务里订阅的地区码,比如我订阅的是东亚地区的,所以这个地区码就是“eastasia”。

public string subscriptionKey = string.Empty;//服务令牌
public string serviceRegion = string.Empty;//地区码
public string language = string.Empty;//语言 /// <summary>/// 识别语音/// </summary>/// <param name="audioData"></param>/// <param name="_callback"></param>/// <returns></returns>private IEnumerator SendAudioData(byte[] audioData, Action<string> _callback){// Construct the request URLstring url = "https://" + serviceRegion + ".stt.speech.microsoft.com/speech/recognition/" +mode + "/cognitiveservices/v1?language=" + language;// Create the request objectUnityWebRequest request = UnityWebRequest.Post(url, "application/octet-stream");request.SetRequestHeader("Ocp-Apim-Subscription-Key", subscriptionKey);request.SetRequestHeader("Content-Type", "audio/wav; codec=audio/pcm; samplerate=44100");// Attach the audio data to the requestrequest.uploadHandler = new UploadHandlerRaw(audioData);request.uploadHandler.contentType = "application/octet-stream";// Send the request and wait for the responseyield return request.SendWebRequest();// Check for errorsif (request.result != UnityWebRequest.Result.Success){Debug.LogError("Speech recognition request failed: " + request.error);yield break;}// Parse the response JSON and extract the recognition resultstring json = request.downloadHandler.text;SpeechRecognitionResult result = JsonUtility.FromJson<SpeechRecognitionResult>(json);string recognizedText = result.DisplayText;// Display the recognized text in the consoleDebug.Log("Recognized text: " + recognizedText);_callback(recognizedText);}

用到的工具类:

[System.Serializable]
public class SpeechRecognitionResult
{public string RecognitionStatus;public string DisplayText;
}
using UnityEngine;
using System.IO;public static class WavUtility
{/// <summary>/// Converts an AudioClip to a byte array containing a WAV file./// </summary>public static byte[] FromAudioClip(AudioClip clip){// Create a new WAV fileMemoryStream stream = new MemoryStream();BinaryWriter writer = new BinaryWriter(stream);// Write the WAV headerwriter.Write(new char[4] { 'R', 'I', 'F', 'F' });writer.Write(36 + clip.samples * 2);writer.Write(new char[4] { 'W', 'A', 'V', 'E' });writer.Write(new char[4] { 'f', 'm', 't', ' ' });writer.Write(16);writer.Write((ushort)1);writer.Write((ushort)clip.channels);writer.Write(clip.frequency);writer.Write(clip.frequency * clip.channels * 2);writer.Write((ushort)(clip.channels * 2));writer.Write((ushort)16);writer.Write(new char[4] { 'd', 'a', 't', 'a' });writer.Write(clip.samples * 2);// Write the audio datafloat[] samples = new float[clip.samples];clip.GetData(samples, 0);int intMax = 32767; // max value for a 16-bit signed integerfor (int i = 0; i < clip.samples; i++){writer.Write((short)(samples[i] * intMax));}// Clean upwriter.Close();byte[] wavBytes = stream.ToArray();stream.Close();return wavBytes;}
}

3.2.Azure语音合成

        Azure语音合成部分的功能,需要将合成的文本,POST到Azure语音合成的restful api服务即可实现语音的合成功能,代码示例如下:

public string subscriptionKey = string.Empty;//服务令牌
public string serviceRegion = string.Empty;//地区码
public string language = string.Empty;//语言 /// <summary>/// 朗读的角色/// </summary>[Header("朗读声音设置")]public string voiceName = "zh-CN-XiaomoNeural";/// <summary>/// 情绪/// </summary>[Header("朗读的情绪设置" +"")]public string style = "chat";//chat  cheerful  angry  excited  sad/// <summary>/// restful api语音合成/// </summary>/// <param name="_msg"></param>/// <param name="_callback"></param>/// <returns></returns>private IEnumerator GetVoice(string _msg, Action<AudioClip> _callback){string textToSpeechEndpoint = string.Format("https://{0}.tts.speech.microsoft.com/cognitiveservices/v1", serviceRegion);//发送报文string textToSpeechRequestBody = GenerateTextToSpeech(language, voiceName, style, 2, _msg);using (UnityWebRequest speechRequest = new UnityWebRequest(textToSpeechEndpoint,"POST")){byte[] data = System.Text.Encoding.UTF8.GetBytes(textToSpeechRequestBody);speechRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(data);speechRequest.downloadHandler = (DownloadHandler)new DownloadHandlerAudioClip(speechRequest.uri, AudioType.MPEG);speechRequest.SetRequestHeader("Ocp-Apim-Subscription-Key", subscriptionKey);speechRequest.SetRequestHeader("X-Microsoft-OutputFormat", "audio-16khz-32kbitrate-mono-mp3");speechRequest.SetRequestHeader("Content-Type", "application/ssml+xml");yield return speechRequest.SendWebRequest();if (speechRequest.responseCode == 200){AudioClip audioClip = DownloadHandlerAudioClip.GetContent(speechRequest);_callback(audioClip);}else{Debug.LogError("语音合成失败: " + speechRequest.error);}}}

        语音合成设置参数中,涉及到朗读的声音,具体的声音编码可已到Azure的官方文档查阅,有详细的介绍,这里需要注意,有些声音的选择需要同步修改语言编码,这个根据官方文档来就可以了。官方文档地址:

Text to speech overview - Speech service - Azure Cognitive Services | Microsoft Learn

4.结束语

        本文介绍了一下微软Azure语音服务的restful api的使用代码示例。我在自己的开源项目AI二次元小姐姐聊天机器人里使用到了相关的技术,只停留在应用方面。当然在服务调用方法方面,官方也提供有多个不同语言的代码示例以及SDK,大家可以根据自己的实际需求选择技术方案。

        上述的代码示例并不是完整可以直接执行的代码,我只是将我的项目代码中,涉及到微软语音服务的关键部分提取出来了,源码还有部分unity客户端的代码逻辑,所以上面的代码实现仅供有编码基础的朋友参考,不要直接丢到自己的项目里使用。

        对我这个项目感兴趣的朋友,可以上我的B站号查看,我也做有详细的教程,相关源码可以在的哔哩哔哩主站找到相关视频,在视频介绍以及评论区获取。

【chatGPT+unity+Azure+VRoid】AI女友对话,源码分享,零基础手搓二次元妹子,打造专属的AI女友不是梦

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

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

相关文章

chatgpt 能用什么到底

l理论上gpt可以担任一个很好的方向指导GPT社区

微信导出表情包教程

方法1&#xff1a;微信公众号 去免费申请个微信公众号&#xff0c;然后关注就可以给公众号发送表情包了&#xff0c;然后就可以下载这个表情包。 方法二&#xff1a;微信网页版 登录 https://wx.qq.com/ 然后聊天发送的表情直接拉出页面就会生成新的表情包页面&#xff0c;然后…

简单操作,轻松在线制作gif动图表情包

相信很多的朋友在使用微信、QQ等工具聊天的时候&#xff0c;经常会用到各式各样的表情包。表情包不但更加的有趣&#xff0c;而且能传达出很多文字无法表达的感情和情绪&#xff0c;更加的生动形象。那么大家知道怎么gif制作https://www.gif.cn/动图的吗?接下来手把手教大家怎…

表情包的gif怎么制作?一招教你快速做gif表情

Gif表情包是当下网友们聊天必备的一种情感表达方式&#xff0c;利用一张有动态效果的图片就可以表达出自己的心情和想法&#xff0c;十分有趣。那么&#xff0c;大家一定很好奇自己应该如何制作gif动图表情包吧&#xff01;很简单&#xff0c;使用gif制作&#xff08;https://w…

从微信导出表情包的简便方法 (不使用微信 for pc,无需进入文件夹寻找!)

微信表情大概分为两类&#xff0c;一类是打开右下角有一个可以操作的按键可以保存&#xff0c;一般是做好一套可以下载的但大多数没有杀伤力&#xff0c;为江湖人所不齿&#xff0c;另一件是没有的&#xff0c;本文从&#xff08;技术角度&#xff09;讨论后一个 不使用微信 f…

怎么做表情包微信gif?好用的制作方法介绍

怎么做表情包微信gif&#xff1f;现如今基本上人手一个微信&#xff0c;微信作为我们日常人际沟通的重要工具之一&#xff0c;我们在日常的聊天中&#xff0c;除了发送文字、图片等内容&#xff0c;也会发送一些表情包&#xff0c;活跃气氛。通常情况下&#xff0c;我们发送的表…

LM+Embedding构建问答系统的局限性及优化方案

原文&#xff1a;LLMEmbedding构建问答系统的局限性及优化方案 - 知乎 近期 LangChain LLM 方案高速发展&#xff0c;降低了知识问答等下游应用的开发门槛。但随着业务深入&#xff0c;一些局限性也日渐显露&#xff0c;比如&#xff1a;LLM意图识别准确性较低&#xff0c;交互…

Segment Anything CV界的GPT—prompt-based里程碑式研究成果

一、计算机视觉界的里程碑式研究成果 - SAM与SA-1B综述 Segment Anything受chatGPT式的prompt-based思路启发&#xff0c;训练数据集涵盖10亿masks&#xff0c;根据提供的图片注释实时产生不同的mask分割结果&#xff0c;试用效果惊人。 Segment Anything之于Computer Vision&…

更快地分割任何事物:面向移动应用的轻量级Sam

文章目录 摘要1、简介2、相关工作3、适合移动设备的SAM3.1、背景和项目目标3.2、提出方法4、实验4.1、实验设置4.2、MobileSAM的性能与原版SAM相当4.3、MobileSAM优于FastSAM5、结论摘要 https://arxiv.org/pdf/2306.14289v2.pdf 分割任何事物模型(SAM)因其令人印象深刻的零样本…

基于自然语言处理的多模态模型_综述

A Survey on Multimodal Large Language Models&#xff1b; 论文链接&#xff1a;https://arxiv.org/pdf/2306.13549.pdf 项目链接(实时更新最新论文&#xff0c;已获1.8K Stars)&#xff1a;https://github.com/BradyFU/Awesome-Multimodal-Large-Language-Models 研究背景 …

AI向百万薪资 高级原画师开刀?!爆Midjourney入局3D模型生成

来源 SoulofArt | ID Soul_Art 现在AI向高级原画师和3D开刀了&#xff1f; 网传爆料AI已入局3D模型生成... 这进化速度放在整个行业都十分炸裂 4月&#xff0c;Midjourney进一步宣布推出Niji-journey V5 这是MJ针对二次元动漫风格预训练好的模型 可在其中添加提示词直接调…

Java 20 正式发布,超神了。。

出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013) ChatGPT王炸更新&#xff01;终于解封了... 老铁们&#xff0c;JDK 20 / Java 20 正式发布了&#xff0c;这版本号简直超神了。。 JDK 20 是一个短期维护版本&#xff0c;将获得六个月的支持。尽管如此&#xff0c;但…

JDK 20 正式发布, JDK 21 最新动态来了

点击“开发者技术前线”&#xff0c;选择“星标” 让一部分开发者看到未来 来自 infoQ | OSC开源社区&#xff08;ID&#xff1a;oschina2013) JDK 20 是自 JDK 17, 以来的第三个非长期支持&#xff08;LTS&#xff09;版本&#xff0c;正如甲骨文 Java 平台组的首席架构师 Ma…

Ubuntu安装spark时遇到的问题及解决方案

伪分布式模式配置&#xff1a; 安装SSH: 问题一&#xff1a;安装openssh-server时出现以下报错 Package openssh-server has no installation candidate 出错原因: 一开始以为是apt命令没更新&#xff0c;apt-get update之后发现还是安装不了&#xff0c;可能是 文件/etc/apt…

ERROR Error: command failed: pnpm install --reporter silent --shamefully-hoist 错误解决办法

使用 vue-cli、pnpm创建新项目遇到的错误如下图所示&#xff1a; 在命令行安装pnpm6的版本&#xff1a; npm i pnpm6 -g vue create hello-world还可以直接使用npm安装就不报错了&#xff0c;输入一下代码&#xff1a; vue create hello-world -m npm以上两种方法都是亲测可…

postman 7.3.4 64位的下载、安装与使用

目录 postman的简介 postman下载地址及安装 postman的使用 postman 一、postman的简介 postman是一款功能强大的网页调试和模拟发送HTTP请求的Chrome插件&#xff0c;支持几乎所有类型的HTTP请求&#xff0c;操作简单且方便。二、postman下载地址及安装 我的postman下载网…

360手机java手机管家软件_360手机管家最新版下载_360手机管家官方下载-太平洋下载中心...

常见问答&#xff1a; 1、360手机管家连接不上手机怎么办? 答&#xff1a;如果发现360手机管家连接不上手机&#xff0c;你可以先检查下自己的数据线是否有问题&#xff0c;尝试连接其它设备看能不能连接。如果检查数据线与其它设备可以正常连接&#xff0c;那说明数据线是没问…

如何删除360奇安信软件

1.事情的缘由 之前待过一家公司&#xff0c;安装了360奇安信安全软件。由于更换了电脑&#xff0c;必须卸载奇安信&#xff0c;可是删除需要输入密码。后来联系了相关的人员&#xff0c;因为软件使用有点久远&#xff0c;没找到密码。 2.在安全模式下卸载 根据网上查询到的资…

Postman下载安装

一、Postman下载 1、Postman64位安装包下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1lInTrSfW9PMmYI6OsUS2tg 提取码&#xff1a;nvbw 2、Postman32位安装包下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1S_7K9wqyDwuoe-mjQowpKQ 提取码&#xf…

chatgpt赋能Python-python3的下载

Python 3-您在编程路上不可或缺的伙伴 如果您正在寻找一种流行的编程语言&#xff0c;那么Python 3就是一个不错的选择。Python 3作为一种高级编程语言&#xff0c;可以轻松地创建各种应用程序和网站。它是最受欢迎的编程语言之一&#xff0c;就是因为它易于学习和使用。 Pyt…