业务背景:公司要做一个语音转写的功能,自己开发的成本实在是有点大,直接调用科大讯飞的语音转写的接口,这是调用的具体步骤,如有疑问或者建议可加我本人QQ:450275861

科大讯飞的网址:

https://www.xfyun.cn/?ch=bdtg&b_scene_zt=1

当你注册成功以后,系统会把APPID和SecretKey给你,这两条数据你要记录一下,后面要用到

进入网址后,因为我用的是语音转写服务,所以,我先领取体验包

下面介绍一下用WebAPI的方式来进行的接口调用,首先可以先把接口的demo例子下载下来,集成到我们的项目中

下载完成后,是这几个类

主要介绍一下WebLfasrDemo这个类吧,咱们自己的业务逻辑代码是写在这里的

代码我已经粘贴出来了,上面注释都写的很详细,有一个地方没写,就是异常的处理,根据自己公司的规范自己处理一下就可以了

package com.atguigu.springboot.controller;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.security.SignatureException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.atguigu.springboot.ApiResultDto;
import com.atguigu.springboot.util.EncryptUtil;
import com.atguigu.springboot.util.HttpUtil;
import com.atguigu.springboot.util.SliceIdGenerator;

/**

  • 非实时转写webapi调用demo
  • 此demo只是一个简单的调用示例, 不适合用到实际生产环境中
  • @author white

/
public class WebLfasrDemo {
//这是调用的域名,建议加上https
public static final String LFASR_HOST = “http://raasr.xfyun.cn/api”;
/
*
* 此处是设置你的sppid和sercet_key
* 需要在科大讯飞上申请
*/
public static final String APPID = “5e533011”;
public static final String SECRET_KEY = “f954b3f9121226a6c607dceb610b3c98”;

