鸿蒙SDK开发文档

更新时间:

快速开始

准备开发环境

本节介绍如何创建项目,将阿里云 智算团队的语音测评 HarmonyOS SDK 集成到你的项目中,并添加相应的设备权限。

1. 创建 HarmonyOS 项目

参考以下步骤创建一个 HarmonyOS 项目。

  1. 打开 DevEco Studio,点击 Create Project

  2. Choose Your Ability Template 界面,选择 Application > Empty Ability,然后点击 Next

  3. 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

  4. 点击 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 ,例如:HelloWorldentry 模块的 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文件配置上面的原因说明

image.png

{
  "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.AudioCapturerc层的engine对象为undefined

3.1.12 public deleteSafe()

方法说明:先调用audio.AudioCapturerstop方法,再调用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 configstart 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,或检查获取warrantIduserId是否与评测的一致

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.txtSDK底层评测日志

路径:/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);