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 = ""; //注册后你自己的appidprivate static final String SECRET_KEY = "";   //注册后你自己SECRET_KEY //本地文件保存地址static String file = "C:\\Users\\chenjiaxing\\Desktop\\bs\\save";@Autowiredprivate 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);//关闭后退出}@Overridepublic 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,falseboolean 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/47691.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于语音会议自动记录的大概设计思路

关于语音会议的大概设计草图如下&#xff1a; 根据流程图可以看出&#xff0c;我一共分了六个模块分别命名为&#xff1a; A_preprocessor&#xff08;预处理器&#xff09;&#xff1a;用来对音频进行预处理A_file_store&#xff08;文件存储&#xff09;&#xff1a;用来管理…

还在找会议纪要录音转文字软件哪个好?

音频转文字是一项非常便利和实用的技术。无论是学习教育、会议记录、新闻传播还是法律领域&#xff0c;都可以通过使用该技术更好地记录和整理相关内容&#xff0c;提高效率和准确度。那么你知道录音文件转文字软件哪个好吗&#xff1f;这篇文章给你推荐三款非常好用的录音文件…

语音识别会议级别

人工智能的会议没有专注于语音领域的,语音算是ai的一个实际应用方向吧,所以也能投ai的会议和期刊 列一下自然语言处理(NLP)这个小方向的&#xff1a; 会议(C): EMNLP (Empirical Methods in Natural Language Processing) A EACL (Annual Conference of the Eu…

【实战】一文讲透ChatGPT最新功能Custom Instructions

收录于 AI实战教程 合集 嗨&#xff0c;又见面啦&#xff01;&#x1f60e; 我们来更一篇最近大家非常关心的&#xff0c;但很多小伙伴找不到入口&#xff0c;和落地教程的&#xff0c;ChatGPT的最新功能Custom Instructions的实战贴~ 北京时间2023-07-21&#xff0c;Openai…

外贸网站最新的英文在线跟踪聊天咨询管理软件

十几年前&#xff0c;有了解外贸英文网站上的在线跟踪聊天咨询及简单管理软件&#xff1b;当时觉得只需要Email就可以了。老外必竟常用Email&#xff0c;网页上留Email, 老外就可以联系到我们。 当时也出现很多英文版的在线跟踪聊天咨询软件&#xff0c;且都是免费提供&#xf…

SAP-MM-内向外向交货单

1、内向&外向交货单概念 外向交货&#xff08;outbound delivery&#xff09;是用在客户与企业之间的交货单&#xff0c;而内向交货&#xff08;inbound delivery&#xff09;则是用在供应商与企业之间的交货单&#xff1b;换言之&#xff0c;外向交货多用于SD 模块&#…

SAP 内向交货单介绍

SAP 内向交货单介绍 外向交货&#xff08;outbound delivery&#xff09;是用在顾客与企业之间的交货单&#xff0c;而内向交货&#xff08;inbound delivery&#xff09;则是用在供应商与企业之间的交货单&#xff1b;换言之&#xff0c;外向交货多用于SD 模块&#xff0c;而…

十个数字,看懂AI现状

这十个代表性数字从不同的角度切入&#xff0c;揭示了AI的发展现状和潜力。 AI作为当今世界的热门话题&#xff0c;正在引领着我们进入一种全新的智能时代。但是&#xff0c;很多人对AI的认识还停留在表面&#xff0c;并不了解AI是怎样逐渐渗透到我们的生活和工作中&#xff0c…

BFT 最前线 | 谷歌举办 I/O 23 发布会,对标必应,百度搜索小范围公测对话功能,盖茨称AI利大于弊

文 | BFT机器人 01 谷歌举办 I/O 23 发布会&#xff0c;以 AI 为核心发布一系列新工具 北京时间 5 月 11 日凌晨&#xff0c;谷歌举办了今年的 Google I/O 开发者大会。比起去年&#xff0c;强调「整合全球信息&#xff0c;使人人都能从访问中受益」的使命&#xff0c;谷歌 CEO…

针对小度在家的设备分析(以1C为例,非破解)

概述 语音类的机器人已经接触和分析了很多了&#xff0c;但百度出的类似产品没有写过&#xff01; 主要是没有机会接触到实体的机器&#xff0c;大写的尴尬。 因对接的需要&#xff0c;特申请了一台&#xff0c;那就借此机会把玩一下吧。 拆机的部分请移步他处&#xff0c;…

