java 调用科大讯飞 实现会议录音,语音转写会议既要功能

功能要求:使用java 调用科大讯飞 实现会议录音,语音转写会议既要功能。
科大讯飞官网有api,还有具体的实例,可以实现关于语音需求的大部分功能。地址如下:
https://www.xfyun.cn/doc/platform/quickguide.html。
先注册,注册后会生成appid和SECRET_KEY 。
根据我的个人需求:我调用的是这个api方法即可。在这里插入图片描述

**
这里涉及一个科大讯飞的sdk包,需要下载,并配置maven。**

具体代码如下,根据提供的实例改写:涉及到了5个方法类第一、LfasrSDKDemo,主函数入口,功能包括一个录音界面方法,以及语音转写方法调用。

package com.jsbs.fxffjcpt.utils.LuyinHy.sdkTurn;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.iflytek.msp.lfasr.LfasrClient;
import com.iflytek.msp.lfasr.model.Message;
import com.jsbs.fxffjcpt.utils.LuyinHy.Luyin;
import com.jsbs.fxffjcpt.utils.LuyinHy.TxtWriteUtil;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * <p>Title : SDK 调用实例</p>
 * <p>Description : </p>
 * <p>Date : 2020/4/20 </p>
 *
 * @author : hejie
 */
@Component
public class LfasrSDKDemo {
    private static final String APP_ID = ""; //注册后你自己的appid
    private static final String SECRET_KEY = "";   //注册后你自己SECRET_KEY 
    //本地文件保存地址
    static String file = "C:\\Users\\chenjiaxing\\Desktop\\bs\\save";

    @Autowired
    private static TxtWriteUtil txtWriteUtil;


    /**
     * 简单 demo 样例
     *
     * @throws InterruptedException e
     */
    public static Map standard(String path) throws InterruptedException {
        Map<String,String> map=new HashMap<>();

        //1、创建客户端实例
        LfasrClient lfasrClient = LfasrClient.getInstance(APP_ID, SECRET_KEY);

        //2、上传
        Message task = lfasrClient.upload(path);
        String taskId = task.getData();
        System.out.println("转写任务 taskId:" + taskId);

        //3、查看转写进度
        int status = 0;
        while (status != 9) {
            Message message = lfasrClient.getProgress(taskId);
            if(message.getOk()==-1){
                System.out.println("异常----------------------"+message.getFailed());
                break;
            }else {
                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());

        if(result.getOk()==-1){
           map.put("code","400");
           map.put("result",result.getFailed());

        }else{
            String content="";
            ResDemo [] array = new Gson().fromJson(result.getData(),ResDemo[].class);
            List<ResDemo>  list = Arrays.asList(array);
            for (ResDemo  res:list) {
                content+=res.getOnebest();
            }
             //写入会议既要
            txtWriteUtil.write(path,content);
            map.put("code","200");
            map.put("result",content);
        }
        return map;


        //退出程序,关闭线程资源,仅在测试main方法时使用。
       // System.exit(0);
    }

    /**
     * 带有业务参数,调用样例
     *
     * @throws InterruptedException e
     */
    private static void businessExtraParams(String path) throws InterruptedException {
        //1、创建客户端实例
        LfasrClient lfasrClient = LfasrClient.getInstance(APP_ID, SECRET_KEY);

        //2、上传
        //2.1、设置业务参数
        Map<String, String> param = new HashMap<>(16);
        //是否开启分词:默认 false
        //param.put("has_participle","true");
        //转写结果中最大的候选词个数:默认:0,最大不超过5
        //param.put("max_alternatives","2");

        //是否开启角色分离:默认为false
        //param.put("has_seperate","true");
        //发音人个数,可选值:0-10,0表示盲分:默认 2
        //param.put("speaker_number","3");
        //角色分离类型 1-通用角色分离;2-电话信道角色分离:默认 1
        //param.put("role_type","1");

        //语种: cn-中文(默认);en-英文(英文不支持热词)
        param.put("language", "cn");
        //垂直领域个性化:法院-court;教育-edu;金融-finance;医疗-medical;科技-tech
        //param.put("pd","finance");

        Message task = lfasrClient.upload(
                path
                , param);
        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());


        //退出程序,关闭线程资源,仅在测试main方法时使用。
        System.exit(0);
    }