public static final String PREPARE = "/prepare";
public static final String UPLOAD = "/upload";
public static final String MERGE = "/merge";
public static final String GET_RESULT = "/getResult";
public static final String GET_PROGRESS = "/getProgress";/*** 文件分片大小,可根据实际情况调整*/
public static final int SLICE_SICE = 10485760;// 10Mpublic static void main(String[] args) {//D:\text.txt/*** 不用写成定时跑批,手动执行就可以,几天跑一次*///文件的总的目录String basePath="D:\\aaa";//先判断这个路径下的是文件还是文件夹if(new File(basePath).isDirectory()) {//获取文件夹下的所有的文件夹String[] list=new File(basePath).list();//遍历文件夹下的所有的文件for (String wj : list) {//测试用的输出,System.out.println(wj);//还得判断一下,是文件还是文件夹if(new File(basePath+"\\"+wj).isDirectory()) {String[] files=new File(basePath+"\\"+wj).list();for (String file : files) {//先判断一下,这个file是文件还是文件夹System.out.println(file);File audio = new File(basePath+"\\"+wj+"\\"+file);//此处是这么拼接,第一层文件夹+第二层文件夹+文件名称try (FileInputStream fis = new FileInputStream(audio)) {// 预处理String taskId = prepare(audio);// 分片上传文件int len = 0;byte[] slice = new byte[SLICE_SICE];SliceIdGenerator generator = new SliceIdGenerator();while ((len =fis.read(slice)) > 0) {// 上传分片if (fis.available() == 0) {slice = Arrays.copyOfRange(slice, 0, len);}uploadSlice(taskId, generator.getNextSliceId(), slice);}// 合并文件merge(taskId);// 轮询获取任务结果while (true) {try {System.out.println("sleep a while Zzz" );System.out.println("此处可以休眠一些时间");Thread.sleep(20000);} catch (InterruptedException e) {e.printStackTrace();}ApiResultDto taskProgress = getProgress(taskId);if (taskProgress.getOk() == 0) {if (taskProgress.getErr_no() != 0) {System.out.println("任务失败:" + JSON.toJSONString(taskProgress));}String taskStatus = taskProgress.getData();if (JSON.parseObject(taskStatus).getInteger("status") == 9) {                    System.out.println("任务完成!");break;}System.out.println("任务处理中:" + taskStatus);} else {System.out.println("获取任务进度失败!");}}//获取解析的结果String result = getResult(taskId);// 获取结果,测试解析的结果System.out.println("\r\n\r\n转写结果: " + getResult(taskId));//把解析的结果写入到文件中去writeToText(wj,file, result);/*** 转写结果: [{"bg":"600","ed":"7530","onebest":"绿是阳春烟景,大块文章的底色,4月的林峦更是绿得鲜活!","speaker":"0"},{"bg":"7540","ed":"9150","onebest":"诶诗意盎然!","speaker":"0"}]* * 此处需要写业务逻辑* * * */} catch (SignatureException e) {e.printStackTrace();} catch (FileNotFoundException e1) {e1.printStackTrace();} catch (IOException e1) {e1.printStackTrace();}}}}}}/*** 获取每个接口都必须的鉴权参数* * @return* @throws SignatureException */
public static Map<String, String> getBaseAuthParam(String taskId) throws SignatureException {Map<String, String> baseParam = new HashMap<String, String>();String ts = String.valueOf(System.currentTimeMillis() / 1000L);baseParam.put("app_id", APPID);baseParam.put("ts", ts);baseParam.put("signa", EncryptUtil.HmacSHA1Encrypt(EncryptUtil.MD5(APPID + ts), SECRET_KEY));if (taskId != null) {baseParam.put("task_id", taskId);}return baseParam;
}/*** 预处理* * @param audio     需要转写的音频* @return* @throws SignatureException */
public static String prepare(File audio) throws SignatureException {Map<String, String> prepareParam = getBaseAuthParam(null);long fileLenth = audio.length();prepareParam.put("file_len", fileLenth + "");prepareParam.put("file_name", audio.getName());prepareParam.put("slice_num", (fileLenth/SLICE_SICE) + (fileLenth % SLICE_SICE == 0 ? 0 : 1) + "");/********************TODO 可配置参数********************/// 转写类型

// prepareParam.put(“lfasr_type”, “0”);
// 开启分词
// prepareParam.put(“has_participle”, “true”);
// 说话人分离
// prepareParam.put(“has_seperate”, “true”);
// 设置多候选词个数
// prepareParam.put(“max_alternatives”, “2”);
// 是否进行敏感词检出
// prepareParam.put(“has_sensitive”, “true”);
// 敏感词类型
// prepareParam.put(“sensitive_type”, “1”);
// 关键词
// prepareParam.put(“keywords”, “科大讯飞,中国”);
/****************************************************/

    String response = HttpUtil.post(LFASR_HOST + PREPARE, prepareParam);if (response == null) {throw new RuntimeException("预处理接口请求失败!");}ApiResultDto resultDto = JSON.parseObject(response, ApiResultDto.class);String taskId = resultDto.getData();if (resultDto.getOk() != 0 || taskId == null) {throw new RuntimeException("预处理失败!" + response);}System.out.println("预处理成功, taskid:" + taskId);return taskId;
}/*** 分片上传* * @param taskId        任务id* @param slice         分片的byte数组* @throws SignatureException */
public static void uploadSlice(String taskId, String sliceId, byte[] slice) throws SignatureException {Map<String, String> uploadParam = getBaseAuthParam(taskId);uploadParam.put("slice_id", sliceId);String response = HttpUtil.postMulti(LFASR_HOST + UPLOAD, uploadParam, slice);if (response == null) {throw new RuntimeException("分片上传接口请求失败!");}if (JSON.parseObject(response).getInteger("ok") == 0) {System.out.println("分片上传成功, sliceId: " + sliceId + ", sliceLen: " + slice.length);return;}System.out.println("params: " + JSON.toJSONString(uploadParam));throw new RuntimeException("分片上传失败!" + response + "|" + taskId);
}/*** 文件合并* * @param taskId        任务id* @throws SignatureException */
public static void merge(String taskId) throws SignatureException {String response = HttpUtil.post(LFASR_HOST + MERGE, getBaseAuthParam(taskId));if (response == null) {throw new RuntimeException("文件合并接口请求失败!");}if (JSON.parseObject(response).getInteger("ok") == 0) {System.out.println("文件合并成功, taskId: " + taskId);return;}throw new RuntimeException("文件合并失败!" + response);
}/*** 获取任务进度* * @param taskId        任务id* @throws SignatureException */
public static ApiResultDto getProgress(String taskId) throws SignatureException {String response = HttpUtil.post(LFASR_HOST + GET_PROGRESS, getBaseAuthParam(taskId));if (response == null) {throw new RuntimeException("获取任务进度接口请求失败!");}return JSON.parseObject(response, ApiResultDto.class);
}/*** 获取转写结果* * @param taskId* @return* @throws SignatureException */
public static String getResult(String taskId) throws SignatureException {String responseStr = HttpUtil.post(LFASR_HOST + GET_RESULT, getBaseAuthParam(taskId));if (responseStr == null) {throw new RuntimeException("获取结果接口请求失败!");}ApiResultDto response = JSON.parseObject(responseStr, ApiResultDto.class);if (response.getOk() != 0) {throw new RuntimeException("获取结果失败!" + responseStr);}return response.getData();
}
/*** @param OneDirectory   最外一层目录* @param twoDirectory   第二层目录* @param fileName       文件名称* @param fileText      文件内容       */
public static void writeToText(String twoDirectory,String fileName,String fileText) {//自己定义一个存放文件的目录,第二层目录就用解析的目录就可以了,话有文件的名称也用之前的就可以String OneDirectory = "d:/writeToText";if(fileName != null && !"".equals(fileName)) {//处理一下文件名,只要前缀String preFile = fileName.substring(0, fileName.lastIndexOf("."));//先判断最外层的目录,如果没有就创建File oneDir = new File(OneDirectory);if(!oneDir.exists()) {oneDir.mkdir();}//判断第二层目录是否存在,不存在则创建File twoDir = new File(OneDirectory+"/"+twoDirectory);if(!twoDir.exists()) {twoDir.mkdirs();}//判断两层目录后,判断文件是否存在File file = new File(OneDirectory+"/"+twoDirectory,preFile);if(!file.exists()) {try {file.createNewFile();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//向指定文件中写入文字FileWriter fileWriter;try {fileWriter = new FileWriter(OneDirectory+"\\"+twoDirectory+"\\"+preFile);//使用缓冲区比不使用缓冲区效果更好,因为每趟磁盘操作都比内存操作要花费更多时间。//通过BufferedWriter和FileWriter的连接,BufferedWriter可以暂存一堆数据,然后到满时再实际写入磁盘//这样就可以减少对磁盘操作的次数。如果想要强制把缓冲区立即写入,只要调用writer.flush();这个方法就可以要求缓冲区马上把内容写下去BufferedWriter bufferedWriter=new BufferedWriter(fileWriter);//向文件中写入数据bufferedWriter.write(fileText);bufferedWriter.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

}