【两天搞定小米商城】【第四步】小米商城之左边导航和右边轮播图部分

效果图&#xff1a; &#xff08;图片文字方面还是老风格&#xff0c;重复重复再重复&#xff0c;小伙伴们也可以尝试把官网的内容如实填充~&#xff09; HTML: <!-- banner开始 --><div class"banner"><div class"wrap"><div class…

“小度小度”开启AI硬件的“量贩”时代

2020年我们经历了很多事情&#xff0c;而这些经历正在深刻影响到众多科技市场&#xff0c;甚至作用于AI产业的底层规律。 例如说&#xff0c;疫情中AI抗疫的身影让这门技术成为社会明星&#xff1b;更多宅在家里的闲暇时间让我们更喜欢琢磨硬件和产品&#xff1b;对家人的惦念&…

小米商城左侧菜单布局和效果实现(分析+代码)

目录 效果展示 结构分析 菜单栏 内容盒子 JS实现 总结 效果展示 左边菜单栏&#xff0c;鼠标经过菜单栏&#xff0c;对应的背景颜色会发生改变。右边内容盒子&#xff0c;有一个边框&#xff0c;宽度会随着显示的内容的而变化。鼠标经过左边的菜单栏&#xff0c;右边对应…

web端 小米商城网站总结

一 小米商城页面的分析 目前市面上主流的布局为float布局 , 本人通过flex布局实现了一遍 其中轮播图使用了swiper插件 图标使用了iconfont 尽可能的不使用定位 此为自我规划的结构分析 , 如图所示 二 小米商城搭建的细节 1 清楚整个页面的整体布局&#xff0c;先整体再局部…

vue+elementui实现app布局小米商城,样式美观大方,功能完整

目录 一、项目效果在线预览 二、效果图 1.首页效果图 2.分类&#xff0c;动态分类商品数据根据所属分类动态切换 3.购物车&#xff0c;动态添加购物车&#xff08;增、删、改、查&#xff09; 4.我的 5.登录注册 6.商品详情 7.搜索&#xff08;动态模糊搜索、搜索历史…

分析小米商城左侧菜单的布局和效果实现

小米左侧菜单如图&#xff1a; 也就是说&#xff0c;在没有点击左侧菜单的时候&#xff0c;背景是一个轮播图&#xff0c;一旦点击了左侧菜单&#xff0c;或者说鼠标在左侧菜单上滑动&#xff0c;那么就会触发左侧菜单的动画演示&#xff0c;这次就是来分析动画演示的具体是怎么…

前端项目 仿小米商城

这是本人入手前端以来第一个项目&#xff0c;不算简单也不算难都是一些很基础但在HTML和CSS中算是比较核心的东西&#xff0c;比如CSS中的定位&#xff0c;各种选择器都有所涉及。这次做的是一个商城首页&#xff0c;像这种类型的有很多都可以拿来练手&#xff0c;望大家指教&a…

百度设置小度机器人出现

一篇小干货&#xff0c;在浏览器中打开百度搜索 https://www.baidu.com/ 找到右上角设置按钮&#xff0c;点开 选择搜索设置&#xff0c;出现如图&#xff0c;我用的是firefox&#xff0c;不过浏览器不重要滴&#xff0c;大家可以用chrome或者其他都行 如果呢正常登陆了百度账…

小爱(小米),天猫精灵(阿里),小度(百度),小艺(华为)智能家居系统选择

现在的智能家居系统可谓群雄逐鹿,不少人在琳琅满目智能家居产品中选择时候,会陷入纠结,到底选择小米系比较好呢,还是选择阿里系好呢等等。针对此问题,那么现在就简单介绍一下目前主流的四种智能家居系统。 一、分类 首先从分类上,看看各个智能家居系统有什么区别。 1、…

使用微软New Bing Chat GPT-4生成AI图像的技巧

在聊天的创意模式中&#xff0c;你现在可以要求Bing为你创建一个全新的图像&#xff0c;只用你的话语。只需说 "为我创建一个图像 "或 "为我绘制一个图像"&#xff0c;最后准确地说出你要找的东西。当你的描述性更强时&#xff0c;Image Creator的效果最好…