鸿蒙SDK开发文档
快速开始
准备开发环境
本节介绍如何创建项目,将阿里云 智算团队的语音测评 HarmonyOS SDK 集成到你的项目中,并添加相应的设备权限。
1. 创建 HarmonyOS 项目
参考以下步骤创建一个 HarmonyOS 项目。
打开 DevEco Studio,点击 Create Project。
在 Choose Your Ability Template 界面,选择 Application > Empty Ability,然后点击 Next。
在 Configure Your Project 界面,依次填入以下内容:
Project name:你的 HarmonyOS 项目名称,如 HelloWorld。
Bundle name:你的项目包的名称,如 com.hyphenate.helloworld。
Save location:项目的存储路径。
Compatible SDK:项目的支持的最低 API 等级,选择
5.0.0(12)
及以上。Module name:module的名称,默认为
entry
。
点击 Finish。根据屏幕提示,安装所需插件。
上述步骤使用 DevEco Studio NEXT Developer Beta1(5.0.3.403) 示例。
2. 集成 SDK
打开 SDK 下载 【链接】,得到 har
形式的 SDK 文件。
将 SDK 文件,拷贝到 Harmony
工程,例如放至 HelloWorld
工程下 entry
模块下的 libs
目录。
修改模块目录的 oh-package.json5
文件,在 dependencies
节点增加依赖声明。
{
"name": "entry",
"version": "1.0.0",
"description": "Please describe the basic information.",
"main": "",
"author": "",
"license": "",
"dependencies": {
"singsoundsdk": "file:./src/libs/singsound.har"
}
}
最后单击 File > Sync and Refresh Project 按钮,直到同步完成。
3. 添加项目权限
注意:
ohos.permission.WRITE_MEDIA在最新版的api中已经被废弃了,如果设备已经更新到Next0.0.70以上操作的设备,可直接删除 ohos.permission.WRITE_MEDIA 相关的配置和代码
在模块的 module.json5
,例如:HelloWorld
中 entry
模块的 module.json5
中,配置示例如下:
{
module: {
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
},
{
"name": "ohos.permission.GET_NETWORK_INFO"
},
{
"name": "ohos.permission.MICROPHONE",
"reason": "$string:reason_micphone",
"usedScene": {
"abilities": [
"FormAbility"
],
"when": "inuse"
}
}
],
},
}
在 main -> resources -> base -> element -> string.json
模文件配置上面的原因说明
{
"string": [
{
"name": "module_desc",
"value": "module description"
},
{
"name": "EntryAbility_desc",
"value": "description"
},
{
"name": "EntryAbility_label",
"value": "label"
},
{
"name": "reason_micphone",
"value": "用于获取用户录音进行口语评测"
}
]
}
实现
本节介绍如何快速进行评测。
1. SDK 初始化
import { SingSoundEngine } from 'singsoundsdk';
// 初始化
const manager = SingSoundEngine.getInstance();
// 结果回调
const resultListener = new EntryResultListener();
manager.setResultListener(resultListener)
// 传入 appkey
const config = manager.buildInitJson('', '');
// 如果对config有自定义的内容可先对config进行更新,再调用
manager.setInitConfig(config)
manager.createEngine(CoreProvideTypeEnum.CLOUD);
buildInitJson返回的initConfig 完整示例
const cfgProf : SSoundConfigInterface_PROF = {
"enable": 1,
"output": `${dirPath}/crash.txt`
};
const cloud : SSoundConfigInterface_PROF_CLOUND = {
"enable": 1,
"server": "wss://api.cloud.ssapi.cn",
"connectTimeout": 20,
"serverTimeout": 60,
"enableAsync": 0
};
// 最终的initConfig, appKey请更换为自己的
const initConfig: SSoundConfigInterface = {
"appKey": "",
"secretKey": "",
"logEnable": 1,
"logLevel": 4,
"prof": cfgProf,
"cloud": cloud
}
2、开始测评
2.1 根据网络请求 获取 WarrantId
// 正式环境AUTH, 需要更换为客户的url(由客户的服务端同学提供)
const authUrl = "";
// 测试环境AUTH
// const authUrl = "";
const userId = "guest";
// 可根据自己的网络框架修改, post请求
const warrantResponse = await InnerApiUtils.requestWarrantId(authUrl, userId);
2.2 配置 start config
const manager = SingSoundEngine.getInstance();
// 调用开始测评的方法
const start_sent_cfg_request : SSoundStartConfigInterface_REQUEST = {
"coreType": "en.sent.score",
"refText": "I don't play with you, because you(c:1) are a bad(c:1) boy(t:0).",
"rank": 100,
"symbol": 1,
"feedback": 0,
"attachAudioUrl": 1
};
const start_cfg = manager.buildStartJson(warrantResponse.data.warrant_id, start_sent_cfg_request , 'guest');
// 可根据自己需求改变start config
manager.setStartConfig(start_cfg);
await manager.start();
start config 类型是SSoundStartConfigInterface,buildStartJson返回完整的配置示例
const start_cfg_app : SSoundStartConfigInterface_APP = {
// userId为获取WarrantId接口的参数,并非固定的guest
"userId": "guest",
"deviceId": '',
"warrantId": warrant_id
};
const start_cfg_audio : SSoundStartConfigInterface_AUDIO = {
"saveAudio": 0,
"audioType": "wav",
"sampleRate": 16000,
"sampleBytes": 2,
"channel": 1
};
const start_sent_cfg_request : SSoundStartConfigInterface_REQUEST = {
"coreType": "en.sent.score",
"refText": "I don't play with you, because you(c:1) are a bad(c:1) boy(t:0).",
"rank": 100,
"symbol": 1,
"feedback": 0,
"attachAudioUrl": 1
};
// 最终的start config
const start_cfg: SSoundStartConfigInterface = {
"coreProvideType":"cloud",
"soundIntensityEnable": 0,
// 是否需要重试
"enableRetry": 0,
"enableContonative":0,
"app": start_cfg_app,
"audio": start_cfg_audio,
"request": start_sent_cfg_request
};
2.3 调用 start代码, start 和 startWithPCM二者选其一
// 录音类型
manager.start();
// 调用本地音频文件 -- 需要是沙盒路径下的目录
manager.startWithPCM(filePath);
3、结束测评
startWithPCM方法不需要手动调用 stop方法,会自动回调结果。
const singEngine = SingSoundEngine.getInstance();
singEngine.stop();
4、释放SDK
const singEngine = SingSoundEngine.getInstance();
singEngine.deleteSafe();
SDK功能使用
1、在线评测
在线评测与快速开始逻辑一致
2、离线评测
离线资源包更新:
离线资源包名请保持 resources.zip ,暂时不支持修改
demo中默认包含的是中英文离线包,如果单纯选择中文或者是英文,请使用对应的单独资源
如果是纯中文,请将/sdk & 文档/离线包资源/中文离线资源/resources.zip 文件 复制进 /src/main/resources/rawfile/
如果是纯英文,请将/sdk & 文档/离线包资源/英文离线资源/resources.zip 文件 复制进 /src/main/resources/rawfile/
1. SDK 初始化
1.1 解压文件,获取离线的config
const manager = SingSoundEngine.getInstance();
// 耗时操作,应用启动需要执行初始化解压安装
let cfgNative = manager.buildNativeCfg();
if(!cfgNative){ //解压安装没完成
await manager.nativeResInstall(context);
}
cfgNative = manager.buildNativeCfg();
建议在应用启动的时候就可以解压文件,以避免离线评测的时候需要等待文件解压,例如:
// 首页启动
async aboutToAppear(): Promise<void> {
await SingSoundEngine.getInstance().nativeResInstall(context);
}
1.2 根据业务逻辑配置离线config,创建engine
cfgNative.shareType = "2";
// https://trial.auth.ssapi.cn/offline-sdk 是日常授权地址,线上可不设置
cfgNative.authenServer = "http://trial.auth.ssapi.cn/offline-sdk"
const cfgProf : SSoundConfigInterface_PROF = {
"enable": 1,
"output": `${dirPath}/native_crash.txt`
};
// 设置ak、sk
const appKey = "${sample_app_key}"; // 官网购买语音评测后会生成相关ak
const sk = "${sample_secret_key}"; // 官网购买语音评测后会生成相关sk
const new_cfg: SSoundConfigInterface = {
"appKey": appKey,
"secretKey": sk,
"logEnable": 1,
// 开发调试的时候设置为4,运行时候可改为3
"logLevel": 4,
"prof": cfgProf,
"native": cfgNative
};
manager.setInitConfig(new_cfg);
manager.createEngine(CoreProvideTypeEnum.NATIVE);
// 业务方实现的监听类
const resultListener = new EntryResultListener();
manager.setResultListener(resultListener)
2、开始测评
2.1 配置 start config
const start_cfg_app : SSoundStartConfigInterface_APP = {
"userId": "guest",
};
const start_cfg_audio : SSoundStartConfigInterface_AUDIO = {
"saveAudio": 0,
"audioType": AudioTypeForEvaEnum.WAV,
"sampleRate": 16000,
"sampleBytes": 2,
"channel": 1
};
const start_sent_cfg_request : SSoundStartConfigInterface_REQUEST = {
"coreType": "en.sent.score",
"refText": "I don't play with you, because you(c:1) are a bad(c:1) boy(t:0).",
"rank": 100,
"symbol": 1,
"feedback": 0,
"attachAudioUrl": 1
};
const start_cfg: SSoundStartConfigInterface = {
"coreProvideType":CoreProvideTypeEnum.NATIVE,
"soundIntensityEnable": 0,
"enableRetry":1,
"enableContonative":0,
"app": start_cfg_app,
"audio": start_cfg_audio,
"request": start_sent_cfg_request
};
manager.setStartConfig(start_cfg);
2.3 调用 start代码, start 和 startWithPCM二者选其一
// 录音类型
manager.start();
// 调用本地音频文件 -- 需要是沙盒路径下的目录
manager.startWithPCM(filePath);
3、结束测评
startWithPCM方法不需要手动调用 stop方法,会自动回调结果。
const singEngine = SingSoundEngine.getInstance();
singEngine.stop();
4、释放SDK
const singEngine = SingSoundEngine.getInstance();
singEngine.deleteSafe();
3、类的主要方法说明
3.1 SingSoundEngine
SingSoundEngine是主要对外输出评测类。SDK内部全部的回调都通过resultListener属性来实现。
3.1.1 public setResultListener(resultListener: ResultListenerInterface)
SDK的生命周期和异常逻辑回调。
/**
* 录音开始时回调
*/
onBegin(): void;
/**
* requestId 获取
*
* @param volume 音量
*/
onGetRequestId(requestId: string): void;
/**
* 测评结果返回
*
* @param result 测评结果json对象
*/
onResult(result: object): void;
/**
* 结束时回调
*
* @param Code 错误代码,等于0时为正常结束
* @param msg 错误消息
*/
onEnd(code: number, msg: string): void;
/**
* 麦克风音量回调
*
* @param volume 音量
*/
onUpdateVolume(volume: number): void;
/**
* vad 前置端点超时回调
*/
onFrontVadTimeOut(): void;
/**
* vad 后置端点超时回调
*/
onBackVadTimeOut(): void;
/**
* 录音数据回调
*
* @param data 录音数据
*/
onRecordingBuffer(data: Uint8Array): void; // 使用Uint8Array代替byte[]
/**
* 引擎初始化成功
*/
onReady(): void;
3.1.2 public buildInitJson(appKey: string, secretKey: string): SSoundConfigInterface
方法说明:构建引擎初始化参数,主要传入appKey,离线还需要传入secretKey。会返回一个带有默认参数的初始化参数config,类型是SSoundConfigInterface。
3.1.3 public setInitConfig(cfg: SSoundConfigInterface)
方法说明:设置引擎初始化参数,根据buildInitJson返回的参数,再进行业务的需求进行调整,调整逻辑可以根据word文档来改。
3.1.4 public createEngine(type: CoreProvideTypeEnum)
方法说明:c层引擎初始化, 创建引擎对象。如果出错会通过onEnd回调,如果创建成功,会回调onReady方法。
3.1.5 public buildStartJson( warrant_id: string, request?: SSoundStartConfigInterface_REQUEST, userId?: string)
方法说明:构建评测请求的参数,主要传入warrant_id,warrant_id有效期目前是15分钟,主要warrant_id是否过期。
3.1.6 public setStartConfig(cfg: SSoundStartConfigInterface)
方法说明:根据buildStartJson返回的config,可以再根据业务进行调整,再调用setStartConfig,形成最终的评测参数,device id不需要设置。
此方法中会生成Request id,并通过onGetRequestId方法返回
3.1.7 public async start()
方法说明:启动录音评测。启动录音的过程会初始化鸿蒙的audio.AudioCapturer属性来进行录音。
3.1.8 public async startWithPCM(filePath: string)
方法说明:启动本地音频评测。调用结束之后,会自动stop
3.1.9 public async stop()
方法说明:停止评测,通过回调ResultListener.onResult()返回测评结果。如果失败,会回调ResultListener.onEnd(),同时会释放audio.AudioCapturer
3.1.10 public cancel()
方法说明:停止录音,调用c层的cancel方法,
3.1.11 public delete()
方法说明:释放audio.AudioCapturer,并调用c层的ssound_delete方法,置audio.AudioCapturer和c层的engine对象为undefined
3.1.12 public deleteSafe()
方法说明:先调用audio.AudioCapturer的stop方法,再调用delete()方法
3.1.13 public getWavPath(): string
方法说明:只能获取上一次录音的音频文件地址。目前我们全部的音频文件放在沙盒的cacheDir/singSound目录下。
3.1.14 public playbackWithPath(path: string)
方法说明:播放指定沙盒路径的音频文件。我们是采用audio.AudioRenderer进行播放的,audioStreamInfo会保持和录音配置一致,默认是
{
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_16000, // 采样率
channels: audio.AudioChannel.CHANNEL_1, // 通道
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
}
3.1.15 public playback()
方法说明:录音回放, 回放用户的最近一次录音
3.1.16 public stopPlayBack()
目前我们已经将录音的pcm格式改成普通的wav格式,可以直接使用鸿蒙提供的AVPlayer来进行播放了,因此之前做的特殊逻辑的播放器就不需要用了
import { media } from '@kit.MediaKit';
// 创建avPlayer实例对象
let avPlayer: media.AVPlayer = await media.createAVPlayer();
方法说明:手动停止回放。
3.1.17 public nativeResInstall()
方法说明: 解压resources文件,resources文件建议放在主工程的 resources -> rawfile 文件夹里面,可参考demo
3.1.18 public pcm2Wav()
提供了之前老的pcm文件转wav文件函数
直接传入源文件和目标文件,即可。
/**
* pcm文件转wav文件函数
* @param inputFilePath 源文件路径,格式可类似于:/data/storage/el2/base/haps/entry/cache/singSound/e7761ba0976711efa7500b134f30f02b.pcm
* @param outputFilePath 目标文件路径,格式可类似于:/data/storage/el2/base/haps/entry/cache/singSound/9d33ae70978211efaffedf779a0c5267.wav
*/
3.1.19 其余属性设置的方法
可在代码里直接看到其他属性值的方法设置,但是我们更建议直接使用setInitConfig 和 setStartConfig方法来更新属性配置。
3.2 SingSoundEngineInterface
主要是针对评测SDK里面使用到的init config和start config 进行强类型申明,以及对外提供的监听方法申明。
3.2.1 SSoundConfigInterface -- 引擎初始化配置
export interface SSoundConfigInterface {
// 应用编号
"appKey": string;
// 密钥
"secretKey"?: string;
// 本地日志开关 0-关 1-开
"logEnable"?: number;
// 设置 Log 级别
"logLevel"?: number;
"prof"?: SSoundConfigInterface_PROF;
// 在线评测的初始化数据
"cloud"?: SSoundConfigInterface_PROF_CLOUND;
// 离线评测的初始化数据
"native"?: SSoundConfigInterface_NATIVE
// 静音检测
"vad"?: SSoundStartConfigInterface_VAD;
}
3.2.2 SSoundConfigInterface_PROF_CLOUND
export interface SSoundConfigInterface_PROF_CLOUND {
"enable": number;
"server": string;
// 设置引擎连接超时时间
"connectTimeout": number;
// 设置评分超时时间, 默认60s
"serverTimeout": number;
// 是否开启异步测评
"enableAsync": number;
}
3.2.3 SSoundConfigInterface_PROF
export interface SSoundConfigInterface_PROF {
// 设置是否要在IDE上打印日志,默认打开
"enable": number;
// 日志地址
"output": string;
}
3.2.4 SSoundConfigInterface_NATIVE_TYPE
export interface SSoundConfigInterface_NATIVE_TYPE {
// 离线评测题型对应的资源文件路径
"res": string;
}
3.2.5 SSoundConfigInterface_NATIVE
// 离线评测的初始化数据
export interface SSoundConfigInterface_NATIVE {
"shareType"?: string;
// 设置离线授权的地址
"authenServer"?: string;
"cn.sent.score"?: SSoundConfigInterface_NATIVE_TYPE;
"cn.raw.score"?: SSoundConfigInterface_NATIVE_TYPE
"cn.pred.score"?: SSoundConfigInterface_NATIVE_TYPE
"cn.word.score"?: SSoundConfigInterface_NATIVE_TYPE
"cn.pcha.score"?: SSoundConfigInterface_NATIVE_TYPE
"en.pred.score"?: SSoundConfigInterface_NATIVE_TYPE
"en.word.score"?: SSoundConfigInterface_NATIVE_TYPE
"en.pcha.score"?: SSoundConfigInterface_NATIVE_TYPE
"en.sent.score"?: SSoundConfigInterface_NATIVE_TYPE
"en.choc.score"?: SSoundConfigInterface_NATIVE_TYPE
}
3.2.6 SSoundStartConfigInterface -- 启动语音评测相关配置
// 引擎类型(在线CLOUD、 离线NATIVE、混合AUTO)
export enum CoreProvideTypeEnum {
CLOUD = ("cloud"), // 在线
NATIVE = ("native"), // 离线
AUTO = ("auto"), // 混合AUTO
}
// 开始评测的数据
export interface SSoundStartConfigInterface {
// 设置引擎类型
"coreProvideType": CoreProvideTypeEnum;
// 默认为0;如果设置为1,可以时时回调音量信息
"soundIntensityEnable": number;
/**
* 默认为0;
* 如果设置为1,失败后(包括2种失败类型),会重新测评
* 如果设置为2,失败后(包含4种失败类型),会重新测评
* 如果设置为0,失败后,直接返回
*/
"enableRetry": number;
/**
* 1:表示支持在线评测网络异常切换到离线评测
* 0:表示关闭在线转离线功能(默认关闭)
* 注:启用此模式,必须关闭异步评测功能enableAsync
*/
"enableContonative": number;
"app": SSoundStartConfigInterface_APP;
"audio": SSoundStartConfigInterface_AUDIO;
"request": SSoundStartConfigInterface_REQUEST;
}
3.2.7 SSoundStartConfigInterface_VAD
export interface SSoundStartConfigInterface_VAD {
// 前段静音时间
"maxBeginSil"?: number
// 后段静音时间
"rightMargin"?: number
// vad静音开关
"vadEnable": number
// vad资源路径
"res"?: string
}
3.2.8 SSoundStartConfigInterface_AUDIO
export interface SSoundStartConfigInterface_AUDIO {
"saveAudio": number;
// 音频格式
"audioType": AudioTypeForEvaEnum;
// 采样率
"sampleRate": audio.AudioSamplingRate;
// 每采样字节数,支持单字节和双字节
"sampleBytes": number;
// 声道
"channel": audio.AudioChannel;
}
3.2.9 SSoundStartConfigInterface_APP
export interface SSoundStartConfigInterface_APP {
// 业务应用的用户标识,请保证每个用户的userId唯一
"userId": string;
// 应用唯一标识
"deviceId"?: string;
// 认证授权id
"warrantId"?: string;
}
3.2.10 SSoundStartConfigInterface_REQUEST
export interface SSoundStartConfigInterface_REQUEST {
// 评测题型 en.pqan.score表示英文问答题题型
"coreType": string;
/**
* 评分参考文本,仅支持单词
* 注:
* 外部指定发音支持以下两种方式:
* 1、directory(z:d ih - 'r eh k - tr ih) 音标按引擎内部音标规范
* 2、directory(p:dəˈrektəri) 按原始音标指定发音(如果原始音标对应多种标准,处理优先级:IP88 > KK > IP66)
*/
"refText"?: string;
/**
* 评分分制,这个值可以任意设置,最终会根据与100的比例重新计算
*/
"rank"?: number;
/**
* 如果单词前有多个连续标点,只显示第一个标点;如果单词结尾有多个连续标点,只输出靠近结尾单词最近的三个标点;
* 只有设置0或1,默认值为0,不开启此功能
*/
"symbol"?: number;
/**
* 1:表示开启实时反馈功能(实时反馈当前读的音频对应的文本位置信息)
* 0:默认值(不启用此功能)
*/
"feedback"?: number;
/**
* 是否返回云端音频Url,默认:0,开启:1
*/
"attachAudioUrl": number;
/**
* 打分松紧度(分数越高影响越小):
* 1表示严格,
* 2表示宽松,
* 3表示非常严格,
* 4非常宽松,
* 0为默认值(不启用此功能)
*/
"typeThres"?: number;
/**
* 音素检错(只有设置outputPhones为1,此字段才有意义)
* 只有设置0或1,默认值为0,不开启此功能
*/
"phdet"?: number;
/**
* 音节检错,1表示使用此功能,默认为0,不启动
* 只能设置0和1
*/
"syldet"?: number;
/**
* 设置打分精度,只支持0.1、0.5或者1,默认值为1(如果设置的值不是0.1或0.5则按1处理)
*/
"precision"?: number;
// "enableCompareAudio"?: number;
// "std_audio_url"?: string;
/**
* 数组字典,设置选择题的选项
* lm的子字段answer为0的表示错误答案,非0的表示正确答案
* (注:lm字段是小写的LM,不是Im)
* 只有读正确的text字段并且发音正确、完整,overall才会有得分
*/
"lm"?: SSoundStartConfigInterface_REQUEST_LM[];
"key"?: SSoundStartConfigInterface_REQUEST_TEXT[];
"quest_ans"?: string;
"para"?: string;
"points"?: SSoundStartConfigInterface_REQUEST_TEXT[];
}
3.2.11 SSoundStartConfigInterface_REQUEST_TEXT
export interface SSoundStartConfigInterface_REQUEST_TEXT {
"text": string
}
3.2.12 SSoundStartConfigInterface_REQUEST_LM
/**
* 数组字典,设置选择题的选项
* lm的子字段answer为0的表示错误答案,非0的表示正确答案
* (注:lm字段是小写的LM,不是Im)
* 只有读正确的text字段并且发音正确、完整,overall才会有得分
*/
export interface SSoundStartConfigInterface_REQUEST_LM {
"answer"?: number
"text": string
}
3.2.13 ResultListenerInterface接口
主要是对SDK整个生命周期和异常逻辑的回调,建议一定要实现该接口。
3.3 SingSoundEngineEnum
主要是针对上面config强类型的属性值对外开发
4、错误码
errorId | 描述 | 原因 | 给应用层的建议 |
40092 | 传输的音频时长超限 | 服务端对每次请求的录音时长有限制 | 确定录音时长是否在规定范围内 |
41008 | 音频格式不支持 | 传输的音频格式不支持 | 确认音频格式支持的范畴 |
41010 | 音频信息不合法 | 音频信息中的channel不存在或不支持(只支持1) | 音频的channel参数不存在或不支持 |
41016 | sdk信息为空 | connect.param内缺少sdk字段 | 检查connect包是否完整 |
41017 | sdk中缺少字段version | connect.param.sdk内缺少version字段 | 检查connect包是否完整 |
41018 | sdk中缺少字段source | connect.param.sdk内缺少source字段 | 检查connect包是否完整 |
41019 | sdk中缺少字段protocol | connect.param.sdk内缺少protocol字段 | 检查connect包是否完整 |
41030 | 鉴权失败 | warrantId缺失或者warrantId错误 | 检查是否传了warrantId,或检查获取warrantId的userId是否与评测的一致 |
41035 | coretype不支持 | 使用了没开放权限的coretype | 与售前确认coretype是否已开放 |
41036 | 客户并发数超限 | 评测并发量已经达到客户购买的额度 | 与售前确认购买的并发量额度是否够用 |
42003 | 客户端发送请求的顺序出错 | 未按正常流程调用sdk | 查看sdk是否正确使用 |
430005 | appid无效 | 使用了错误的appid | 确认appid是否有效或者appid是否与环境匹配(测试账号需要使用测试环境) |
51000 | 初始化内核出错 | 传文本参数给内核时,内核返回出错 | 确认参数传递格式正确,联系技术支持 |
53000 | 内核进程崩溃 | 由于内核代码问题或sdk传参问题导致内核进程崩溃 | 再确认参数格式正确的情况下,联系技术支持。 |
60000 | 没有配置 appKey | 配置 appKey | |
60001 | 引擎初始化失败 | c层的engine初始化失败 | 多为config配置不生效原因,可以查看 onEnd返回的原因 |
70001 | SDK版本需要升级 | 该版本SDK被禁止使用或者有限支持 | 联系技术支持获取SDK支持 |
70002 | 引擎 stop 失败 | engine 当前可能正在评测 | 根据 onEnd返回的原因和crash.txt的日志,进行修复 |
70003 | 引擎 cancel 失败 | 根据 onEnd返回的原因和crash.txt的日志,进行修复 | |
70004 | 录音 start 失败 | 鸿蒙audio.AudioCapturer start失败 | 根据 onEnd返回的原因进行修复,参考鸿蒙audio.AudioCapturer 的文档 |
70005 | 录音 stop 失败 | 鸿蒙audio.AudioCapturer stop失败 | 根据 onEnd返回的原因进行修复,参考鸿蒙audio.AudioCapturer 的文档 |
70006 | 没有录音权限 | 请开启权限配置 | |
70007 | 录音初始化失败 | audio.AudioCapturer 创建失败 | 根据 onEnd返回的原因进行修复,参考鸿蒙audio.AudioCapturer 的文档 |
70010 | 销毁引擎失败 | c层 engine销毁失败 | 根据 onEnd返回的原因和crash.txt的日志,进行修复 |
70011 | 读取本地音频文件失败 | 多为文件不在沙盒里,SDK无法读取 | 路径传入之前可以先用fs工具判断是否存在, onEnd也会返回的原因 |
70012 | 本次录音还未停止,可提示用户稍后再开始下一次录音 | ||
70017 | warrantId过期 | 更新warrantId | 建议每次调用评测之前先换新warrantId |
70020 | 初始化未设置userid | 配置userid参数 |
5、排查方案
5.1 crash.txt
crash.txt是SDK底层评测日志
路径:/data/app/el2/100/base/com.aliyun.singsound.sssdk4harmony/haps/entry/cache/crash.txt
鸿蒙内部真机设备文件查看参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-device-file-explorer-V5#section1943652015712
5.2 录音数据
录音的原始数据保存位置:/data/app/el2/100/base/com.aliyun.singsound.sssdk4harmony/haps/entry/cache/singSound
6、 C层对外接口 -- 针对需要自定义完整的SDK的团队
SingSoundHm的类是可以直接调用NDK的方法,这个是针对想完全从头自定义SDK的团队同学开放的接口。其他调用arkts层接口团队的同学不要单独某个接口直接调用C层,可能会出现异常bug。
6.1 代码说明
/**
* 创建引擎
* @param cfg 配置信息
* @return 0:失败
* 引擎对象值:成功
*/
export function ssound_new(cfg: string);
/**
* 启动引擎
* @param engine 引擎对象值
* @param param 参数配置字符串
* @param id 存储引擎生成的id字符
* @param callback ssound_callback对象
* @param androidContext Context对象
* @return 返回值
*/
export function ssound_start(engin: object, cfg: string , id: string, callback: (usrdata: string, id: string, type: number, message: string, size: number)=> number, usrdata: string);
/**
* 移除引擎
* @param engine 引擎对象值
* @return 返回值
*/
export function ssound_delete(engin: object);
/**
* 向引擎缓冲区填入语音数据
* @param engine 引擎对象值
* @param data 数据
* @param size 数据大小
* @return 返回值
*/
export function ssound_feed(engin: object, data: ArrayBuffer, size: number);
/**
* 停止引擎
* @param engine 引擎对象值
* @return 返回值
*/
export function ssound_stop(engin: object);
/**
* 取消引擎, 用于出现异常情况下,用户可以取消引擎
* @param engine 引擎对象值
* @return 返回值
*/
export function ssound_cancel(engin: object);
/**
* 获取设备ID
* @param device_id 存储id的缓冲byte[]空间
* @param androidContext Context对象
* @return 返回值
*/
export function ssound_get_device_id(device_id: string);
export function ssound_opt(engin: object, opt: number, data: string, size: number);
export function ssound_get_result(engin: object);
export function ssound_log(engin: object, log: string);