    /**
     * 设置网络代理,调用样例
     *
     * @throws InterruptedException e
     */
    private static void netProxy(String path) throws InterruptedException {
        //1、创建客户端实例, 设置网络代理
        LfasrClient lfasrClient = LfasrClient.getInstance(APP_ID, SECRET_KEY, "http://x.y.z/");
        //LfasrClient lfasrClient = LfasrClient.getInstance(APP_ID, SECRET_KEY);


        //2、上传
        //2.1、设置业务参数
        Map<String, String> param = new HashMap<>(16);
        //语种: cn-中文(默认);en-英文(英文不支持热词)
        param.put("language", "cn");
        //垂直领域个性化:法院-court;教育-edu;金融-finance;医疗-medical;科技-tech
        //param.put("pd","finance");

        Message task = lfasrClient.upload(
                path
                , param);
        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());


        //退出程序,关闭线程资源,仅在测试main方法时使用。
        System.exit(0);
    }

    /**
     * 性能调优参数,调用样例
     *
     * @throws InterruptedException e
     */
    private static void performance(String path) throws InterruptedException {
        //1、创建客户端实例, 设置性能参数
        LfasrClient lfasrClient =
                LfasrClient.getInstance(
                        APP_ID,
                        SECRET_KEY,
                        10, //线程池:核心线程数
                        50, //线程池:最大线程数
                        50, //网络:最大连接数
                        10000, //连接超时时间
                        30000, //响应超时时间
                        null);
        //LfasrClient lfasrClient = LfasrClient.getInstance(APP_ID, SECRET_KEY);


        //2、上传
        //2.1、设置业务参数
        Map<String, String> param = new HashMap<>(16);
        //语种: cn-中文(默认);en-英文(英文不支持热词)
        param.put("language", "cn");
        //垂直领域个性化:法院-court;教育-edu;金融-finance;医疗-medical;科技-tech
        //param.put("pd","finance");

        Message task = lfasrClient.upload(
                path
                , param);
        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());


        //退出程序,关闭线程资源,仅在测试main方法时使用。
        System.exit(0);
    }


    /**
     * 获取路径下的所有文件/文件夹
     * @param directoryPath 需要遍历的文件夹路径
     * @param isAddDirectory 是否将子文件夹的路径也添加到list集合中
     * @return
     */
    public static List<String> getAllFile(String directoryPath,boolean isAddDirectory) {
        List<String> list = new ArrayList<String>();
        File baseFile = new File(directoryPath);
        if (baseFile.isFile() || !baseFile.exists()) {
            return list;
        }
        File[] files = baseFile.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                if(isAddDirectory){
                    list.add(file.getAbsolutePath());
                }
                list.addAll(getAllFile(file.getAbsolutePath(),isAddDirectory));
            } else {
                list.add(file.getAbsolutePath());
            }
        }
        return list;
    }



    /************************************************/
   public static class NumFrame extends JFrame implements ActionListener {
       //设置面板
        JPanel topjp = new JPanel();
        JPanel downjp = new JPanel();
        //按钮
        JButton jb1 = new JButton("开始录音");
        JButton jb2 = new JButton("停止录音");
        //创建JTextField,16表示16列,用于JTextField的宽度显示而不是限制字符个数
        JTextField textField = new JTextField(10);
        //标签
        JLabel label = new JLabel("会议号:");
        JLabel label2=new JLabel("输入会议号开始录音");

        String openstr="";
        public NumFrame() {
            //标题
            super("录音控件");
            setSize(800, 400);//窗口大小
            setLocationRelativeTo(null);//居中

            //停止按钮置灰
            jb1.setEnabled(true);
            jb2.setEnabled(false);

            label2.setForeground(Color.red);
            topjp.add(label2);
            topjp.add(label);
            topjp.add(textField);
            //添加控件
            topjp.add(jb1);
            topjp.add(jb2);
            add(topjp, BorderLayout.NORTH);

            List<OgMeet> list=new ArrayList<>();
            try {
               list= getMeets(999999,1);
            } catch (IOException e) {
                e.printStackTrace();
            }

            // 表头(列名)
            Object[] columnNames = {"会议号", "会议名称", "开始时间", "结束时间"};

            Object[][] rowData=new Object[list.size()][columnNames.length];
            for(int i=0;i<list.size();i++){
                for(int j=0;j<columnNames.length;j++){
                    rowData[i][0]=list.get(i).getMeetId();
                    rowData[i][1]=list.get(i).getMeetName();
                    rowData[i][2]=list.get(i).getStartTime();
                    rowData[i][3]=list.get(i).getEndsTime();
                }
            }

            // 创建一个表格,指定 所有行数据 和 表头
            downjp.setLayout(new BorderLayout());
            JTable table = new JTable(rowData, columnNames);
            //创建显示表格的滚动面板
            JScrollPane scrollpane=new JScrollPane(table);
            // 把 表头 添加到容器顶部(使用普通的中间容器添加表格时,表头 和 内容 需要分开添加)
            downjp.add(table.getTableHeader(), BorderLayout.NORTH);
            // 把 表格内容 添加到容器中心
            downjp.add(scrollpane, BorderLayout.CENTER);
            add(downjp, BorderLayout.CENTER);

            //按钮点击事件
            jb1.addActionListener((e) -> {
                onButtonOk();
            });

            jb2.addActionListener((e) -> {
                stopButton();
            });

            setDefaultCloseOperation(EXIT_ON_CLOSE);//关闭后退出
        }

        @Override
        public void actionPerformed(ActionEvent e) {

        }

        //开始录音事件处理
        private void onButtonOk(){
            openstr = textField.getText();//获取输入内容
            //判断是否输入了
            if(openstr.equals("")){
                JOptionPane.showMessageDialog(null,"您还没有输入会议号" );
            }else{
                //录音
                Luyin luyin=new Luyin();
                luyin.captureAudio(openstr);
                jb1.setEnabled(false);
                jb2.setEnabled(true);
                JOptionPane.showMessageDialog(null,"会议"+openstr+"开始录音" );
            }
        }

        //结束录音事件处理
        private void stopButton(){
                String str = textField.getText();//获取输入内容
                //判断是否输入了
                if(str.equals("")){
                    JOptionPane.showMessageDialog(this,"您还没有输入会议号" );
                }else if(!openstr.equals(str)){
                    JOptionPane.showMessageDialog(this,"当前会议号未开始录音" );
                }else{
                 //  停止录音
                try {
                       Luyin luyin=new Luyin();
                       luyin.stopLuyin();
                       jb1.setEnabled(true);
                       jb2.setEnabled(false);
                       //弹框提示
                       JOptionPane.showMessageDialog(null, "会议既要生成中,请稍后", "标题",JOptionPane.PLAIN_MESSAGE);

                        //生成会议既要文件
                       List<String> stringList= getAllFile(file+"\\"+str ,false);
                       String content="";
                       for (String  path:stringList) {
                           if(path.contains(".pcm") || path.contains("wav")|| path.contains("mp3")){
                             if(standard(path).get("code").equals("200")){
                                 content+= standard(path).get("result")+"\n";
                             }
                           }
                       }
                       //调用文件上传接口
                       List<String> allFiles= getAllFile(file+"\\"+str ,false);
                       for (String apath: allFiles){
                            System.out.println("----------------------"+apath);
                            upload(apath);
                       }
                       JOptionPane.showMessageDialog(null,"会议既要成已生成,上传服务器中!本地路径为:" +file+"\\"+str);
                   } catch (Exception e) {
                       e.printStackTrace();
                   }
                }
        }
   }




   //党建登录接口地址
    private static String loginUrlPath="http://192.168.3.32:8090/login";

   //党建会议列表接口地址
    private static String getHyUrlPath="http://192.168.3.32:8090/organizelife/meet/list";

    //党建会议文件上传接口地址
    private static String fileUploadPath="http://192.168.3.32:8090/common/upload";

   //调用党建接口 登录列表
    public static String getDangjianLogin() throws IOException {
         //body参数
        String jsonParam="{\"username\" : \"admin\", \"password\" : \"admin123\"," +
                 " \"code\" : \"a1223\"}";
        HttpClient client = HttpClients.createDefault();
        HttpPost request = new HttpPost(loginUrlPath);
        // 设置文件类型:
        request.setHeader("Content-Type", "application/json;charset=UTF-8");
        //传参
        StringEntity se = new StringEntity(jsonParam);
        se.setContentType("text/json");
        request.setEntity(se);
        HttpResponse response = client.execute(request);
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity, "UTF-8");
        return result;
    }

    //调用党建接口 获取会议列表
    public static String getHy(Integer pageSize,Integer pageNum,String token) throws IOException {
        HttpClient client = HttpClients.createDefault();
        HttpGet request = new HttpGet(getHyUrlPath+"?pageSize="+pageSize+"&pageNum="+pageNum);
        // 设置文件类型:
        request.setHeader("Authorization", token);
        //传参
        HttpResponse response = client.execute(request);
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity, "UTF-8");
        return result;
    }

    /**
    * *
    * 获取会议列表
    * */
    private static List<OgMeet> getMeets(Integer pageSize,Integer pageNum) throws IOException {
          List<OgMeet> ogMeets=new ArrayList<>();
          JSONObject jsonObject= (JSONObject) JSONObject.parse(getDangjianLogin());
          System.out.println("jsonObject=================="+jsonObject);
          if(jsonObject.get("code").equals(200)){
             System.out.println("token===================="+jsonObject.get("token"));
             String sss=  getHy(pageSize,pageNum,jsonObject.get("token").toString());
             JSONObject json= (JSONObject) JSONObject.parse(sss);
             String xx= String.valueOf(json.get("rows"));
             JSONArray jsonArray = (JSONArray) JSONArray.parse(xx);
             for (Object object:jsonArray) {
                 JSONObject js= (JSONObject) JSONObject.parse(String.valueOf(object));
                 OgMeet ogMeet=new OgMeet();
                 ogMeet.setMeetId(js.get("meetId").toString());
                 ogMeet.setMeetName((String)js.get("meetName"));
                 ogMeet.setStartTime((String)js.get("startTime"));
                 ogMeet.setEndsTime((String)js.get("endsTime"));
                 ogMeets.add(ogMeet);
             }
          }
          return  ogMeets;
    }


    //调用党建接口 上传
    public static String upload(String filepath) throws IOException {
        HttpClient client = HttpClients.createDefault();
        HttpPost request = new HttpPost(fileUploadPath);
        // 设置文件类型:

        File file = new File(filepath);
        MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
        multipartEntityBuilder.addBinaryBody("file",file);
        //multipartEntityBuilder.addPart("comment", new StringBody("This is comment", ContentType.TEXT_PLAIN));
        multipartEntityBuilder.addTextBody("comment", "this is comment");
        HttpEntity httpEntity = multipartEntityBuilder.build();
        request.setEntity(httpEntity);

        //传参
        HttpResponse response = client.execute(request);
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity, "UTF-8");
        return result;
    }





    /**
     * 注意:同时只能执行一个 示例
     *
     * @param args a
     * @throws InterruptedException e
     */
     public static void main(String[] args) throws Exception {
    //  getMeets(99999,1);
        new NumFrame().setVisible(true);
        // 示例-1:标准用法
        /*String file = "C:\\Users\\chenjiaxing\\Desktop\\bs\\save";
            //生成会议既要文件
          String  hyid="2021";
        List<String> stringList= getAllFile(file+"\\"+hyid ,false);
        for (String  path:stringList) {
               if(path.contains(".pcm") || path.contains("wav")){
                 standard(path);
               }
         }*/

        // 示例-2:使用扩展业务参数
        //businessExtraParams();

        // 示例-3:使用网络代理
        //netProxy();

        // 示例-4:使用性能调优参数
        //performance();
    }

}

