Android SDK接入(旧)

该技术服务已迁移至思必驰开放平台,本文档于2020年8月25日停止更新。最新版请查看:https://cloud.aispeech.com/docs/lfasr_Android

一 功能介绍

录音文件转写,是将已经录制好的音频文件, 通过识别服务,将长段音频数据(5小时以内)转写成文本数据,可用于采访录音转写、音频数据录入、会议记录总结等场景,支持:

  • 可用于基于协议开发的:轻量级嵌入式设备
  • 支持pcm,wav, ogg(speex), ogg_opus, mp3格式的音频文件转写;
  • 有效任务12个小时内出转写结果;
  • 对于大音频文件可以进行分片上传;
  • 支持自定义热词和敏感词配置、语言模型自训练功能,请联系商务或项目经理进行定制。

 

整个识别过程是非实时的,音频文件上传成功后进入等待队列,转写成功后用户可以获取转写结果。返回转写结果时间受排队队列、音频时长因素影响,如转写耗时比平时长,耐心等待即可。

二、调用限制

集成实时长语音转写SDK时,需要注意以下内容:

内容
说明
字符编码 UTF-8
语言种类 中文普通话
服务鉴权 长语音服务使用需要进行授权,详见:服务授权
开发语言 java
响应格式 接口异步回调,详见demo
音频属性 采样率16k、位长16bits、单声道
数据发送

post形式上传本地文件或提供http形式可下载的链接

音频时长/大小 5小时以内,且不超过500M
音频格式 pcm,wav, ogg(speex), ogg_opus, mp3
并发路数 默认5路并发,即可以同时转写5个音频文件
转写结果保存时长 7天
服务开通 调用长语音服务需要先购买时长, 您可以领取免费时长资源或购买付费资源包

三、集成流程

1、 产品创建与授权

1.1 产品创建

控制台里的基础技术标签下可以创建长语音相关产品

2、SDK集成准备

下载SDK

可以共用 在线语音识别 的sdk,请前往:基础技术SDK 下载最新版本的SDK。

SDK准备

集成SDK前,需要有:

jar:DUI-lite-SDK-for-Android-xxx.jar

资源:具体使用到的资源请参考 demo,可以放在assets目录中,也可以自己手动放在磁盘中,比如/sdcard/

3、集成SDK

SDK集成和授权 请参照文档 https://www.duiopen.com/docs/ct_overview_Android

长语音运行流程

流程如下图:

 

四、 SDK参数说明

创建转写任务的参数说明,其它请参见sdk 的 java doc:

参数

类型

必须

说明

productId string 客户编号,唯一。 QUERY STRING
audio_id string 和file_path二选一 分片上传完成后的audio_id。(72小时内有效)
file_path string 和audio_id二选一

音频文件的HTTP下载地址。 可选值:可以为一个可以下载的HTTP地址(http地址格式不正确或不能正常下载都会报错), 或者空字符串。

(警告) 如果下载的地址里包含中文,需要把中文的文件名和路径名进行urlencode。

file_len int 否(有file_path时必选) 音频文件长度。单位:byte
check_length double 否(有file_path时必选) 音频的时长(单位:秒), 用户校验剩余时长是否充足
audio_type string 否(有file_path时必选)
音频文件的格式。
可选值:
wav
ogg_speex
mp3
opus
res string

资源场景支持。

可选值: aitransoff

当客户端没有传res参数时,等同于res=aitransoff。

(警告) 当前因为只有aitransoff的场景,客户端无需指定。

lang string

语种支持。

可选值: cn(默认值, 中文), en(英文), ce(中英文混合),sichuantone-mix(四川话+普通话), cantonese-mix(粤语+普通话)

当客户端没有传lang参数时,等同于lang=cn。

sample_rate int

音频文件的采样率。

可选值: 16000(默认值), 8000

客户端没有传递sample_rate参数时,等同于sample_rate=16000。

(警告) 转写服务会在音频检查时,重新检测音频本身的采样率,并以检测后的结果为准

speaker_rate int

说话人聚类使用的采样率。

可选值: 16000(默认值同sample_rate)

客户端没有传递speaker_rate参数时,等同于sample_rate。

channel int

音频文件的通道数。

task_type int 1:机器转写任务
use_txt_smooth int 口语顺滑开关。0:不使用,1:使用(默认)。
use_inverse_txt int 逆文本转换开关。0:不使用,1:使用(默认)。
phrase_file_id string

用户的热词文件ID。 绝对路径为: <PHRASE_FILES_ROOT>/<phrase_file_id>/v1.txt

(警告) (注意):和hotwords参数只会有一个生效。

hotwords string

自定义的热词列表。每个词用英文逗号分割,中文必须使用utf-8编码,单个词必须在2 ~10个汉字之间,热词列表不能超过1000个词。

(警告) (注意):和phrase_file参数只会有一个生效。

lmid string 自训练模型文件LMID。对应的二路模型文件在:<CUSTOME_LM_FILES_ROOT>/<productId>/<lmid>/latest/lm.pat
sensitive_file_id string 用户的敏感词文件ID。绝对路径为: <SENSITIVE_FILES_ROOT>/<sensitive_file_id>/v1.txt
callback string 识别完成时的回调HTTP(s)地址。当设置了callback地址,当识别融合后,会把最终结果以POST方式回传(也可以通过/lasr/task/result的方式来主动获取)。
speaker_number int

