文档导航 Harmony
本页目录

游密实时语音Talk SDK for HarmonyOS 使用指南

Talk SDK简介

1.功能目标

开发者在成功接入Talk SDK简介后,无需部署任何服务器即可拥有实时语音讲话能力。

2.SDK目录讲解

  • 库

    @youme/voice_engine 包含了必须的接口和so库,请导入HarmonyOS工程。

3.关键类及描述

  • YouMeRtcAPI

    引擎服务类,单例模式。该类提供SDK操作的相关方法,例如:初始化,加入房间,参数设置等。

  • YouMeRtcUserRole

    用户通话角色。

  • YouMeRtcEvent

    SDK事件类型

  • YouMeRtcErrorCode

    错误码

  • YouMeRtcServerRegion

    SDK语音服务地域。

Talk SDK操作指引

1.申请使用游密Talk SDK

  • 首先请与游密商务联系,提供公司名称、游戏的名称、联系人电话、邮箱、 QQ等以申请IM引擎的使用权限。审批通过后会得到有效的AppKey和AppSecret,这些信息属于私密信息,请妥善保管。

2.配置依赖项

两种方法导入HAR包:

1. 手动导入

下载youme_voice_engine_3.0.15.har包,放到⼯程libs中。在⼯程中配置引⽤:

JSON
{
"dependencies": {
"@youme/voice_engine":"file:./libs/youme_voice_engine_3.0.15.har"
}
}
2. ohpm导入

在⼯程中配置:

JSON
{
"dependencies": {
"@youme/voice_engine":"3.0.15"
}
}

运⾏命令:

TEXT
ohpm install @youme/voice_engine

3.权限配置

在模块的 module.json5 中 requestPermissions添加网络和麦克风权限,配置如下:

JSON
{
  "requestPermissions": [
    { "name": "ohos.permission.INTERNET" },
    {
      "name": "ohos.permission.MICROPHONE",
      "reason": "$string:mic_reason",
      "usedScene": { "abilities": ["FormAbility"], "when": "inuse" }
    }
  ]
}

SDK接入示例

应用中使用ArkTs代码调用SDK ArkTs API

  1. SDK调用示例 - 设置SDK事件回调和成员列表变更回调:
JS
import { YouMeRtcAPI } from '@youme/voice_engine';

let curDate = new Date();
YouMeRtcAPI.Instance().SetEventCallback(
  (event, errCode, channel, param) => {
    const ctx = getContext(this)
    ctx.eventHub.emit("youme_event", event, errCode, channel, param)
  }
);
this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【api】设置事件回调\n`

YouMeRtcAPI.Instance().SetMemberChangeCallback(
  (channel, members, isUpdate) => {
    const ctx = getContext(this)
    ctx.eventHub.emit("youme_members", channel, members, isUpdate)
  }
);
this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【api】设置成员列表回调\n`
  1. SDK调用示例 - 初始化SDK:
JS
import { YouMeRtcAPI } from '@youme/voice_engine';

const promise = new Promise<number>((resolve, reject) => {
  let error = YouMeRtcAPI.Instance().Init(this.appCustom.appKey, this.appCustom.appSecret, this.selectedRegion, "");
	if (error == 0) {
		resolve(error);
	} else {
		reject(new Error("error call failed"));
	}
});

promise
	.then(result => {
		hilog.info(logFlag, logTag, `call init sdk succ:${result} region:${this.selectedRegion}`);
	})
	.catch((e: Error) => {
		hilog.error(logFlag, logTag, `call init sdk err:${e.message} zone:${this.selectedRegion}`);
	});
  1. SDK调用示例 - 监听SDK事件:
JS
import { YouMeRtcErrorCode, YouMeRtcEvent } from '@youme/voice_engine';

