【玩转腾讯云】游戏多媒体引擎的体验与开发(二)
通过游戏多媒体引擎的sdk做一个属于自己的实时语音转文字.
如何启用?
在腾讯云中搜索"游戏多媒体引擎",第一个,打开之后会加入到控制台,
我们这次直接使用sdk,不再去看demo,直接下载他的SDK来用.
所以我们直接去下载这个sdk,导入到unity中来
注意,这里是sdk下载,不是demo了.下载好了之后还需要解压一下,新建一个unity工程 ,直接将sdk放到Asset文件夹下.
我们再搭建一个属于自己的UI界面,注意看下图,如果不会搭建的话,建议unity入一下门.
然后,新建一个用于写功能的脚本,这个脚本用来登录用户,按下按钮后可以上传声音片段再把识别好后的文字显示在界面上.好,我们还需要新建一个controller物体用来挂载该脚本:层级与格式如下图:
打开脚本,首先第一步要初始化SDK.代码如下:
int ret = ITMGContext.GetInstance().Init(sdkAppId, openID);
//通过返回值判断是否初始化成功
if (ret != QAVError.OK)
{
Debug.Log("SDK初始化失败:"+ret);
return;
}
else
{
Debug.Log ("初始化成功!");
}
这个写在脚本初始化的时候,也就是说你可以写在Awake中也可以写在Start中,只要可以初始化就可以.我们还需要声明一下Appid和OpenID,我们直接声明为Public,然后直接赋值.
public string sdkAppid;
public string openID;
public string AuthKey;
然后在面板中直接赋值:
做到这里,SDK初始化就完成了,这就表示,我们可以开发实际的功能了,接入腾讯云的SDK自己做的事情就这么一点儿.学习起来的成本还是比较少的.建议大家可以看看这个.
然后我们测试运行一下,发现实例化已经成功:
然后我们还要把demo里面的一个名为:EnginePollHelper.cs放到项目中来.因为使用这个脚本之后,许多功能也不用我们自己写,又省了许多事.
还需要新建一个userConfig.cs脚本,这个脚本的作用就是用来记录一些登录相关信息的.那么这个userConfig不需要挂载,只是一个记录的类,所以不用继承自Monobehaviour.
class UserConfig
{
public static string GetExperientialAppID()
{
return GetAppID();
}
public static string GetExperientialauthkey()
{
return GetAuthKey();
}
public static bool GetTestEnv() {
return PlayerPrefs.GetInt("TestEnv", 0) != 0;
}
public static void SetTestEnv(bool test) {
PlayerPrefs.SetInt("TestEnv", test ? 1 : 0);
}
public static string GetAppID() {
return PlayerPrefs.GetString("AppID", "你自己控制台上的appid");
}
public static string GetAuthKey()
{
return PlayerPrefs.GetString("AuthKey", "你自己控制台上的密钥");
}
public static void SetAuthKey(string AuthKey)
{
PlayerPrefs.SetString("AuthKey", AuthKey);
}
public static void SetAppID(string appID) {
PlayerPrefs.SetString("AppID", appID);
}
public static string GetUserID() {
int randomUId = UnityEngine.Random.Range(12345, 22345);
return PlayerPrefs.GetString("UserID", randomUId.ToString() );
}
public static void SetUserID(string userID) {
PlayerPrefs.SetString("UserID", userID);
}
public static string GetRoomID() {
return PlayerPrefs.GetString("strRoomID", "banana");
}
public static void SetRoomID(string roomID) {
PlayerPrefs.SetString("strRoomID", roomID);
}
public static ITMGRoomType GetRoomType() {
return (ITMGRoomType)PlayerPrefs.GetInt("RoomType", 1);
}
public static void SetRoomType(ITMGRoomType roomtype) {
PlayerPrefs.SetInt("RoomType", (int)roomtype);
}
public static byte[] GetAuthBuffer(string sdkAppID, string userID, string roomID,string authKey)
{
string key = "";
key = authKey;
return QAVAuthBuffer.GenAuthBuffer(int.Parse(sdkAppID), roomID, userID, key);
}
}
放进来之后,我们还需要在这些脚本中引入一个命名空间:"TencentMobileGaming".
回过头来test脚本,里面还需要在star中写上:
UserConfig.SetAppID(sdkAppid );
UserConfig.SetUserID(openID);
UserConfig.SetAuthKey(AuthKey);
byte[] authBuffer = UserConfig.GetAuthBuffer(UserConfig.GetAppID(), UserConfig.GetUserID(), null,UserConfig.GetAuthKey());
这就表示,没发送一条数据到腾讯云了,就会带上这些信息,就是服务器做个校验,可以这么简单的理解一下.
然后最重要的一句代码:
ITMGContext.GetInstance ().GetPttCtrl ().ApplyPTTAuthbuffer(authBuffer);
还有一句需要检测客户端的麦克风是否在启用状态,同样写在start方法中
int retCode = (int)ITMGContext.GetInstance ().CheckMicPermission ();
Debug.Log (string.Format ("Check permission Code is {0}",retCode));
做完这些,我们尝试运行一下:
这就表示我们代码运行正常,现在来写一些按下按钮开始录制和停止录制的功能.
我们先写声明两个按钮与它的功能:
public Button btn_speak;
public Button btn_stop;
public void btn_SpeakClick ()
{
btn_speak.GetCompontInChildren<Text>.text= "录制中...";
}
public void btn_StopClick ()
{
btn_stop.GetCompontInChildren<Text>.text = "开始录音";
}
然后在面板中为按钮赋值,并且把方法对于的注册到按钮的点击事件中
上面的一句话是很基础的东西,如果看不明白建议unity入个门.
好的,接下来就要在这个按钮中写具体的方法了.首先是开始录音,因为这个是一边说话一边录音,所以,参照demo中的写法,我们这里设置应该是"流式",语言是中国大陆普通话. 暂存的地址也要设置,所以代码中还需要这样写:
string speechLanguage = "cmn-Hans-CN";//这个就代表普通话 (中国大陆)
string recordPath = Application.persistentDataPath + string.Format("/{0}.silk", sUid++);
if (ret != 0)
{
OnStreamingRecComplete(-1, "","","");
}
这个是代表流式录音暂时存在的本地地址,
录音不是直接往腾讯云上发送的,首先是存在本地,然后通过内存,发往网络.
然后还要写下OnStreamingRecComplete的方法:
void OnStreamingRecComplete(int code, string fileid, string filePath, string result){
if (code == 0)
{
field.text = result;
Debug.Log("录制完成");
}
else if(code == -1)
{
Debug.Log("录制失败:流式正在录制中" );
}
else
{
if (code == 4103)
{
Debug.Log("录制时长太短");
}
else if (code == 32775)
{
Debug.Log(" 上传和翻译失败但是录音成功");
field.text = filePath;
}
else if (code == 32777)
{
Debug.Log(" 翻译失败但是录音和上传成功");
field.text = fileid;
}
else
{
Debug.Log("录制失败:" + Convert.ToString(code));
}
}
}
这表示流式的语音录制每一个阶段会有一段服务器的判断返回,如果流式数据没有问题是会返回具体识别到的文字.
然后再把停止录制的按钮功能补全.
ITMGContext.GetInstance().GetPttCtrl().StopRecording();
那么这样,看起来功能已经写完了,但是还没有.
还需要写上2个委托方法.
ITMGContext.GetInstance().GetPttCtrl().OnStreamingSpeechComplete += new QAVStreamingRecognitionCallback (OnStreamingRecComplete);
ITMGContext.GetInstance().GetPttCtrl().OnStreamingSpeechisRunning += new QAVStreamingRecognitionCallback (OnStreamingRecisRunning);
将委托方法写全
(int code, string fileid, string filePath, string result){
if (code == 0)
{
field.text = result;
Debug.Log("录制完成");
}
else if(code == -1)
{
Debug.Log("录制失败:流式正在录制中" );
}
else
{
Debug.Log(mStreamBtn, "流式");
if (code == 4103)
{
Debug.Log("录制时长太短");
}
else
{
Debug("录制失败:" + Convert.ToString(code));
}
}
}
void OnStreamingRecisRunning(int code, string fileid, string filePath, string result){
if (code == 0)
{
field.text = result;
}
}
好了,到这里,功能就已经写完了,我们现在可以尝试运行一下,按下开始录音可以看到界面上实时的出现文字: