setting alipay wechat success appmanage dollor user cart order workorder logout left1 left2 app unfree free chart coupon note copy pencil price-tag database cog bin list link plus minus codepen 审核 cross table search user-tie eye github cancel-circle checkmark icon-upload icon-smartphon icon-auth-user icon-arroba-symbol icon-check-pass icon-red-cross icon-pwd-key icon-used icon-expired android appleinc tux windows8 java webAPI mail vip

科大讯飞开放平台

AIKit HarmonyOS SDK 接入指南

SDK Version: 1.0.0-beta1

Updated: 2020.10.15

# 1. 概述

尊敬的开发者朋友,欢迎您选择科大讯飞开放平台。本文档旨在帮助HarmonyOS 应用开发者在程序中快速接入AIKit HarmonyOS SDK。作为开发者,您只需要进行简单配置,就可以在您的应用中使用AIKit提供的各种AI能力。
关于SDK的具体使用方法,请仔细阅读下面的文档。

# 2. 集成说明

# 2.1 术语介绍

  • APPID:应用 ID,请在https://www.ai-tj.cn/中注册成为开发者并创建一款应用,您将获得标识您应用的唯一ID。
  • APIKey:访问云端能力需要提供的参数。
  • APISercet:访问云端能力需要提供的参数。

# 2.2 导入SDK依赖包

  • aikit.har 复制到Module的libs文件夹(没有的话须手动创建), 并将以下代码添加到您Module的build.gradle中:
depedencies {
    implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
}

# 2.3 权限声明

权限 用途
INTERNET 允许程序联网的权限
MICROPHONE 允许应用检测网络连接状态

权限配置请参考HarmonyOS 关于权限的使用指导,代码示例:

"reqPermissions": [
      {
        "name": "harmonyos.permission.INTERNET",
        "reason": "the app need internet"
      },
      {
        "name": "harmonyos.permission.MICROPHONE",
        "reason": "the app need microphone",
        "usedScene": {
          "ability": [
            "ccom.iflytek.aiaa.MainAbility"
          ],
          "when": "always"
        }
      }
    ]

# 2.4 SDK初始化

# 2.4.1 初始化SDK

初始化即创建语音配置对象,只有初始化后才可以使用AIKit的各项服务。初始化代码如下:

// 初始化时 将 appid、apikey 和 apisecret 传入
  SpeechUtility.getInstance().init(getContext(),
                "xxxxx", // appid
                "xxxxx", // apikey
                "xxxxx" // apisecret
                );

# 2.4.2 参数设置

初始化参数说明如下表

参数Key 名称 是否必传
context 鸿蒙系统的 Context Y
APPID 应用id Y
APIKEY API Key Y
APISERCET API密钥 Y

# 2.5 语音听写

语音听写,是基于自然语言处理,将自然语言音频转换为文本输出的技术。

# 2.5.1 音频文件语音识别

使用SpeechUtility.getInstance().voiceRecognize()方法,参考代码如下:

   /**
     * 音频文件转文字 将开发包中的mp3转成文本
     */
    private void audioFiles2String() {
        try {
            // 获取项目中的 测试的音频
            String mp3Path = "resources/rawfile/test.mp3";
            RawFileEntry rawFileEntry = getContext().getResourceManager().getRawFileEntry(mp3Path);
            Resource resource = rawFileEntry.openRawFile();
            // 创建语音听写参数类:IatParam
            IatParam iatParam = new IatParam();
            // 设置音频文件的格式 
            iatParam.setEncoding(IatParam.Encoding.lame);           
            SpeechUtility instance = SpeechUtility.getInstance();
            // 开始语音识别
             instance.voiceRecognize(iatParam, resource, new ResultCallBack<IatResult>() {
                @Override
                public void onResult(IatResult result) {
                  // 获取数据回掉 注意 回调在子线程执行
                  handler.postTask(() -> {
                      String s = CommonResultParser.parseIatResult(result.getData());
                      textField.append(s);
                    });
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

# 2.5.2 录音并识别

使用录音功能需要先在Ability类中动态申请"harmonyos.permission.MICROPHONE"权限,参考代码如下:

if (verifySelfPermission("harmonyos.permission.MICROPHONE") != IBundleManager.PERMISSION_GRANTED) {
    // 应用未被授予权限
    if (canRequestPermission("harmonyos.permission.MICROPHONE")) {
        // 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示)
        requestPermissionsFromUser(new String[]{"harmonyos.permission.MICROPHONE"},
                REQUEST_MICROPHONE);
    } else {
        // 显示应用需要权限的理由,提示用户进入设置授权
    }
} else {
    // 权限已被授予
}

录音识别参考代码如下:

   /**
     * 开始录音
     */
    private void startRecord() {
        // 创建语音听写参数类:IatParam
        IatParam iatParam = new IatParam();
        iatParam.setEncoding(IatParam.Encoding.raw);
        SpeechUtility.getInstance().startRecord(iatParam, new ResultCallBack<IatResult>() {
            @Override
            public void onResult(IatResult result) {
               // 获取数据回掉 注意 回调在子线程执行
                  handler.postTask(() -> {
                      String s = CommonResultParser.parseIatResult(result.getData());
                      textField.append(s);
                    });
            }
        });
    }

    /**
     * 停止录音
     */
    private void stopRecord() {
        SpeechUtility.getInstance().stopRecord();
    }

# 2.5.3 参数设置

语音听写参数类 IatParam 支持设置的参数见下表:

参数名称 数据类型 名称 是否必须 说明
encoding string 音频格式 Y 目前仅支持“ lame” 、“raw ”,mp3文件请使用“ lame”,pcm输入时使用 “raw ”
ptt int 是否开启标点识别 N 0:不开启标点识别, 1:开启标点识别,默认不开启
nunum int 是否把中文数字转换成阿拉伯数字 N 0:关闭, 1:开启 默认关闭
dwa string pgs N 最小长度:0, 最大长度:10
evl int engine vad link N 0:关, 1:开启
proc int 是否使用后处理 N 0:关, 1:开
nbest int 句子级别多候选个数 N 最小值:0, 最大值:5
wbest int 词级别多候选个数 N 最小值:0, 最大值:5
pvinfo int 在 pgs 结果中展示vad信息 N 0:关, 1:开
aqc int aqc N 0:关, 1:开
ltc int 中英文筛选功能 N 最小值:0, 最大值:3
vad_enable bool 使能VAD N true/false
vad_eos int 后端点 N 最小值:0, 最大值:60000,当vad_enable为true时有效
vrto int vad前置端点超时时间 N 最小值:0, 最大值:60000

# 2.5.4 结果解析

JSON字段 英文全称 类型 说明
sn sentence number 第几句
ls last sentence boolean 是否最后一句
bg begin number 保留字段,无需关注
ed end number 保留字段,无需关注
ws words array
cw chinese word array 中文分词
w word string 单字
sc score number 分数
{
    "sn": 1,
    "ls": true,
    "bg": 0,
    "ed": 0,
    "ws": [
        {
            "bg": 0,
            "cw": [
                {
                    "w": "今天",
                    "sc": 0
                }
            ]
        },
        {
            "bg": 0,
            "cw": [
                {
                    "w": "的",
                    "sc": 0
                }
            ]
        },
        {
            "bg": 0,
            "cw": [
                {
                    "w": "天气",
                    "sc": 0
                }
            ]
        },
        {
            "bg": 0,
            "cw": [
                {
                    "w": "怎么样",
                    "sc": 0
                }
            ]
        },
        {
            "bg": 0,
            "cw": [
                {
                    "w": "。",
                    "sc": 0
                }
            ]
        }
    ]
}

# 2.6 语音合成

与语音听写相反,语音合成是将一段文字转换为语音,可根据需要合成出不同音色、语速和语调的声音,让机器像人一样开口说话。文字格式为“utf8”。

# 2.6.1 接口说明

语音合成使用SpeechSynthesizer接口,示例代码如下

   /**
     * 开始合成
     */
    private void startTts() {
       
        String stringSource = "这段话将被合成为语音";
        // 建立个缓存文件保存合成的数据
        File externalCacheDir = getContext().getExternalCacheDir();
        File file = new File(externalCacheDir, "tts_test.mp3");
        if (file.exists()) {
            file.delete();
        }
        SpeechUtility instance = SpeechUtility.getInstance();
        TtsParam ttsParam = new TtsParam();
        instance.voiceSynthesise(ttsParam, stringSource, new ResultCallBack<TtsResult>() {
                    @Override
                    public void onResult(TtsResult result) {
                        // 获取数据回掉 注意 回调在子线程执行
                        // result.getData() 为合成的语音数据
                        FileUtil.append(file, result.getData());
                        // 合成完毕
                        if (result.getStatus() == SpeechUtility.StatusCode.END) {
                            handler.postTask(() -> showToast("合成完毕"));
                            // 开始播放
                            playMp3(file);
                        }
                    }
                }
        );
    }

    /**
     * 播放音频
     *
     * @param file 源文件
     */
    private void playMp3(File file) {
        try {
            Player player = new Player(getContext());
            FileInputStream in = new FileInputStream(file);
            // 从输入流获取FD对象
            FileDescriptor fd = in.getFD();
            Source source = new Source(fd);
            player.setSource(source);
            player.prepare();
            player.play();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

# 2.6.2 参数设置

语音合成参数类 TtsParam支持设置的参数见下表:

参数名称 数据类型 名称 是否必须 说明
encoding string 输出音频格式 N 目前仅支持“ lame” (mp3文件)
speed int 合成语速 N 默认50,取值范围:[0-100]
volume int 合成音量 N 默认50,取值范围:[0-100]
pitch int 合成语调 N 默认50,取值范围:[0-100]
sample_rate int 采样率 N 暂时只支持16000
channels int 声道数 N 可选值1,2.默认值1
bit_depth int 位深 N 8,16默认值16
vcn string 发音人 N 可选值x2_lzy:x2_lzy, x2_chongchong:x2_chongchong, x2_yifei:x2_yifei, x2_xiaopei:x2_xiaopei, x2_xiaoyuan:x2_xiaoyuan

# 2.6.3 结果解析

SDK返回合成结果为合成音频数据,可缓存到File中,然后用Player播放器播放。

# 3. 接口说明:

# 3.1 SpeechUtility类

路径 com.iflytek.cloud

  • # getInstance

    public static SpeechUtility getInstance()
    

    创建配置单例

    • 返回:

      SpeechUtility

  • # init

    public void init(harmonyos.app.Context context,
                     java.lang.String appId,
                     java.lang.String apiKey,
                     java.lang.String apiSecret)
    

    初始化

    • 参数:

      context - context

      appId - appId

      apiKey - apiKey

      apiSecret - apiSecret

  • # voiceRecognize

    public void voiceRecognize(com.iflytek.cloud.param.IatParam param,
                               com.iflytek.cloud.result.ResultCallBack<com.iflytek.cloud.result.IatResult> callBack)
    

    语音识别

    • 参数:

      param - 语音识别入参

      callBack - ResultCallBack

  • # voiceRecognize

    public void voiceRecognize(com.iflytek.cloud.param.IatParam param,
                               java.io.InputStream resource,
                               com.iflytek.cloud.result.ResultCallBack<com.iflytek.cloud.result.IatResult> callBack)
    

    语音转写

    • 参数:

      param - 语音转写的参数

      resource - 语音流

      callBack - 回调

  • # startRecord

    public void startRecord(com.iflytek.cloud.param.IatParam iatParam,
                            com.iflytek.cloud.result.ResultCallBack<com.iflytek.cloud.result.IatResult> callBack)
    

    开始录音,并将识别结果通过callBack返回

    • 参数:

      iatParam - IatParam

      callBack - ResultCallBack

  • # isRecording

    public boolean isRecording()
    

    判断是都在录音中

    • 返回:

      boolean

  • # stopRecord

    public void stopRecord()
    

    停止录音

  • # voiceSynthesise

    public void voiceSynthesise(com.iflytek.cloud.param.TtsParam param,
                                java.lang.String stringSource,
                                com.iflytek.cloud.result.ResultCallBack<com.iflytek.cloud.result.TtsResult> callBack)
    

    语音合成

    • 参数:

      param - TtsParam 参数

      stringSource - 待合成的内容

      callBack - 合成回调

  • # writeData

    public void writeData(java.io.InputStream resource)
    

    写入数据到引擎

    • 参数:

      resource - 数据源

  • # writeData

    public void writeData(java.io.File file)
                   throws java.io.FileNotFoundException
    

    写入数据

    • 参数:

      file - 数据源

    • 抛出:

      java.io.FileNotFoundException - FileNotFoundException

  • # writeData

    public void writeData(byte[] inData)
    

    写入数据

    • 参数:

      inData - 数据源

  • # writeData

    public void writeData(byte[] inData,
                          int dataStatus)
    

    写入数据

    • 参数:

      inData - 数据源

      dataStatus - 写入的状态码

  • # writeDataEnd

    public void writeDataEnd()
    

    结束写入数据

  • # destroy

  public destroy()

销毁单例对象

# 3.2 IatParam类

包路径 com.iflytek.cloud.param;

说明:语音转写的入参封装类, 可通过该类的set方法设置参数,也可以通过put(key,value)方式设置参数。

# 3.3 TtsParam类

包路径 com.iflytek.cloud.param;

说明:语音合成的入参封装类, 可通过该类的set方法设置参数,也可以通过put(key,value)方式设置参数。

# 4. 常见问题:

# SDK 都支持哪些 HarmonyOS 版本?

答:要求采用 HarmonyOS 1.0的手机版本。

# 如何查看SDK版本?

答:利用 Version.getVersion()可获得 SDK 版本号。

# SDK是否支持同一业务同时开启多路会话?

答:SDK不支持多路会话。