第二、OgMeet,自定义的会议对象实体类,没什么好说的

package com.jsbs.fxffjcpt.utils.LuyinHy.sdkTurn;


import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

import java.util.Date;

/**
 * 组织生活-会议对象 og_meet
 * 
 * @author Donfei
 * @date 2021-04-23
 */
public class OgMeet extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** 会议id */
    private String meetId;

    /** 会议名称 */
    private String meetName;

    /** 会议开始时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private String startTime;

    /** 会议结束时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private String endsTime;

    public String getMeetId() {
        return meetId;
    }

    public void setMeetId(String meetId) {
        this.meetId = meetId;
    }

    public String getMeetName() {
        return meetName;
    }

    public void setMeetName(String meetName) {
        this.meetName = meetName;
    }

    public String getStartTime() {
        return startTime;
    }

    public void setStartTime(String startTime) {
        this.startTime = startTime;
    }

    public String getEndsTime() {
        return endsTime;
    }

    public void setEndsTime(String endsTime) {
        this.endsTime = endsTime;
    }
}

第三、自定义的ResDemo 科大讯飞实体类,没什么好说的。

package com.jsbs.fxffjcpt.utils.LuyinHy.sdkTurn;


/***
 * 构造科大讯飞接口返回的实体类
 *
 * */
