0. PhotoVoice 光子语音PhotonVoice | 光子引擎photonengine中文站

1. Vivox  来自 Vivox 的游戏内语音和文本聊天 SDK | Unity Multiplayer 服务

2. Agora 声网 声网 - 全球实时互动API平台开创者

3. Zego  HarmonyOS Java 实时音视频概述 - 开发者中心 - ZEGO即构科技

Vivox是什么

  1. Vivox是第三方语音和文本通信系统,常用于构建游戏项目的语音、实时聊天系统, 在 PC、移动或游戏主机平台上为玩家提供通信服务。

  1. Vivox被Unity收购,因此做为独立的第三方通信服务商的同时,Vivox成为了Unity产品矩阵中所提供的一项服务,可以为游戏项目提供语音通信服务。

https://unity.com/products

https://unity.com/products/vivox

二、如何接入

使用Unity的Vivox服务来构建游戏项目中的聊天系统:

  1. 配置Unity客户端:Unity商店中购买并安装插件

  1. 购买配置vivox服务端:https://support.unity.com/hc/en-us/articles/6380084154772-Vivox-How-do-I-get-started-with-Vivox-in-my-Unity-Project-

  1. 调用SDK API接入项目。

https://docs.vivox.com/v5/general/unity/15_1_180000/en-us/Default.htm#Unity/Unity.htm

  1. Service Relay

https://docs.unity.com/relay/introduction.html

Unity Relay 中继服务通过充当代理提供通用中继服务器连接,而无需维护第三方或专用游戏服务器 (DGS) 或担心架构点对点网络服务的复杂度。

中继服务有两个关键组件:the Relay servers 中继服务器and the Relay Allocations service中继分配服务。

  1. Service Lobby

https://docs.unity.com/lobby/unity-lobby-service-overview.html

Lobby 聊天大厅服务提供了两个主要功能:公共大厅和私人大厅,以供玩家创建和查找游戏会话。

三、Sample Chat Channel

演示 Vivox SDK 如何集成到 Unity 游戏中。

https://docs.vivox.com/v5/general/unity/15_1_180000/en-us/Default.htm#Unity/chat-channel-sample/chat-channel-sample-overview.htm

四、Sample Chat Lobby

演示大厅聊天频道的游戏集成

https://github.com/Unity-Technologies/com.unity.services.samples.game-lobby

Agora声网

文档:实现语音通话

https://docs.agora.io/cn/live-streaming-premium-legacy/start_call_audio_unity

文档:使用自定义的音视频源或渲染器,实现相关场景:

https://docs.agora.io/cn/voice-legacy/custom_audio_unity?platform=Unity

文档:采集音频原始数据:

https://docs.agora.io/cn/live-streaming-premium-legacy/raw_data_audio_unity?platform=Unity

采集实现方法

音频传输过程中,我们可以获取采集到的音频原始数据。

Agora Unity SDK 通过提供 AudioRawDataManager 类,实现采集原始音频数据功能。

在使用原始音频数据功能前,请确保你已在项目中完成基本的实时音频功能,详见实现音频通话或实现音频直播。

参考如下步骤,在你的项目中实现原始音频数据功能:

  1. 加入频道前调用 RegisterAudioRawDataObserver 方法注册音频观测器。

  1. 成功注册后,根据需求调用以下方法:

    1. 调用 SetOnRecordAudioFrameCallback 监听 OnRecordAudioFrameHandler 回调。SDK 会通过 OnRecordAudioFrameHandler 回调向用户发送采集到的原始音频数据。

    2. 调用 SetOnPlaybackAudioFrameCallback 监听 OnPlaybackAudioFrameHandler 回调。SDK 会通过 OnPlaybackAudioFrameHandler 回调向用户发送播放的原始音频数据,即所有远端用户混音后的音频数据。

    3. 调用 SetOnMixedAudioFrameCallback 监听 OnMixedAudioFrameHandler 回调。SDK 会通过 OnMixedAudioFrameHandler 回调向用户发送混音后的采集和播放的原始音频数据,即所有本地和远端用户混音后的音频数据。

    4. 调用 SetOnPlaybackAudioFrameBeforeMixingCallback 监听 OnPlaybackAudioFrameBeforeMixingHandler 回调。SDK 会通过 OnPlaybackAudioFrameBeforeMixingHandler 回调向用户发送指定远端用户混音前的原始音频数据。

  1. 用户拿到音频数据后,根据场景需要自行进行处理。以通过 Unity AudioSource 组件播放音频原始数据为例,大致流程如下:

    1. 创建一个有限队列。

    2. 在步骤 2 中调用任意回调后,会返回 buffer 数据。在该队列后端插入回调返回的 buffer 数据。

    3. 通过 AudioClip 组件的 setData 方法,从该队列前端按顺序取出 buffer 数据,并存入 AudioClip 组件。

    4. 通过 AudioSource 组件播放 AudioClip 组件中的数据。

  1. 离开频道后调用 UnRegisterAudioRawDataObserver 注销音频观测器。

