Unity3D整合騰訊語音GVoice SDK
友情提示:最近發現騰訊GVoice有另一個官網,叫做騰訊遊戲服務,經過對比發現這個網站才是最新的,下面我介紹的那個估計是已經廢棄的,但不知道為啥老的網站沒有直接連結到新網址而是仍然保留了。不過新官網的文件更加詳細,SDK也有所更新,所以建議去新官網下載SDK和Demo,接入流程基本沒有啥大變化。
簡述
我們專案中用到了實時語音功能,在最初語音 SDK 技術選型的時候測試過融雲、聲網和騰訊的 GVoice 。融雲和聲網我都在我們專案中使用過,但是效果都不如王者榮耀遊戲中的實時語音效果,這兩天好好研究了一下騰訊的 GVoice,終於成功整合。由於騰訊 GVoice 官網的接入流程並不是很詳細,如果只懂 Unity3D 不懂 Android 基礎知識的朋友,可能接入過程不會一帆風順。我雖瞭解一點點 Android 基礎,但仍趟過了好幾個坑,下面我就分享一下我在 Android 平臺接入 GVoice 的過程。
資源準備
進入騰訊GVoice官網下載 GVoice SDK 和 Unity3D Demo。如下圖:
接入流程
1. 匯入SDK
先建立一個空的 Unity 專案 GVoiceDemo,按照官網的接入流程,我們直接將下載的SDK壓縮包解壓後將其中的 Plugins 和 Scripts 兩個資料夾都拷貝到 Unity 專案中。
2. 建立 Jar 包
將Unity專案匯出成安卓專案,匯出路徑選擇某個指定的資料夾,我這裡在桌面新建了一個叫 unity_gvoicedemo 的資料夾,將專案匯出到該資料夾中,操作如下圖:
匯出成功後會生成 GCloudVoice 和 GVoiceDemo 兩個資料夾,用 eclipse 將這兩個專案一起匯入,如下圖
匯入成功後,在 UnityPlayerActivity 專案下新建一個 MainActivity 類,繼承自 UnityPlayerActivity,詳細程式碼如下:
package com.shehweiwei.gvoicedemo;
import android.os.Bundle;
import com.tencent.gcloud.voice.GCloudVoiceEngine;
// 注意:下面這句程式碼必須有,如果沒有可能會導致閃退
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity
{
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
GCloudVoiceEngine.getInstance().init(getApplicationContext(), this);
}
}
注意:程式碼中一定要引入com.unity3d.player.UnityPlayerActivity
這個包,如果沒有引入則進入應用就閃退,這裡是個大坑,我好不容易才爬出來。
然後,選中 MainActivity.java 檔案,右鍵選擇 Export -> Java -> JAR file, 然後點選 Next 按鈕, 接下來操作如下圖:
最後,生成一個 GVoiceDemo.jar 檔案。
3. 匯入其他檔案
將下載的 unity_demo.zip 壓縮包解壓後將其中的 unity_demo\Assets\Plugins\Android
目錄下的 AndroidManifest.xml 和 android-support-v4.jar 兩個檔案拷貝到專案的 Plugins\Android
目錄下。注意還有個GCloudVoiceDemo.jar 檔案我們沒有拷貝,這裡我們使用上一步建立的 GVoiceDemo.jar 檔案來替代。注意 jar 包中的包名必須與 AndroidManifest.xml 檔案和 Unity 編輯器中PlayerSettings的 Bundle Identifier 包名保持一致。所以,要把 AndroidManifest.xml 檔案中的 package="com.example.gcloudu3ddemo"
這一句程式碼修改成 package="com.shehweiwei.gvoicedemo"
。
注意:AndroidManifest.xml 檔案中的入口 Activity 的名字必須和建立的 Jar 包中的新建的 Activity 名字保持一致。這裡的入口 Activity 叫 MainActivity,所以 AndroidManifest.xml 檔案中的程式碼為android:name=".MainActivity"
,當然也可以寫成 android:name="com.example.gcloudu3ddemo.MainActivity"
4. 構建Unity場景
這裡我用uGUI搭建了一個簡單的介面,有六個按鈕分別呼叫 GVoice SDK 的六個 API ,然後一個 Text 用來顯示回撥結果。介面效果如下圖:
然後新建一個 GVoiceDemo 的 C# 指令碼,指令碼程式碼如下:
using UnityEngine;
using gcloud_voice;
using UnityEngine.UI;
using System;
public class GVoiceDemo : MonoBehaviour
{
// 用來顯示呼叫API返回的結果
public Text result;
private IGCloudVoice m_voiceengine = null;
// TODO: 這裡的appId和appKey使用的是官方提供的測試值,正式專案中可使用申請的值
private const string appId = "932849489";
private const string appKey = "d94749efe9fce61333121de84123ef9b";
// TODO: 這裡使用的是測試賬號,所以房間名使用預設的100,正式專案中可根據實際情況賦值
private string roomName = "100";
void Start()
{
if (m_voiceengine == null)
{
m_voiceengine = GCloudVoice.GetEngine();
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
string strTime = System.Convert.ToInt64(ts.TotalSeconds).ToString();
// TODO: 這裡用時間模擬了一個openId,在正式專案中應該把這裡的strTime換成使用者唯一ID
m_voiceengine.SetAppInfo(appId, appKey, strTime);
m_voiceengine.Init();
// 註冊SDK常用回撥監聽
m_voiceengine.OnJoinRoomComplete += OnJoinRoom;
m_voiceengine.OnQuitRoomComplete += OnExitRoom;
m_voiceengine.OnMemberVoice += OnMemberVoice;
}
}
void Update()
{
if (m_voiceengine != null)
{
// 不斷檢測GVoice引擎回撥
m_voiceengine.Poll();
}
}
void OnApplicationPause(bool pauseStatus)
{
if (m_voiceengine == null)
{
return;
}
// 應用暫停時GVoice引擎也暫停,應用重新開始時引擎繼續
if (pauseStatus)
{
m_voiceengine.Pause();
}
else
{
m_voiceengine.Resume();
}
}
/// <summary>
/// 加入房間,BtnJoin按鈕點選呼叫
/// </summary>
public void JoinRoom()
{
m_voiceengine.SetMode(GCloudVoiceMode.RealTime);
int ret = m_voiceengine.JoinTeamRoom(roomName, 15000);
result.text += "\nJoinRoom:" + ret;
}
/// <summary>
/// 退出房間,BtnExit按鈕點選呼叫
/// </summary>
public void ExitRoom()
{
int ret = m_voiceengine.QuitRoom(roomName, 6000);
result.text += "\nExitRoom:" + ret;
}
/// <summary>
/// 開啟麥克風,BtnOpenMic按鈕點選呼叫
/// </summary>
public void OpenMic()
{
int ret = m_voiceengine.OpenMic();
result.text += "\nOpenMic:" + ret;
}
/// <summary>
/// 關閉麥克風,BtnCloseMic按鈕點選呼叫
/// </summary>
public void CloseMic()
{
int ret = m_voiceengine.CloseMic();
result.text += "\nCloseMic:" + ret;
}
/// <summary>
/// 開啟揚聲器,BtnOpenSpeaker按鈕點選呼叫
/// </summary>
public void OpenSpeaker()
{
int ret = m_voiceengine.OpenSpeaker();
result.text += "\nOpenSpeaker:" + ret;
}
/// <summary>
/// 關閉揚聲器,BtnCloseSpeaker按鈕點選呼叫
/// </summary>
public void CloseSpeaker()
{
int ret = m_voiceengine.CloseSpeaker();
result.text += "\nCloseSpeaker:" + ret;
}
/// <summary>
/// 加入房間回撥
/// </summary>
/// <param name="code"></param>
/// <param name="roomName"></param>
/// <param name="memberID"></param>
private void OnJoinRoom(IGCloudVoice.GCloudVoiceCompleteCode code, string roomName, int memberID)
{
result.text += string.Format("\nOnJoinRoom ---> code: {0}, roomName: {1}, memberID: {2}", code, roomName, memberID);
}
/// <summary>
/// 退出房間回撥
/// </summary>
/// <param name="code"></param>
/// <param name="roomName"></param>
/// <param name="memberID"></param>
private void OnExitRoom(IGCloudVoice.GCloudVoiceCompleteCode code, string roomName, int memberID)
{
result.text += string.Format("\nOnExitRoom ---> code: {0}, roomName: {1}, memberID: {2}", code, roomName, memberID);
m_voiceengine.OnJoinRoomComplete -= OnJoinRoom;
m_voiceengine.OnQuitRoomComplete -= OnExitRoom;
m_voiceengine.OnMemberVoice -= OnMemberVoice;
}
/// <summary>
/// 有成員說話時回撥
/// </summary>
/// <param name="members"></param>
/// <param name="count"></param>
private void OnMemberVoice(int[] members, int count)
{
result.text += string.Format("\nOnMemberVoice ---> count: {0}, roomName: {1}, memberID: {2}", count);
}
}
將 GVoiceDemo 指令碼新增到Canvas物件上,然後將指令碼中對應的方法註冊到對應的按鈕的OnClick事件上,儲存場景,然後執行到手機上,使用兩個手機就可以語音聊天了,效果如下圖:
其他事項
按照上面的流程整合完的專案並不能在PC上執行,如果要在PC上執行不報錯,可以將下載的 unity_demo.zip 檔案解壓後的 unity_demo\Assets\Plugins
目錄下的 X86 和 x86_64 兩個資料夾拷貝到專案的 Plugins 資料夾下,這樣PC上執行就不會報錯。因為我這裡沒有麥克風裝置,不知道在PC上能不能使用語音聊天,有條件的朋友可以試試,有結果了可以反饋給我,先謝過了!
專案原始碼
我把專案的原始碼託管在了Github上了, 有需要的朋友自取。專案連結點這裡
本文作者: Sheh偉偉
本文連結: http://davidsheh.github.io/2017/05/27/Unity3D整合騰訊語音GVoiceSDK/
版權宣告: 本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 3.0 許可協議。轉載請註明出處!
相關文章
- 安裝百度語音識別sdk
- Unity3d Android SDK接入解析(二)Unity3d Android SDK的設計與兩種接入方式Unity3DAndroid
- Unity3D整合到iOS工程Unity3DiOS
- Qt+騰訊IM開發筆記(一):騰訊IM介紹、使用和Qt整合騰訊IM-SDK的工程模板DemoQT筆記
- Laravel 七牛雲 sdk 物件儲存 示例 上傳語音Laravel物件
- 試用聲網Agora語音SDK感受 | 掘金技術徵文Go
- OpenAI Java SDK——chatgpt-java-v1.0.3更新支援GPT-3.5-Turbo,支援語音轉文字,語音翻譯。OpenAIJavaChatGPT
- 騰訊雲H5語音通訊QoE優化H5優化
- SDK音訊測試流程音訊
- 【從 0 開始開發一款直播 APP】10 騰訊雲通訊及SDK整合APP
- Unity3d Android SDK接入解析(一)Unity3d 與 Android之間的互相呼叫Unity3DAndroid
- SMSSDK的Unity3D的兩種整合方式Unity3D
- 從QQ音樂開發,探討如何利用騰訊雲SDK在直播中加入視訊動畫動畫
- 騰訊雲sdk 支援 騰訊雲簡訊 Laravel Notification [最新版]Laravel
- F5-TTS語音克隆漢化整合包1016TTS
- 一、Windows10平臺下Unity3d的語音識別——關鍵字識別WindowsUnity3D
- 騰訊地圖SDK Flutter外掛實現地圖Flutter
- AI音樂,騰訊音樂、網易雲音樂的新版圖?AI
- Cocos平臺整合AGC效能管理(二)—— 效能管理SDK整合GC
- iOS微信支付整合 SDK1 7 5iOS
- SMSSDK的Unity3D的兩種整合方式-AndroidUnity3DAndroid
- Unity3D音樂音效研究-MIDI與波表Unity3D
- 寫了個騰訊雲簡訊的 Go SDKGo
- Django整合騰訊COS物件儲存Django物件
- 使用 Dapr JS SDK 讓 Nest.js 整合 DaprJS
- 如何從零開始整合DTM Android SDKAndroid
- 小程式 SDK 整合到 App 有哪些好處?APP
- iOS整合融雲SDK即時通訊整理iOS
- 玩轉iOS開發:整合 WeChat SDK - 支付篇iOS
- 語音轉文字工具,語音轉文字怎樣轉?
- 如何用Python語音合成,以及文字轉語音~Python
- AI語音巨頭鏖戰語音晶片市場AI晶片
- Cisco認證網路專家語音(CCNP語音)
- 音訊特效SDK,滿足內容生產的音訊處理需求音訊特效
- 語音介面2.0
- 機器學習之語音生成&&音樂生成機器學習
- 語音的關鍵聲學特徵(語音情感特徵提取)特徵
- 樹莓派語音互動--語音輸入識別樹莓派