public class ResDemo {
 private String bg;
 private String ed;
 private String onebest;
 private String speaker;

    public String getBg() {
        return bg;
    }

    public void setBg(String bg) {
        this.bg = bg;
    }

    public String getEd() {
        return ed;
    }

    public void setEd(String ed) {
        this.ed = ed;
    }

    public String getOnebest() {
        return onebest;
    }

    public void setOnebest(String onebest) {
        this.onebest = onebest;
    }

    public String getSpeaker() {
        return speaker;
    }

    public void setSpeaker(String speaker) {
        this.speaker = speaker;
    }
}

第四、Luyin,关键的录音方法,调用本地电脑的麦克风,保存录音文件功能

package com.jsbs.fxffjcpt.utils.LuyinHy;

import org.springframework.stereotype.Component;

import javax.sound.sampled.*;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author admin_70
 */
@Component
public class Luyin {
    private static final long serialVersionUID = 1L;
    private static AudioFormat audioFormat;
    private static TargetDataLine targetDataLine;
    private static long starttime;
    private static String filepath= "C:\\Users\\chenjiaxing\\Desktop\\bs\\save\\";


    public static void main(String args[]) {
       // new Luyin();
    }


    /***停止录音*/
    public void stopLuyin(){
    	targetDataLine.stop();
    	targetDataLine.close();
    	System.out.println("---------停止录音----------录音了"+(System.currentTimeMillis()-starttime)/1000+"秒!");
	}