eventLister: Function = (event:YouMeRtcEvent, err:YouMeRtcErrorCode, channel:string, param:string) => {
  let curDate = new Date();
  switch (event){
    case YouMeRtcEvent.YOUME_EVENT_LOCAL_MIC_ON:
    case YouMeRtcEvent.YOUME_EVENT_LOCAL_MIC_OFF:
    case YouMeRtcEvent.YOUME_EVENT_LOCAL_SPEAKER_ON:
    case YouMeRtcEvent.YOUME_EVENT_LOCAL_SPEAKER_OFF:
    case YouMeRtcEvent.YOUME_EVENT_SWITCH_OUTPUT:{
      this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【event】${eventStrings[event]} 错误码:${err} 频道:${channel} 参数:${param}\n`
      break;
    }
    case YouMeRtcEvent.YOUME_EVENT_MY_MIC_LEVEL:{
      this.selfVolumeLevel = err
      break;
    }
    case YouMeRtcEvent.YOUME_EVENT_FAREND_VOICE_LEVEL:{
      this.farendVolumeLevel = err
      this.farendUser = param
      break;
    }
    case YouMeRtcEvent.YOUME_EVENT_OTHERS_VOICE_ON:{
      this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【vad】${eventStrings[event]} 用户${param}开始说话\n`
      break;
    }
    case YouMeRtcEvent.YOUME_EVENT_OTHERS_VOICE_OFF:{
      this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【vad】${eventStrings[event]} 用户${param}停止说话\n`
      break;
    }
    case YouMeRtcEvent.YOUME_EVENT_PAUSED: {
      this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【vad】${eventStrings[event]} 通话暂停${err}\n`
      break;
    }
    case YouMeRtcEvent.YOUME_EVENT_RESUMED: {
      this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【vad】${eventStrings[event]} 通话恢复${err}\n`
      break;
    }
    case YouMeRtcEvent.YOUME_EVENT_OTHERS_MIC_ON: {
      this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【event】${eventStrings[event]} 用户${param}麦克风开启\n`
      break;
    }
    case YouMeRtcEvent.YOUME_EVENT_OTHERS_MIC_OFF: {
      this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【event】${eventStrings[event]} 用户${param}麦克风关闭\n`
      break;
    }
    case YouMeRtcEvent.YOUME_EVENT_OTHERS_SPEAKER_ON: {
      this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【event】${eventStrings[event]} 用户${param}扬声器开启\n`
      break;
    }
    case YouMeRtcEvent.YOUME_EVENT_OTHERS_SPEAKER_OFF: {
      this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【event】${eventStrings[event]} 用户${param}扬声器关闭\n`
      break;
    }
    default:{
      break;
    }
  }
}

应用中使用C++代码调用SDK C++ API

  1. 调用SDK C++ API,需要先在Native C++代码的CMakeList.txt中配置依赖的SDK头文件和库文件路径,示例如下:
CMAKE
# the minimum version of CMake.
cmake_minimum_required(VERSION 3.5.0)
project(entry)

set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})

if(DEFINED PACKAGE_FIND_FILE)
    include(${PACKAGE_FIND_FILE})
endif()

include_directories(${NATIVERENDER_ROOT_PATH}
                    ${NATIVERENDER_ROOT_PATH}/include
                    ${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules/@youme/voice_engine/include)
set(YOUME_LIB_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules/@youme/voice_engine/libs)

link_directories(${YOUME_LIB_PATH}/${CMAKE_OHOS_ARCH_ABI})
add_library(entry SHARED napi_init.cpp youme_native.cpp)

target_link_libraries(entry PUBLIC libyoume_voice_engine.so libace_napi.z.so libhilog_ndk.z.so)
  1. 应用C++代码引入SDK头文件即可调用C++ API。
C++
#include "IYouMeVoiceEngine.h"
#include "IYouMeEventCallback.h"
#include "YouMeConstDefine.h"

// 定义SDK回调监听类
class YouMeCallback:
    public IYouMeEventCallback, 
    public
    public IYouMeMemberChangeCallback, 
    public IYouMeAVStatisticNewCallback, 
    public IYouMeChannelMsgCallback, 
    public IYouMePcmCallback, 
    public IYouMeDetectNetworkCallback
{
public:
    void onEvent(const YouMeEvent event, const YouMeErrorCode error, const char * channel, const char * param);
    void onRequestRestAPI(int requestID, const YouMeErrorCode &iErrorCode, const char* strQuery, const char* strResult);
    void onDetectNetWorkCompleteCb(bool bNetworkOK, const char*  strResult);
    void onAVStatisticNew(YouMeAVStatisticType type, const char* userID, int value, const char* param);
    void onMemberChange(const char*  channel, const char* listMemberChange, bool bUpdate);
    void onBroadcast(const YouMeBroadcast bc, const char*  channel, const char*  param1, const char*  param2, const char*  strContent);
    void onPcmDataRemote(int channelNum, int samplingRateHz, int bytesPerSample, void* data, int dataSizeInByte);
    void onPcmDataRecord(int channelNum, int samplingRateHz, int bytesPerSample, void* data, int dataSizeInByte);
    void onPcmDataMix(int channelNum, int samplingRateHz, int bytesPerSample, void* data, int dataSizeInByte);
};

// 设置回调
YouMeCallback* inst = new YouMeCallback();
// 不使用 REST 回调;按功能注册下列回调。
IYouMeVoiceEngine::getInstance()->setMemberChangeCallback(inst);
IYouMeVoiceEngine::getInstance()->setNotifyCallback(inst);
IYouMeVoiceEngine::getInstance()->setDetectNetworkCallback(inst);
IYouMeVoiceEngine::getInstance()->setAVStatisticNewCallback(inst);

// 初始化SDK
YouMeErrorCode ec = IYouMeVoiceEngine::getInstance()->init(inst, appKey, appSecret, (YOUME_RTC_SERVER_REGION)serverRegion, extServerRegion);

回调与通话流程

初始化前使用 SetEventCallback 注册通用事件函数,成员、网络检测和统计使用各自的注册接口。ArkTS 回调回到注册时的 JS 执行环境;C++ 回调遵循原生线程约定。

接入顺序:注册/提供回调对象 → 初始化 → 等待初始化成功 → 加入频道 → 等待进房成功 → 设置麦克风和扬声器 → 请求离房并等待完成 → 反初始化。异步接口返回成功表示请求已受理,最终结果按回调处理;同步查询按实际返回类型读取。

各接口的语法、功能、参数、返回值和异步回调见 API 手册。