发音人个数,可选值:-1-8。0:表示跳过说话人聚类 。>0:音频里发音人个数。默认值:-1:盲分。

备注:

  1. 跳过说话人聚类时,任务的最终result里,没有speaker信息。
  2. 跳过说话人聚类时,任务的最终metrics指标里,没有diarizated_t

 

查询转写结果的返回内容:

{
  errno: 0,
  error: "",
  data: {
    "metrics": {},
    "request": {},
    "result": [
      {
        bg: 0,
        ed: 4950,
        onebest: "思必驰信息科技有限公司。",
        speaker:0
       },
       ...
     ]
  }
}

 

字段说明:

bg:开始时间(ms)
ed:结束时间(ms)
onebest:识别文本
speaker:说话人序号

五、 SDK集成示例

1 初始化引擎

mAICloudLASREngine = AICloudLASREngine.createInstance();
// 初始化
mAICloudLASREngine.init(this"https://lasr.duiopen.com", listener);

2 上传音频文件

创建转写任务并上传音频文件,音频文件支持本地文件和以http可访问形式的文件,且文件最大不超过500M,音频时长不超过5H。

audioParam = new AICloudLASRConfig.AudioParam(audioType);
// 1 上传文件
mAICloudLASREngine.uploadAudioFile(filePath, audioParam);

 

3 恢复继续上传

针对上传失败的本地文件,可以恢复继续上传。

// 上传失败可恢复上一次上传失败的任务
mAICloudLASREngine.uploadResume();

4 创建转写任务

// 2 创建任务
AICloudLASRConfig.TaskParam taskParam = new AICloudLASRConfig.TaskParam(audioParam, (intnew File(filePath).length());
mAICloudLASREngine.createTaskWithAudioId(audioId, taskParam);

5 查询转写进度

查询进度,0-100,达到100说明文件识别完成。服务器需要的识别时间从几分钟到几十分钟不等,视音频文件时间长度而定。

// 3 查询进度
mAICloudLASREngine.queryTaskProcess(taskId);

6 获取转写结果

当转写进度为100时,识别完成,此时可以查询结果

// 4 查询结果
mAICloudLASREngine.queryTaskResult(taskId);

7 销毁引擎

mAICloudLASREngine.destroy();

8 回调接口

所有方法调用都通过回调接口返回,回调方法与调用方法一一对应

// 回调方法
private AILASRListener listener = new AILASRListener() {
  
    @Override
    public void onInit(int status, String errMsg) {
        Log.d(TAG, "onInit " + status + " " + errMsg);
        if (AIConstant.OPT_SUCCESS == status)
            appendText("初始化成功");
        else
            appendText("初始化失败:" + errMsg);
    }
  
    @Override
    public void onUploadFileProcess(String audioFilePath, int process) {
        Log.d(TAG, "onUploadFileProcess " + process + " " + audioFilePath);
        progressBarFile.setProgress(process);
        if (process == 100)
            appendText("服务器正在处理文件,请等待几秒到几分钟不等");
    }
  
    @Override
    public void onUploadFileResult(String audioFilePath, String audioId, AIError error) {
        Log.d(TAG, "onUploadFileResult " + audioId + " audioFilePath " + audioFilePath);
        CloudLASR.this.audioId = audioId;
        if (error == null)
            appendText("onUploadFileResult " + audioId);
        else
            appendText("onUploadFileResult " + error.getErrId() + "" + error.getError());
    }
  
    @Override
    public void onTaskCreate(String audioId, String taskId, AIError error) {
        Log.d(TAG, "onTaskCreate audioId " + audioId + "taskId" + taskId);
        CloudLASR.this.taskId = taskId;
        if (error == null)
            appendText("onTaskCreate " + taskId);
        else
            appendText("onTaskCreate " + error.getErrId() + "" + error.getError());
    }
  
    @Override
    public void onTaskProcess(String taskId, int process, AIError error) {
        Log.d(TAG, "onTaskProcess " + process);
        if (error == null)
            progressBarTask.setProgress(process);
        else
            appendText("onTaskProcess " + error.getErrId() + "" + error.getError());
    }
  
    @Override
    public void onTaskResult(String taskId, String results, AIError error) {
        Log.d(TAG, "onTaskResult " + results.length() + " " + results);
        if (error == null)
            appendText("onTaskResult " + results);
        else
            appendText("onTaskResult " + error.getErrId() + "" + error.getError());
  
        // Log.d(TAG, "ASR2: " + mAICloudLASREngine.queryASR(taskId));
    }
};

六、错误码

请看 通用错误码 和 长语音错误码

https://www.duiopen.com/docs/ct_errorcode_Android

七、接口文档

接口文档见:https://www.duiopen.com/duilite-doc/android/

八、常见问题

1、 如何试用服务和购买服务

可以联系商务购买或体验

 

2、 对硬件的要求有什么

Android 4.0 及以上系统的设备,能联网即可。

 

3、 转写结果存储多久

音频上传后得到 audioId ,保留1天。

转写结果保留7天

 

5、 支持的音频格式和语言

普通话,wav, ogg_speex, mp3,opus 16k 16bit 单声道