API 调用时序

下图展示使用原始音频数据的 API 调用时序:

示例代码

你可以对照 API 时序图,参考下面的示例代码片段,在项目中实现原始音频数据功能:

void Start()
{// 初始化 IRtcEngine 对象。mRtcEngine = IRtcEngine.GetEngine(mVendorKey);// 获取 AudioRawDataManager 对象。AudioRawDataManager = AudioRawDataManager.GetInstance(mRtcEngine);// 注册音频观测器。mRtcEngine.RegisterAudioRawDataObserver();// 监听 OnRecordAudioFrameHandler delegate。AudioRawDataManager.SetOnRecordAudioFrameCallback(OnRecordAudioFrameHandler);// 监听 OnPlaybackAudioFrameHandler delegate。AudioRawDataManager.SetOnPlaybackAudioFrameCallback(OnPlaybackAudioFrameHandler);// 监听 OnMixedAudioFrameHandler delegate。AudioRawDataManager.SetOnMixedAudioFrameCallback(OnMixedAudioFrameHandler);// 监听 OnPlaybackAudioFrameBeforeMixingHandler delegate。AudioRawDataManager.SetOnPlaybackAudioFrameBeforeMixingCallback(OnPlaybackAudioFrameBeforeMixingHandler);
}// 获取本地采集到的原始音频数据。
void OnRecordAudioFrameHandler(AudioFrame audioFrame)
{Debug.Log("OnRecordAudioFrameHandler");
}// 获取从远端接收到的原始音频数据。
void OnPlaybackAudioFrameHandler(AudioFrame audioFrame)
{Debug.Log("OnPlaybackAudioFrameHandler");
}// 获取本地和远端混音后的原始音频数据。
void OnMixedAudioFrameHandler(AudioFrame audioFrame)
{Debug.Log("OnMixedAudioFrameHandler");
}// 获取指定本地或远端用户混音前的原始音频数据。
void OnPlaybackAudioFrameBeforeMixingHandler(uint uid, AudioFrame audioFrame)
{Debug.Log("OnPlaybackAudioFrameBeforeMixingHandler");
}public enum AUDIO_FRAME_TYPE
{// 0: PCM16FRAME_TYPE_PCM16 = 0,
};public struct AudioFrame
{// 音频帧类型。详见 #AUDIO_FRAME_TYPE 。public AUDIO_FRAME_TYPE type;// 每个声道的采样点数。public int samples; // 每个采样点的字节数。通常为十六位,即两个字节。public int bytesPerSample; // 声道数量(如果是立体声,数据是交叉的)// - 1: 单声道。// - 2: 双声道。public int channels; // 采样率。public int samplesPerSec; // 声音数据缓存区(如果是立体声,数据是交叉存储的)。缓存区数据大小:buffer = samples × channels × bytesPerSample。public byte[] buffer; // 外部音频帧的渲染时间戳。你可以使用该时间戳还原音频帧顺序;在有视频的场景中(包含使用外部视频源的场景),该参数可以用于实现音视频同步。public long renderTimeMs;// 预留参数。public int avsync_type;
};
    public byte[] ConvertClipToBytes(AudioClip audioClip){float[] samples = new float[audioClip.samples];audioClip.GetData(samples, 0);short[] intData = new short[samples.Length];byte[] bytesData = new byte[samples.Length * 2];int rescaleFactor = 32767;for (int i = 0; i < samples.Length; i++){intData[i] = (short)(samples[i] * rescaleFactor);byte[] byteArr = new byte[2];  byteArr = BitConverter.GetBytes(intData[i]);byteArr.CopyTo(bytesData, i * 2);}return bytesData;}

