语音转写(Long Form Automatic Speech Recognition):基于科大讯飞独立研究的深度全序列卷积神经网络语音识别框架(Deep Fully Convolutional Neural Network, DFCNN),针对语音的长时相关性进行语言建模,将音频数据转换成文本数据,为后续的信息处理和数据挖掘提供基础。 具体表现形式为,将多种格式的长段音频文件(5小时以内)转换成包含时间戳、词句置信度、词属性以及句子标志的文字信息。文字信息提供分词形式以及整段文字形式以及发音人分离功能。
转写的是已录制音频(非实时),音频文件上传成功后进入等待队列,待转写成功后用户即可获取结果,返回结果时间受音频时长以及排队任务量的影响。如遇转写耗时比平时延长,大概率表示当前时间段出现转写高峰,即有任务积压排队,属正常现象,请耐心等待。
为使转写服务更加通畅,请尽量转写5分钟以上的音频文件,上传大量的短音频易引起网络和服务器资源紧张,从而导致任务排队积压。
另外,语音转写是SLA协议对象服务之一,我们对付费用户承诺有效任务耗时最大不超过12小时,赔偿标准等详情请参考SLA协议。
SDK下载请点击 语音转写Java SDK下载,开发文档详见下方。
进入讯飞开放平台主页https://www.ai-sip.com/或者对应的产品页,点击右上角登录或者注册按钮,完成登录操作。
进入控制台“我的应用”列表页,点击左上角“创建新应用”,并填写相关应用信息,个人实名认证用户可创建5个应用,企业实名认证用户可创建20个应用,若创建更多应用用户可选择企业实名认证。
创建完应用之后,在当前应用下,选择“语音转写”,然后在控制台下方点击领取试用时长或者购买正式时长。
购买完成后,在“控制台”的对应的应用上,进入语音转写一栏,选择Java SDK下载。若为WebAPI,可以直接点开技术文档查看接口文档,另外在服务的产品页“语音转写”服务管理中,可以查看密钥,请牢记应用唯一标识appid和转写服务访问密钥secret_key!
下载的demo为标准maven工程。工程内已包含Java SDK的对应jar包,并且pom文件中已经配置好相应的依赖关系。找到代码中LfasrSDKDemo类,替换代码中的appid、secret_key。然后运行其main方法即可。
获取到的Java SDK包结构如下:
src
-- main
-- java
-- com.iflytek.lfasr.demo
-- LfasrSDKDemo
-- resources
-- audio
-- lfasr.wav
-- lib
-- lfasr-sdk-3.0.0.jar
pom.xml
LfasrSDKDemo:为demo程序,包含各种用法示例;
lfasr.wav:为示例音频;
lfasr-sdk-3.0.0.jar:为语音转写Java SDK的jar包。
熟悉demo中使用方法后,可以将Java SDK集成到自己的应用工程中。
1、将上面 lfasr-sdk-3.0.0.jar 包放入目标工程;
2、参照demo示例调用方式编写代码即可。
SDK入口程序类:LfasrClient,通过 LfasrClient.getInstance(......);
创建客户端实例。
接口名称 | 参数 | 返回值 | 功能简介 |
---|---|---|---|
getInstance ( String appId, String secretKey ) | appId:应用appid secretKey:应用secret_key | LfasrClient | 创建客户端实例 |
getInstance ( String appId, String secretKey, String proxyUrl ) | appId:应用appid secretKey:应用secret_key proxyUrl:设置网络代理 | LfasrClient | 创建客户端实例 当需要设置代理时使用 |
getInstance ( String appId, String secretKey, int coreThreads, int maxThreads, String proxyUrl ) | appId:应用appid secretKey:应用secret_key coreThreads:核心线程数 maxThreads:最大线程数 proxyUrl:设置网络代理 | LfasrClient | 创建客户端实例 有特殊性能要求时使用 |
getInstance ( String appId, String secretKey, int coreThreads, int maxThreads, int maxConnections, int connTimeout, int soTimeout, String proxyUrl ) | appId:应用appid secretKey:应用secret_key coreThreads:核心线程数 maxThreads:最大线程数 maxConnections:最大网络连接数 connTimeout:连接超时时间(ms) soTimeout:响应超时时间(ms) proxyUrl:设置网络代理 | LfasrClient | 创建客户端实例 有特殊性能要求时使用 |
upload ( String audioFilePath ) | audioFilePath:音频文件路径 | Message | 上传音频文件 创建转写任务 |
upload ( String audioFilePath, Map<String, String> param ) | audioFilePath:音频文件路径 param:业务扩展参数 (见下表) | Message | 上传音频文件 创建转写任务 |
getProgress ( String taskId ) | taskId:任务ID, 由upload接口返回的Message中获取 | Message | 获取转写进度 |
getResult ( String taskId ) | taskId:任务ID, 由upload接口返回的Message中获取 | Message | 获取转写结果 |
参数 | 类型 | 必须 | 说明 | 示例 |
---|---|---|---|---|
lfasr_type | string | 否 | 转写类型,可选值: 0(标准版-已录制音频,格式包括 wav,flac,opus,mp3,m4a), 2(电话专用版,已取消电话专用版套餐),默认0 | 0 |
has_participle | string | 否 | 转写结果是否包含分词信息 | false或true, 默认false |
has_seperate | string | 否 | 转写结果中是否包含发音人分离信息 | false或true, 标准版默认:false,电话版默认:true |
role_type | string | 否 | 支持两种参数 1: 通用角色分离 2: 电话信道角色分离(适用于speaker_number为2的说话场景) | 该字段只有在开通了角色分离功能的前提下才会生效,正确传入该参数后角色分离效果会有所提升。 如果该字段不传,默认采用 1 类型 |
max_alternatives | string | 否 | 转写结果中最大的候选词个数 | 默认:0,最大不超过5 |
speaker_number | string | 否 | 发音人个数,可选值:0-10,0表示盲分 注:发音人分离目前还是测试效果达不到商用标准,如测试无法满足您的需求,请慎用该功能。 | 默认:2(适用通话时两个人对话的场景) |
language | string | 否 | 语种 cn:中英文&中文(默认) en:英文(英文不支持热词) | cn |
pd | string | 否 | 垂直领域个性化参数: 法院: court 教育: edu 金融: finance 医疗: medical 科技: tech | 设置示例: params.put("pd", "edu") pd为非必须设置参数,不设置参数默认为通用 |
Message 响应消息类
属性名称 | 类型 | 说明 |
---|---|---|
ok | int | 0:成功 -1:失败 |
errNo | int | 错误码 (见错误码) |
failed | String | 失败原因 |
data | String | 数据 upload接口,为taskId getProgress接口,为状态json数据 getResult接口,为结果json数据 |
//1、创建客户端实例
LfasrClient lfasrClient = LfasrClient.getInstance(APP_ID, SECRET_KEY);
//2、上传音频文件
Message task = lfasrClient.upload(AUDIO_FILE_PATH);
String taskId = task.getData();
System.out.println("转写任务 taskId:" + taskId);
//3、查看转写进度
int status = 0;
while (status != 9) {
Message message = lfasrClient.getProgress(taskId);
JSONObject object = JSON.parseObject(message.getData());
status = object.getInteger("status");
System.out.println(message.getData());
TimeUnit.SECONDS.sleep(2);
}
//4、获取结果
Message result = lfasrClient.getResult(taskId);
System.out.println("转写结果: \n" + result.getData());
字段名 | 说明 |
---|---|
bg | 句子相对于本音频的起始时间,单位为ms |
ed | 句子相对于本音频的终止时间,单位为ms |
onebest | 句子内容 |
speaker | 说话人编号,从1开始,未开启说话人分离时speaker都为0 |
si | 句子标识,相同si表示同一句话,从0开始 注:仅开启分词或者多候选时返回 |
wordsResultList | 分词列表 注:仅开启分词或者多候选时返回,且英文暂不支持 |
alternativeList | 多候选列表,按置信度排名 注:仅开启分词或者多候选时返回,且英文暂不支持 |
wordBg | 词相对于本句子的起始帧,其中一帧是10ms 注:仅开启分词或者多候选时返回,且英文暂不支持 |
wordEd | 词相对于本句子的终止帧,其中一帧是10ms 注:仅开启分词或者多候选时返回,且英文暂不支持 |
wordsName | 词内容 注:仅开启分词或者多候选时返回,且英文暂不支持 |
wc | 句子置信度,范围为[0,1] 注:仅开启分词或者多候选时返回,且英文暂不支持 |
wp | 词属性,n代表普通词,r代表人名,d代表数字,m代表量词,s代表顺滑词(语气词),t代表地名&多音字,p代表标点,g代表分段标识 注:仅开启分词或者多候选时返回 |
错误码 | 错误码描述 |
---|---|
0 | 成功 |
26000 | 转写内部通用错误 |
26100 | 转写配置文件错误 |
26101 | 转写配置文件app_id/secret_key为空 |
26102 | 转写配置文件lfasr_host错误 |
26103 | 转写配置文件file_piece_size错误 |
26104 | 转写配置文件file_piece_size建议设置10M-30M之间 |
26105 | 转写配置文件store_path错误,或目录不可读写 |
26201 | 转写参数上传文件不能为空或文件不存在 |
26202 | 转写参数类型不能为空 |
26203 | 转写参数客户端生成签名错误 |
26301 | 转写断点续传持久化文件读写错误 |
26302 | 转写断点续传文件夹读写错误 |
26303 | 转写恢复断点续传流程错误,请见日志 |
26401 | 转写上传文件路径错误 |
26402 | 转写上传文件类型不支持错误 |
26403 | 转写本地文件上传超过限定大小500M |
26404 | 转写上传文件读取错误 |
26500 | HTTP请求失败 |
26501 | 转写获取版本号接口错误 |
26502 | 转写预处理接口错误 |
26503 | 转写上传文件接口错误 |
26504 | 转写合并文件接口错误 |
26505 | 转写获取进度接口错误 |
26506 | 转写获取结果接口错误 |
26600 | 转写业务通用错误 |
26601 | 非法应用信息 |
26602 | 任务ID不存在 |
26603 | 接口访问频率受限(默认1秒内不得超过20次) |
26604 | 获取结果次数超过限制,最多100次 |
26605 | 任务正在处理中,请稍后重试 |
26606 | 空音频,请检查 |
26610 | 请求参数错误 |
26621 | 预处理文件大小受限(500M) |
26622 | 预处理音频时长受限(5小时) |
26623 | 预处理音频格式受限 |
26625 | 预处理服务时长不足。您剩余的可用服务时长不足,请移步产品页https://www.ai-sip.com/services/lfasr 进行购买或者免费领取 |
26631 | 音频文件大小受限(500M) |
26632 | 音频时长受限(5小时) |
26633 | 音频服务时长不足。您剩余的可用服务时长不足,请移步产品页https://www.ai-sip.com/services/lfasr 进行购买或者免费领 |
26634 | 文件下载失败 |
26635 | 文件长度校验失败 |
26640 | 文件上传失败 |
26641 | 上传分片超过限制 |
26642 | 分片合并失败 |
26643 | 计算音频时长失败,请检查您的音频是否加密或者损坏 |
26650 | 音频格式转换失败,请检查您的音频是否加密或者损坏 |
26660 | 计费计量失败 |
26670 | 转写结果集解析失败 |
26680 | 引擎处理阶段错误 |
状态ID | 状态描述 |
---|---|
0 | 任务创建成功 |
1 | 音频上传完成 |
2 | 音频合并完成 |
3 | 音频转写中 |
4 | 转写结果处理中 |
5 | 转写完成 |
9 | 转写结果上传完成 |
(1)输入音频的格式&比特率
如若条件允许,请尽量使用pcm,alaw或者ulaw编码的原始wav音频或者无损音频压缩编码(FLAC)来录制以及传输音频。
如果有压缩需求,在原始音频比特率较高(大于16kHz16bit)的情况下,可以采用任意系统支持的格式;而在原始音频比特率较低(小于16kHz16bit)的情况下,建议采用压缩比小于10的opus,使用其他有损编码,如mp3,m4a等会减弱识别准确率。
注,无压缩的pcm音频:比特率(bps)=采样率(kHz)*位数(bit)*声道数;其他类型音频的比特率可由查看其音频属性获得。
(2)背景音和噪声
录音时尽量使用靠近并且指向发声方向的麦克风(例如耳麦);对于已录制音频,建议只摘取人说话声音,避免背景音混叠;对于已经录制好的音频,由于转写引擎在转写之前会对音频进行降噪操作,因此不建议您采用额外的降噪处理。
(3)多人同时发音情况
当对多个发音人同时采集音频时,建议对音频进行预先切分,每次请求识别的音频只含有一位发音人的语音。因为当多人同时发音或多人发音音量有区别时,部分语音有可能会被视为背景噪音而剔除。
(4)有效音频的上传
为了避免您的时长损失,请上传普通播放器可播放的音频。如果上传加密、损坏的音频,或者更改音频后缀,可能会造成转写失败或者输出乱码结果。
(5)音频幅值
音频的帧平均幅度值在5000~20000之间为最佳。不需要刻意录制更高幅度值的音频,否则有可能造成截幅,降低识别率。
(6)音频时长
语音转写最大的特点为具有长时记忆功能,即时间越长的音频,其准确率会越高。建议使用大于1分钟的音频进行转写。
答:支持,要保证同一个appid每秒请求接口次数最大值在20次以下。
答:平台免费赠送的时长为5小时,供开发者测试使用,每个账户限领取1次(应用控制台领取即可),有效期为自生效日起30天。
答:关于返回时长快慢,需要看当时的转写任务量以及是否是高峰期,如任务积压,排队处理需要时间,时间上会长些。
另外语音转写是SLA协议对象服务之一,我们对付费用户承诺有效任务耗时最大不超过12小时,赔偿标准等详情请参考SLA协议。
答:语音转写支持Java和WebAPI接口。
答:目前语音转写支持的音频格式为:已录制音频,wav,flac,opus,m4a,mp3,单声道&多声道,支持语种:中文普通话、英语;采样率:8KHz,16KHz;采样精度:8bits,16bits
答:目前电话版和标准版已经合并为统一的版本,电话版老用户的时长可以继续使用。合并后的版本支持多发音人分离,具体参数调整请参考开发文档。
答:支持语种:中文普通话、英语