科大讯飞语音转文字开发(Java代码)相关推荐

  1. Android 科大讯飞 语音转文字

    Android 科大讯飞 语音转文字 语音听写SDK适配安卓6.0需要手动申请权限,各位可以自信查询资料实现,关于语音听写SDK的开发,参考科大讯飞开放平台官网为准 第一,首先去科大讯飞官网注册一个账 ...

  2. Java 技术篇-使用IDEA开发java代码实例演示,IntelliJ IDEA的安装与使用

    使用 IntelliJ IDEA 开发 Java 代码 第一章:IDEA 的下载与安装 ① IDEA 的下载 ② IDEA 的安装 ③ IDEA 的配置 第二章:IDEA 创建并运行项目演示 ① ID ...

  3. 科大讯飞语音转文字以及中文分词的Java测试代码

    我录了一段音存储在这个test.m4a文件里,语音内容为"测试一下Netweaver对于并发请求的响应性能". 使用如下Java代码进行测试: package com.iflyte ...

  4. 科大讯飞语音转文字_科大讯飞推出TWS真无线耳机:主打商务沟通,实时语音转文字...

    昨日,科大讯飞正式发布了旗下首款真无线耳机"IFLYBUDS",在目前无线耳机的功能的基础上,增添了实时语音转文字功能,可替代录音笔等设备,主打商务沟通. 单从外观来看,IFLYB ...

  5. Android开发——Java代码动态改变图片颜色

    前言 在Android开发当中,我们会遇到多张图片需要改变背景颜色,我们不能用代码写死,但是我们setBackgroundColor方法改变是会被把我们背景变成直角的,但是从用户体验感的角度来讲是带有 ...

  6. 转:基于科大讯飞语音API语音识别开发详解

    原文来自于: http://www.52wulian.org/android_voice/ 最近项目需要用到android语音识别,立马就想到科大讯飞,结合官方实例及阅读API文档,初步的完成了And ...

  7. Android studio语音识别集成科大讯飞语音转文字

    老规矩:第一步,上效果图 事先说明: 语音听写SDK适配安卓6.0需要手动申请权限,各位可以自信查询资料实现,关于语音听写SDK的开发,参考科大讯飞开放平台官网为准 步骤一:百度科大讯飞开发者平台,找 ...

  8. 科大讯飞语音工具类基于Java SDK的封装使用

    目的 基于学习和小项目开发场景的需求,本文章对讯飞开放平台(https://www.xfyun.cn)中关于语音能力(语音合成.语音识别)进行了一定程度的封装,通过引入封装工具包可以便捷的使用在线合成 ...

  9. 讯飞tts语音引擎9.0_使用科大讯飞语音转文字的服务进行电话录音分析

    # 需求 合规性质检:1)设定规则,实现自动质检,自动打分:2)如VOC文本质检可与语音文字进行匹配,自动判断是否合格:3)新媒体文本可自动质检4)可识别异常录音(指定标准外):5)诉求记录与语音内容 ...

最新文章

  1. php读取access编码格式,php+access如何设置编码格式
  2. Ubuntu中安装sqldeveloper出现的问题及其解决方法
  3. 四周第四次课 6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 x
  4. 文件的 MD5 签名介绍
  5. 为什么大学感觉学编程很难?原因有这三点。
  6. Softaken Unlock PDF Files v1.0 PDF文件解密
  7. Apache Shiro入门
  8. Unity中Temporal AA
  9. Compose 1.0 即将发布,你准备好了吗?
  10. 【鱼眼镜头4】[鱼眼畸变模型]:四阶多项式模型
  11. DevOps及DevOps常用的工具介绍
  12. Python机器视觉--OpenCV入门--机器视觉与OpencCV用途简介
  13. Python 决策树
  14. java求两个非零正整数的最大公约数和最小公倍数
  15. 女朋友转行 Java 失败,被辞退了。。。
  16. 什么是ACCESS端口?此端口如何处理数据帧?
  17. 如何下载谷歌/百度/高德大字体地图用于打印
  18. Idea打包可运行jar
  19. 【转】考试心得:MBA联考220分之心得
  20. 暴风影音——去除广告的方法

热门文章

  1. python tensorflow 以图搜图_GitHub - lomoss/SearchImage: 基于VGG16的图像检索系统,简单的以图搜图。...
  2. python创建工作簿_创建工作簿、工作表和写入单元格
  3. 3C数码行业采购商城系统优化采购渠道,降低采购成本
  4. 关于Java中数据报套接字DatagramSocket中connet()方法说明
  5. fedora的官方镜像地址列表
  6. 常见矩阵分解方法及其应用
  7. linux求斐波那契数列前10项,linux求斐波那契数列的前10项以及总和.
  8. uni-app设置背景图片占满全屏
  9. iOS开发--Swift:布局库——SnapKit
  10. 奶爸日记25 - 笛子