    /***开启录音线程*/
    public Map captureAudio(String hyid){
		Map<String,String> resultMap=new HashMap<>();
    	//随机文件名
		Date date = new Date(System.currentTimeMillis());
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
		String fileName = simpleDateFormat.format(date);
	   try {
			System.out.println("---------------开启录音线程--------------------");
			starttime = System.currentTimeMillis();
			audioFormat = getAudioFormat();//构造具有线性 PCM 编码和给定参数的 AudioFormat。
			DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, audioFormat);
					//根据指定信息构造数据行的信息对象,这些信息包括单个音频格式。此构造方法通常由应用程序用于描述所需的行。
					//lineClass - 该信息对象所描述的数据行的类
					//format - 所需的格式
			targetDataLine = (TargetDataLine) AudioSystem.getLine(dataLineInfo);
					//如果请求 DataLine,且 info 是 DataLine.Info 的实例(至少指定一种完全限定的音频格式),
					//上一个数据行将用作返回的 DataLine 的默认格式。

			//开启线程
			new CaptureThread(hyid,fileName).start();
			resultMap.put("code","200");
			resultMap.put("result",fileName);
		} catch (Exception e){
			e.printStackTrace();
			resultMap.put("code","400");
			resultMap.put("result",e.getMessage());
		}
		return resultMap;
    }

    private AudioFormat getAudioFormat() {
		float sampleRate = 8000F;
		// 8000,11025,16000,22050,44100 采样率
		int sampleSizeInBits = 16;
		// 8,16 每个样本中的位数
		int channels = 2;
		// 1,2 信道数(单声道为 1,立体声为 2,等等)
		boolean signed = true;
		// true,false
		boolean bigEndian = false;
		// true,false 指示是以 big-endian 顺序还是以 little-endian 顺序存储音频数据。
		return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,
				bigEndian);//构造具有线性 PCM 编码和给定参数的 AudioFormat。
	}

    public class CaptureThread extends Thread {

    	private String hyid;

    	private String fileName;

    	public CaptureThread(String hyid,String fileName)
		{
			this.hyid = hyid;
			this.fileName=fileName;
		}

		public void run() {
			//指定的文件类型
			AudioFileFormat.Type  fileType = AudioFileFormat.Type.WAVE;

			 //设置文件夹扩展名
			String fName = filepath+hyid;
			 // 输出的文件流
			File sf=new File(fName);
			if(!sf.exists()){
				sf.mkdirs();
			}

			File audioFile=new File(sf.getPath()+"\\"+fileName+".wav");

			//根据选择的单选按钮。
			try {
				targetDataLine.open(audioFormat);
				//format - 所需音频格式
				targetDataLine.start();
				//当开始音频捕获或回放时,生成 START 事件。
				AudioSystem.write(new AudioInputStream(targetDataLine),fileType, audioFile);
				//new AudioInputStream(TargetDataLine line):构造从指示的目标数据行读取数据的音频输入流。该流的格式与目标数据行的格式相同,line - 此流从中获得数据的目标数据行。
				//stream - 包含要写入文件的音频数据的音频输入流
				//fileType - 要写入的音频文件的种类
				//out - 应将文件数据写入其中的外部文件
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

第五、TxtWriteUtil,txt文件流保存,用于保存语音转写后的会议纪要。

package com.jsbs.fxffjcpt.utils.LuyinHy;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class TxtWriteUtil {

    public static void main(String[] args) {
        String content="哎哎哎111222";
        //write(content);
    }


    public static void write(String path,String content){
        //替换全路径
        String filepath="";
        if(path.contains(".wav")){
           filepath= path.replace("wav","txt");
        }else if(path.contains(".pcm")){
           filepath= path.replace("pcm","txt");
        }else if(path.contains(".mp3")){
           filepath= path.replace("mp3","txt");
        }
        //*************************写入************
        try {
             // 输出的文件流
            File sf=new File(filepath);
            if(!sf.exists()){
                sf.createNewFile();
            }
            FileWriter fw = new FileWriter(sf);
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(content);

            System.out.println("写入---------"+content);
            bw.flush();
            bw.close();
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

第六、语音转写sdk,maven配置,这里的sdk需要放到resources目录下,自定义配置

    <!--语音转写 SDK-->
    <dependency>
        <groupId>com.iflytek.msp.lfasr</groupId>
        <artifactId>lfasr-sdk</artifactId>
        <version>3.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/src/main/resources/lib/lfasr-sdk-3.0.1.jar</systemPath>
    </dependency>
     <!--第三方依赖包-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.67</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpmime</artifactId>
        <version>4.5</version>
    </dependency>`

如此便可实现录音以及会议既要功能,代码中有些是用于调用别人接口联调的,可能会出现异常,仅供参考。资源下载:https://download.csdn.net/download/weixin_43832166/19932122

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拉登的小行星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值