游戏中的语音聊天方案相关推荐

  1. 在游戏中实现语音聊天和语音转化成文字

    今天碰到一个任务就是在游戏中添加语音聊天功能,并且需要将语音转化成文本信息,在聊天界面显示. 当然这种功能专业性太强,我们就只能选择使用第三方SDK来实现了. 国内做的语音识别比较好的就是科大讯飞,不 ...

  2. 如何在游戏中快速集成聊天功能

    总览 本文以「人类跌落梦境」游戏为例,讲解如何在游戏场景下使用 LeanCloud IM SDK. LeanCloud 提供的即时通信 SDK 可以应用在多种场景,比如在线客服,直播间弹幕,工作群聊软 ...

  3. 在微信小游戏中实现语音互动

    之前在unity里尝试用过语音控制,当时的想法是实时控制游戏角色的移动与攻击,这在通过在线api解析语义的方式下体验一般,不过也想到在实时性要求不那么高的互动场景应该可以用起来.这里就在微信小游戏中尝 ...

  4. ios开发 多人语音聊天_在 Unity 多人游戏中实现语音对话

    我们曾经不止一次为大家分享过游戏中的实时音视频,例如怎么实现游戏中的听声辨位.狼人杀游戏中的语音聊天挑战等.基本上,都是从技术原理和 Agora SDK 出发来分享的.这次我们换一个角度.我们将从 U ...

  5. 在 Unity 多人游戏中实现语音对话

    我们曾经不止一次为大家分享过游戏中的实时音视频,例如怎么实现游戏中的听声辨位.狼人杀游戏中的语音聊天挑战等.基本上,都是从技术原理和 Agora SDK 出发来分享的.这次我们换一个角度.我们将从 U ...

  6. unity android 在后台运行_Agora 教程 | 在 Unity 多人游戏中实现语音对话

    作者:Hermes Frangroudis,声网 Agora 布道师. 我们曾经不止一次为大家分享过游戏中的实时音视频,例如怎么实现游戏中的听声辨位.狼人杀游戏中的语音聊天等.基本上,都是从技术原理和 ...

  7. 关于微信聊天中的语音开发

    之前有做过微信开发中的语音聊天的功能,今天觉得写出来. 首先签名这个就不需要多说, wx.config({     debug: '',      appId: '', // 必填,公众号的唯一标识 ...

  8. 如何做好游戏内实时语音体验

    游戏内语音沟通需求 早在2015年,艾媒咨询即有移动游戏社交相关数据统计:近40%的玩家因为社交因素选择一款游戏:15.6%的玩家因为一款游戏社交性差而选择离开.因此,如何提高游戏的社交属性已成为各大 ...

  9. 如何做好游戏内实时语音体验 1

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~. 作者:张晓愚,腾讯云游戏行业资深架构师 由腾讯游戏云发表在云+社区 游戏内语音沟通需求 早在2015年,艾媒咨询即有移动游戏社交相关数据统计: ...

最新文章

  1. 搞定研发知识管理,你的企业就能跑快一步
  2. 正文分页(中英文截字)问题
  3. 掌握计算机底层原理,可以让工作事半功倍吗?
  4. Linux笔记常规部分总结(待续)
  5. Dynamic Rankings(整体二分)
  6. 2021全网影视APP搭建教程全套完整版
  7. 利用集成支持向量机模型评估信贷风险
  8. what is a rx ring/tx ring in router?
  9. xlsx表格用计算机公式算,excel表格数据求和与计算器不一致-excel表格用公式计算出来的数值跟计算器计算出来的......
  10. 15--jQuery插件大全-- 使用jsoup爬取酷我音乐和微博热搜数据
  11. 不会“思维”只会“批判”,谨防网络舆论“怨妇化”
  12. C语言【微项目01】—电话号码管理系统(文件操作实现)【2021-06-29】
  13. “我才是腾讯的第一任董事长”
  14. 画中画功能,制作多种效果,看你喜欢哪种
  15. [附源码]java毕业设计石林县石漠化信息查询分析系统
  16. (十一)在线编辑模块(FreeTextBox插入图片,内容保存到数据库)
  17. 我喜欢的一首诗_再别康桥
  18. PS打开PSD文档服务器未响应,优化你的 PSD 文件防止 Photoshop 崩溃卡死 - 文章教程...
  19. css 科技 边框_CSS内嵌边框
  20. CAD建筑软件教程之倒墙角

热门文章

  1. Electric Fences_usaco3.4_皮克定理
  2. css readonly和disabled的区别
  3. IP地址更改小工具(bat命令)
  4. 滤波电容为什么要靠近放置,去耦半径是什么?滤波电容如何打孔?(转)
  5. c语言练习:输入一个字符,如果是数字字符就输出,如果不是则输出“不是数字字符”。
  6. 如何看待996现象,996工作模式是种什么样的体验?
  7. Win10 下使用Telnet命令,打开telnet功能
  8. 【Linux】文件与路径
  9. 创新数据库技术 成就IOD愿景携DB2 25载创新 IBM推新“信息议程”
  10. 一分钟教你如何使用edge浏览器玩4399小游戏