当前位置: 首页 > news >正文

JAVA实现麦克风说话同声传译

一、能力与场景说明

同声传译,又称同步口译或同声翻译,是一种专业的口译形式,指的是在讲话者发言时,口译员几乎同时将讲话内容翻译成目标语言。这种翻译方式通常用于国际会议、高级别政治或商业会谈、研讨会和其他需要即时多语言交流的场合。本文是用JAVA调用原生麦克风技术,实现产生音频的同时用麦克风实现边说边翻译成英文的技术。不限制录音时长。

二、同传主调用代码

package main.com.iflytek;import com.google.gson.Gson;
import com.google.gson.JsonObject;
import main.com.util.VideoPlayerService;
import okhttp3.*;
import main.com.util.AuthUtils;
import main.com.util.PcmToWav;import javax.sound.sampled.AudioInputStream;
import java.io.*;
import java.util.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;/*** 1、同声传译接口,可以将音频流实时翻译为不同语种的文本,并输对应的音频内容,广泛应用于国际论坛、智能会议、智慧教育、跨国交流等场景。*/
public class SimultaneousTranslationMain extends WebSocketListener {private static String requestUrl = "wss://ws-api.xf-yun.com/v1/private/simult_interpretation";//控制台获取以下信息private static String APPID = "";private static String apiSecret = "";private static String apiKey = "";private static final String domain = "ist_ed_open";private static final String language = "zh_cn";private static final String accent = "mandarin";// 翻译所需参数,从中文-英文private static final String from = "cn"; // 源文件的语言类型private static final String to = "en"; // 目标文件的语言类型// 发声发音人private static final String vcn = "x2_catherine";// 输出音频编码方式 PCMprivate static final String encoding = "raw";// 输入的源音频文件private static final String inputAudioPcm = "input/audio/original.pcm";// 输出的音频与文本文件private static final String outPutPcm = "output/audio/trans.pcm";private static final String outPutWav = "output/audio/trans.wav";private static final String asr_result = "output/text/asr.txt";private static final String trans_result = "output/text/trans.txt";public static final int StatusFirstFrame = 0;public static final int StatusContinueFrame = 1;public static final int StatusLastFrame = 2;public static final Gson gson = new Gson();private static BlockingQueue<String> queue = new LinkedBlockingQueue<>();private static boolean overFlag = false;public static byte[] audioDataByteArray;public static Long ivwStartTime;public static Long ivwEndTime;// 主函数入口public static void main(String[] args) {// 清空文件夹clearDir();Thread thread = new Thread(new videoPlayer());thread.start();// 构建鉴权urlString authUrl = AuthUtils.assembleRequestUrl(requestUrl, apiKey, apiSecret);// System.out.println(authUrl);OkHttpClient client = new OkHttpClient.Builder().build();Request request = new Request.Builder().url(authUrl).build();// System.out.println("url===>" + authUrl);WebSocket webSocket = client.newWebSocket(request, new SimultaneousTranslationMain());try {//打开音频文件int frameSize = 1280; // 每一帧音频的大小 1280/40msint interval = 40;int status = 0;  // 音频的状态int count = 0;Constants.IVW_ASR_TARGET_DATA_LINE.open(Constants.IVW_ASR_AUDIO_FORMAT);Constants.IVW_ASR_TARGET_DATA_LINE.start();ivwStartTime = System.currentTimeMillis(); // 更新开始时间// 发送音频end:while (true) {//int len = fs.read(buffer);audioDataByteArray = new byte[Constants.IVW_FRAME_SIZE];int len = new AudioInputStream(Constants.IVW_ASR_TARGET_DATA_LINE).read(audioDataByteArray);ivwEndTime = System.currentTimeMillis();// System.out.println(ivwEndTime - ivwStartTime);if (len < frameSize || (ivwEndTime - ivwStartTime) > 60000) { // 大于一分钟自动停止status = StatusLastFrame;  //文件读完,改变status 为 2}switch (status) {case StatusFirstFrame:   // 第一帧音频status = 0JsonObject frame = new JsonObject();JsonObject header = new JsonObject();  //第一帧必须发送JsonObject parameter = new JsonObject();JsonObject ist = new JsonObject();JsonObject streamtrans = new JsonObject();JsonObject tts = new JsonObject();JsonObject tts_results = new JsonObject();JsonObject payload = new JsonObject();JsonObject data = new JsonObject();// 填充headerheader.addProperty("app_id", APPID);//appid 必须带上,只需第一帧发送header.addProperty("status", 0);// 填充parameter// ist参数填充ist.addProperty("eos", 600000);ist.addProperty("vto", 15000);ist.addProperty("accent", accent);ist.addProperty("language", language);ist.addProperty("language_type", 1);ist.addProperty("domain", domain);// streamtrans参数填充streamtrans.addProperty("from", from);streamtrans.addProperty("to", to);// tts参数填充tts.addProperty("vcn", vcn);tts_results.addProperty("encoding", "raw");tts_results.addProperty("sample_rate", 16000);tts_results.addProperty("channels", 1);tts_results.addProperty("bit_depth", 16);tts.add("tts_results", tts_results);parameter.add("ist", ist);parameter.add("streamtrans", streamtrans);parameter.add("tts", tts);//填充payloaddata.addProperty("audio", Base64.getEncoder().encodeToString(Arrays.copyOf(audioDataByteArray, len)));data.addProperty("encoding", encoding);data.addProperty("sample_rate", 16000);data.addProperty("status", status);data.addProperty("seq", count);payload.add("data", data);//填充frameframe.add("header", header);frame.add("parameter", parameter);frame.add("payload", payload);webSocket.send(frame.toString());status = StatusContinueFrame;  // 发送完第一帧改变status 为 1System.out.println("send first 请开始说出中文:");break;case StatusContinueFrame:  //中间帧status = 1JsonObject contineuFrame = new JsonObject();JsonObject header1 = new JsonObject();JsonObject payload1 = new JsonObject();JsonObject data1 = new JsonObject();// 填充headheader1.addProperty("status", 1);header1.addProperty("app_id", APPID);//填充payloaddata1.addProperty("audio", Base64.getEncoder().encodeToString(Arrays.copyOf(audioDataByteArray, len)));data1.addProperty("encoding", encoding);data1.addProperty("sample_rate", 16000);data1.addProperty("status", status);data1.addProperty("seq", count);payload1.add("data", data1);contineuFrame.add("header", header1);contineuFrame.add("payload", payload1);webSocket.send(contineuFrame.toString());//  System.out.println("send continue");break;case StatusLastFrame:    // 最后一帧音频status = 2 ,标志音频发送结束String audio = "";if (len != 0) {audio = Base64.getEncoder().encodeToString(Arrays.copyOf(audioDataByteArray, len));}JsonObject lastFrame = new JsonObject();JsonObject header2 = new JsonObject();JsonObject payload2 = new JsonObject();JsonObject data2 = new JsonObject();// 填充headheader2.addProperty("status", 2);header2.addProperty("app_id", APPID);//填充payloaddata2.addProperty("audio", audio);data2.addProperty("encoding", encoding);data2.addProperty("sample_rate", 16000);data2.addProperty("status", status);data2.addProperty("seq", count);payload2.add("data", data2);lastFrame.add("header", header2);lastFrame.add("payload", payload2);webSocket.send(lastFrame.toString());System.out.println("send last 中文讲话结束!");break end;}count++;Thread.sleep(interval); //模拟音频采样延时}System.out.println("all data is send 所有音频数据发送完毕!");} catch (Exception e) {e.printStackTrace();}}@Overridepublic void onOpen(WebSocket webSocket, Response response) {super.onOpen(webSocket, response);// System.out.println("open connection");}// 客户端接收服务端的消息并处理@Overridepublic void onMessage(WebSocket webSocket, String text) {super.onMessage(webSocket, text);ResponseData resp = gson.fromJson(text, ResponseData.class);// System.err.println(text);if (resp != null) {if (resp.header.code != 0) {System.out.println("error=>" + resp.header.message + " sid=" + resp.header.sid + " 错误码=" + resp.header.code);return;}if (resp.header != null) {if (resp.header.code == 0) {// System.out.println(text);if (resp.payload != null) {// 接收到的识别结果写到文本if (resp.payload.recognition_results != null) {String s1 = resp.payload.recognition_results.text;byte[] trans1 = Base64.getDecoder().decode(s1);String res1 = new String(trans1);try {writeStringToFile(res1, asr_result);} catch (IOException e) {e.printStackTrace();}}// 接收到的翻译结果写到文本if (resp.payload.streamtrans_results != null) {String s2 = resp.payload.streamtrans_results.text;byte[] trans = Base64.getDecoder().decode(s2);String res = new String(trans);try {writeStringToFile(res, trans_result);} catch (IOException e) {e.printStackTrace();}}// 把接收到的音频流合成PCMif (resp.payload.tts_results != null) {String s = resp.payload.tts_results.audio;queue.add(s);// System.err.println("执行一次");try {writeBytesToFile(Base64.getDecoder().decode(s), outPutPcm);} catch (IOException e) {e.printStackTrace();}}}}if (resp.header.status == 2) {// todo  resp.data.status ==2 说明数据全部返回完毕,可以关闭连接,释放资源System.out.println("session end  同声传译返回完毕!");System.out.println("本次请求的sid==》 " + resp.header.sid);System.out.println("数据处理完毕,等待实时转译结束!");overFlag = true;try {// 流程完毕后,输出音频文件,把PCM转换为WAVPcmToWav.convertAudioFiles(outPutPcm, outPutWav);} catch (IOException e) {e.printStackTrace();}webSocket.close(1000, "");if (queue.size() == 0) {System.exit(0);}} else {// todo 根据返回的数据处理}}}}@Overridepublic void onFailure(WebSocket webSocket, Throwable t, Response response) {super.onFailure(webSocket, t, response);System.out.println(t.getMessage());try {System.out.println("错误信息:" + response);if (response == null) {return;}System.out.println("错误信息" + response.code());System.out.println(response.body().string());} catch (IOException e) {e.printStackTrace();}}// 实时播放音频流方法static class videoPlayer implements Runnable {@Overridepublic void run() {while (true) {if (overFlag && queue.size() == 0) {break;}if (queue.size() != 0) {String poll = queue.poll();VideoPlayerService.videoPlay(Base64.getDecoder().decode(poll));}}System.out.println("实时转译结束!!!");System.exit(1000);}}// 清空已存在文件public static void clearDir() {String path = "output";File file = new File(path);for (File f : file.listFiles()) {if (f.isDirectory()) {for (File subFile : f.listFiles()) {if (subFile != null) {subFile.delete();}}}}System.out.println("结果集初始化成功------");}// 写入文件public static void writeBytesToFile(byte[] bs, String path) throws IOException {OutputStream out = new FileOutputStream(path, true);InputStream is = new ByteArrayInputStream(bs);byte[] buff = new byte[1024];int len = 0;while ((len = is.read(buff)) != -1) {out.write(buff, 0, len);}is.close();out.close();}// 写入文件public static void writeStringToFile(String content, String path) throws IOException {OutputStream out = new FileOutputStream(path, true);out.write(content.getBytes());out.close();}// JSON解析public static class ResponseData {header header;payload payload;}public static class payload {streamtrans_results streamtrans_results;recognition_results recognition_results;tts_results tts_results;@Overridepublic String toString() {return "payload{" + "streamtrans_results=" + streamtrans_results + ", recognition_results=" + recognition_results + ", tts_results=" + tts_results + '}';}}public static class header {int code;String message;String sid;int status;}public static class recognition_results {String encoding;String format;String text;int status;@Overridepublic String toString() {return "recognition_results{" + "encoding='" + encoding + '\'' + ", format='" + format + '\'' + ", text='" + text + '\'' + ", status=" + status + '}';}}public static class streamtrans_results {String encoding;String format;String text;int status;@Overridepublic String toString() {return "streamtrans_results{" + "encoding='" + encoding + '\'' + ", format='" + format + '\'' + ", text='" + text + '\'' + ", status=" + status + '}';}}public static class tts_results {String encoding;String audio;int sample_rate;int channels;int bit_depth;int status;int seq;int frame_size;@Overridepublic String toString() {return "tts_results{" + "encoding='" + encoding + '\'' + ", audio='" + audio + '\'' + ", sample_rate=" + sample_rate + ", channels=" + channels + ", bit_depth=" + bit_depth + ", status=" + status + ", seq=" + seq + ", frame_size=" + frame_size + '}';}}
}

三、鉴权代码

package main.com.util;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;/*** @Author:sjliu7* 鉴权使用* @Date:2019/7/31 15:23*/
public class AuthUtils {private static final String serviceId = "simult_interpretation";/*** 生成用于鉴权的URL,websocket 接口* @param requestUrl* @param apiKey* @param apiSecret* @return final requestUrl*/public static String assembleRequestUrl(String requestUrl, String apiKey, String apiSecret) {URL url = null;String  httpRequestUrl = requestUrl.replace("ws://", "http://").replace("wss://","https://" );try {url = new URL(httpRequestUrl);SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);// format.setTimeZone(TimeZone.getTimeZone("UTC"));format.setTimeZone(TimeZone.getTimeZone("GMT"));String date = format.format(new Date());// date = "Mon, 13 Dec 2021 03:05:05 GMT";String host = url.getHost();StringBuilder builder = new StringBuilder("host: ").append(host).append("\n").//append("date: ").append(date).append("\n").//append("GET ").append(url.getPath()).append(" HTTP/1.1");// System.out.println(builder);Charset charset = Charset.forName("UTF-8");Mac mac = Mac.getInstance("hmacsha256");// System.out.println(builder.toString());SecretKeySpec spec = new SecretKeySpec(apiSecret.getBytes(charset), "hmacsha256");mac.init(spec);byte[] hexDigits = mac.doFinal(builder.toString().getBytes(charset));String sha = Base64.getEncoder().encodeToString(hexDigits);// System.out.println(sha);String authorization = String.format("api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"", apiKey, "hmac-sha256", "host date request-line", sha);String authBase = Base64.getEncoder().encodeToString(authorization.getBytes(charset));// System.out.println(authBase);// System.out.println(String.format("%s?authorization=%s&host=%s&date=%s&serviceId=%s", requestUrl, URLEncoder.encode(authBase), URLEncoder.encode(host), URLEncoder.encode(date),serviceId));return String.format("%s?authorization=%s&host=%s&date=%s&serviceId=%s", requestUrl, URLEncoder.encode(authBase), URLEncoder.encode(host), URLEncoder.encode(date),serviceId);} catch (Exception e) {throw new RuntimeException("assemble requestUrl error:"+e.getMessage());}}
}

四、PCM转成WAV

package main.com.util;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class PcmToWav {/*** @param src    待转换文件路径* @param target 目标文件路径* @throws IOException 抛出异常*/public static void convertAudioFiles(String src, String target) throws IOException {FileInputStream fis = new FileInputStream(src);FileOutputStream fos = new FileOutputStream(target);//计算长度byte[] buf = new byte[1024 * 4];int size = fis.read(buf);int PCMSize = 0;while (size != -1) {PCMSize += size;size = fis.read(buf);}fis.close();//填入参数,比特率等等。这里用的是16位单声道 8000 hzWaveHeader header = new WaveHeader();//长度字段 = 内容的大小(PCMSize) + 头部字段的大小(不包括前面4字节的标识符RIFF以及fileLength本身的4字节)header.fileLength = PCMSize + (44 - 8);header.FmtHdrLeth = 16;header.BitsPerSample = 16;header.Channels = 2;header.FormatTag = 0x0001;header.SamplesPerSec = 8000;header.BlockAlign = (short) (header.Channels * header.BitsPerSample / 8);header.AvgBytesPerSec = header.BlockAlign * header.SamplesPerSec;header.DataHdrLeth = PCMSize;byte[] h = header.getHeader();assert h.length == 44; //WAV标准,头部应该是44字节fos.write(h, 0, h.length);fis = new FileInputStream(src);size = fis.read(buf);while (size != -1) {fos.write(buf, 0, size);size = fis.read(buf);}fis.close();fos.close();System.out.println("Convert OK!");}
}

五、音频播放

package main.com.util;
import javax.sound.sampled.*;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class VideoPlayerService {public static SourceDataLine auline = null;static {AudioFormat audioFormat=new AudioFormat(16000F, 16, 1,true,false);DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);try {auline = (SourceDataLine) AudioSystem.getLine(info);auline.open(audioFormat);auline.start();} catch (LineUnavailableException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}public static byte[] byteArray(String file) throws IOException {BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));ByteArrayOutputStream out = new ByteArrayOutputStream(1024);System.out.println("Available bytes:" + in.available());byte[] temp = new byte[1024];int size = 0;while ((size = in.read(temp)) != -1) {out.write(temp, 0, size);}in.close();byte[] content = out.toByteArray();return content;}public static void videoPlay(byte[] video){auline.write(video,0,video.length);}
}

六、WAV头添加

package main.com.util;import java.io.ByteArrayOutputStream;
import java.io.IOException;public class WaveHeader {public final char fileID[] = {'R', 'I', 'F', 'F'};public int fileLength;public char wavTag[] = {'W', 'A', 'V', 'E'};public char FmtHdrID[] = {'f', 'm', 't', ' '};public int FmtHdrLeth;public short FormatTag;public short Channels;public int SamplesPerSec;public int AvgBytesPerSec;public short BlockAlign;public short BitsPerSample;public char DataHdrID[] = {'d', 'a', 't', 'a'};public int DataHdrLeth;public byte[] getHeader() throws IOException {ByteArrayOutputStream bos = new ByteArrayOutputStream();WriteChar(bos, fileID);WriteInt(bos, fileLength);WriteChar(bos, wavTag);WriteChar(bos, FmtHdrID);WriteInt(bos, FmtHdrLeth);WriteShort(bos, FormatTag);WriteShort(bos, Channels);WriteInt(bos, SamplesPerSec);WriteInt(bos, AvgBytesPerSec);WriteShort(bos, BlockAlign);WriteShort(bos, BitsPerSample);WriteChar(bos, DataHdrID);WriteInt(bos, DataHdrLeth);bos.flush();byte[] r = bos.toByteArray();bos.close();return r;}private void WriteShort(ByteArrayOutputStream bos, int s) throws IOException {byte[] mybyte = new byte[2];mybyte[1] = (byte) ((s << 16) >> 24);mybyte[0] = (byte) ((s << 24) >> 24);bos.write(mybyte);}private void WriteInt(ByteArrayOutputStream bos, int n) throws IOException {byte[] buf = new byte[4];buf[3] = (byte) (n >> 24);buf[2] = (byte) ((n << 8) >> 24);buf[1] = (byte) ((n << 16) >> 24);buf[0] = (byte) ((n << 24) >> 24);bos.write(buf);}private void WriteChar(ByteArrayOutputStream bos, char[] id) {for (char c : id) {bos.write(c);}}
}

相关文章:

JAVA实现麦克风说话同声传译

一、能力与场景说明 同声传译&#xff0c;又称同步口译或同声翻译&#xff0c;是一种专业的口译形式&#xff0c;指的是在讲话者发言时&#xff0c;口译员几乎同时将讲话内容翻译成目标语言。这种翻译方式通常用于国际会议、高级别政治或商业会谈、研讨会和其他需要即时多语言…...

LabVIEW与PLC通讯方式及比较

LabVIEW与PLC之间的通讯方式多样&#xff0c;包括使用MODBUS协议、OPC&#xff08;OLE for Process Control&#xff09;、Ethernet/IP以及串口通讯等。这些通讯方式各有特点&#xff0c;选择合适的通讯方式可以提高系统的效率和稳定性。以下将详细介绍每种通讯方式的特点、优点…...

2024/6/30 英语每日一段

Years of economic and political turbulence have brought stagnation.“In a world where there is more risk and uncertainty, people become reluctant to voluntarily move jobs and find better jobs,” says Manning. At the same time, businesses have cut back on i…...

Postman接口测试工具的原理及应用详解(五)

本系列文章简介&#xff1a; 在当今软件开发的世界中&#xff0c;接口测试作为保证软件质量的重要一环&#xff0c;其重要性不言而喻。随着前后端分离开发模式的普及&#xff0c;接口测试已成为连接前后端开发的桥梁&#xff0c;确保前后端之间的数据交互准确无误。在这样的背景…...

208.贪心算法:买卖股票的最佳时机||(力扣)

代码解决 class Solution { public:int maxProfit(vector<int>& prices) {int result 0; // 初始化结果为0&#xff0c;表示初始利润为0// 从第二天开始遍历价格数组for (int i 1; i < prices.size(); i) {// 如果当天价格比前一天价格高&#xff0c;则将差价加…...

【论文阅读】伸缩密度比估计:Telescoping Density-Ratio Estimation

文章目录 一、文章概览&#xff08;一&#xff09;问题提出&#xff08;二&#xff09;文章工作 二、判别比估计和密度鸿沟问题三、伸缩密度比估计&#xff08;一&#xff09;核心思想&#xff08;二&#xff09;路标创建&#xff08;三&#xff09;桥梁构建&#xff08;四&…...

MongoDB数据库 MQL (MongoDB Query Language)语句大全

基本命令 连接到 MongoDB mongo显示所有数据库 show dbs选择&#xff08;或创建&#xff09;数据库 db集合操作 显示当前数据库中的所有集合 show collections创建集合 db.createCollection("myCollection")删除集合 db.myCollection.drop()文档操作 插入文…...

Java代码基础算法练习-计算平均身高-2024.07.02

任务描述&#xff1a; n个同学站成一排&#xff0c;求它们的平均身高 解决思路&#xff1a; 输入的学生人数为 for 循环次数&#xff0c;循环中每输入一个值就添加在总数中&#xff0c;循环结束总数除以对应的学生人数得到平均身高 代码示例&#xff1a; package a4_2024_07;…...

BIOS设置与系统分区

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 一BIOS 1破解密码的前提 2B…...

linux的安装程序 与 文件 相关的命令

软件安装卸载命令 软件包介绍软件包命名格式dpkg命令apt-get命令apt-get命令 压缩和解压命令 压缩文件后缀 压缩命令打包和解包命令 tar命令 文件分割命令 split命令 文件操作相关命令 cat命令head命令tail命令more命令less命令管道命令wc 命令grep 命令find 命令cut 命令sort …...

SAP_ABAP相关日语单词

基本概念 1. プログラミング言語 (プログラミングげんご, Puroguramingu gengo) - 编程语言 2. 開発 (かいはつ, Kaihatsu) - 开发 3. システム (システム, Shisutemu) - 系统 4. モジュール (モジュール, Mojūru) - 模块 5. トランザクションコード (トランザクションコード,…...

Python中的除法操作详解

在Python编程中&#xff0c;除法是一个基础但极其重要的算术操作。Python提供了多种除法运算方式&#xff0c;以适应不同的计算需求。以下是对Python中除法操作的全面介绍&#xff0c;包括示例代码。 1. 普通除法 / 普通除法使用/运算符&#xff0c;它返回一个浮点数结果&…...

第1章 人工智能的基础概念与应用导论

亲爱的读者朋友们&#xff0c;你们好&#xff01;欢迎来到这个充满神奇与奥秘的人工智能世界。我知道&#xff0c;对于很多人来说&#xff0c;人工智能&#xff08;AI&#xff09;可能是个既神秘又高大上的词汇&#xff0c;仿佛遥不可及&#xff0c;只存在于科幻电影或者顶级科…...

jenkins api部署时,一直提示pending-Finished waiting

问题&#xff1a; 调用jenkins api部署时&#xff0c;一直提示pending-Finished waiting 解决方案&#xff1a; 这个问题困扰了很久&#xff0c;一直没有思路&#xff0c;后面看到调用jenkinsAPI本身会出现一段提示&#xff0c;pending in the quiet period&#xff0c;通过搜…...

AI在创造还是毁掉音乐之论文

AI在创造还是毁掉音乐&#xff1f; 简介&#xff1a;最近一个月&#xff0c;轮番上线的音乐大模型&#xff0c;一举将素人生产音乐的门槛降到了最低&#xff0c;并掀起了音乐圈会不会被AI彻底颠覆的讨论。短暂的兴奋后&#xff0c;AI产品的版权归属于谁&#xff0c;创意产业要…...

C++ STL容器:序列式容器-数组string,vector,array,bitset

摘要&#xff1a; CC STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;在C编程中的重要性不容忽视&#xff0c;STL提供了一系列容器、迭代器、算法和函数对象&#xff0c;这些组件极大地提高了C程序的开发效率和代码质量。 STL 容器 分为 2 大类 …...

ElementUI样式优化:el-input修改样式、el-table 修改表头样式、斑马格样式、修改滚动条样式、

效果图&#xff1a; 1、改变日期时间组件的字体颜色背景 .form-class ::v-deep .el-date-editor { border: 1px solid #326AFF; background: #04308D !important; } .form-class ::v-deep .el-date-editor.el-input__wrapper { box-shadow: 0 0 0 0px #326AFF inset; } // 输入…...

大数据面试题之Spark(6)

Spark输出文件的个数&#xff0c;如何合并小文件? Spark的driver是怎么驱动作业流程的? Spark SQL的劣势? 介绍下Spark Streaming和Structed Streaming Spark为什么比Hadoop速度快? DAG划分Spark源码实现? Spark Streaming的双流join的过程&#xff0c;怎么做的? …...

SpringSecurity中文文档(Servlet Anonymous Authentication)

Anonymous Authentication Overview 通常认为采用“默认拒绝”立场是良好的安全实践&#xff0c;您明确指定允许的内容并拒绝其他所有内容。定义未经身份验证的用户可以访问的内容是类似的情况&#xff0c;特别是对于 Web 应用程序。许多网站要求用户必须经过身份验证才能访问…...

【Spring Boot 事务管理】

Spring Boot 事务管理 一、Spring Boot中的事务管理1.声明式事务管理Transactional注解基本使用配置选项 2.编程式事务管理TransactionTemplatePlatformTransactionManager 二、Transactional注解深入1.基本使用基本属性 2.传播行为3.隔离级别4.事务超时设置5.回滚规则 三、事务…...

【C++】C++指针在线程中调用与受保护内存空间读取方法

引言 在C的多线程编程中&#xff0c;正确地管理内存和同步访问是确保程序稳定性和安全性的关键。特别是当涉及到指针在线程中的调用时&#xff0c;对受保护内存空间的访问必须谨慎处理&#xff0c;以防止数据竞争、死锁和内存损坏等问题。本文将详细探讨C指针在线程中调用时如何…...

安全隔离上网的有效途径:沙箱

在数字化浪潮日益汹涌的今天&#xff0c;网络安全成为了不可忽视的重要议题。沙箱技术作为一种高效的隔离机制&#xff0c;为企业和个人提供了一种在享受网络便利的同时&#xff0c;保障系统安全的解决方案。本文旨在深入探讨沙箱技术如何做到隔离上网&#xff0c;从而为用户提…...

jenkins下后台运行链接Jenkins服务脚本方法

为了编写一个用于在后台运行 Jenkins agent 的批处理脚本&#xff0c;你可以使用 start 命令来启动 Java 进程并将其设置为在后台运行。以下是一个示例批处理脚本 run_agent.bat&#xff1a; bat echo off setlocalREM Set the path to the Jenkins agent JAR file set AGENT…...

宠物空气净化器哪个品牌性价比高?宠物空气净器Top3品牌推荐

养猫确实给家庭带来了无尽的欢乐&#xff0c;但猫毛无处不在的问题确实让不少猫主人感到头疼。不论是长毛猫还是短毛猫&#xff0c;它们掉落的浮毛飘浮在空气中&#xff0c;不仅影响家居环境的整洁度&#xff0c;还可能成为过敏的源头。因此&#xff0c;如何高效地处理这些猫浮…...

苏州大厂面试题JAVA 面试集

基础知识1、强引用、软引用、弱引用、幻象引用有什么区别?(java基础) 答案参考:https://time.geekbang.org/column/article/6970 2、 对比Hashtable、HashMap、TreeMap有什么不同?(数据结构) 答案参考:https://time.geekbang.org/column/article/8053 3、一个线程调用两次…...

数据库取出来的日期格式是数组格式,序列化日期格式

序列化前&#xff0c;如图所示&#xff1a; 解决方式&#xff0c;序列化日期&#xff08;localdatetime&#xff09;格式 步骤一、添加序列化类 package com.abliner.test.common.configure;import com.alibaba.fastjson.serializer.JSONSerializer; import com.alibaba.fas…...

【Android】创建一个可以在屏幕上拖动的悬浮窗

项目需求 在界面上创建一个悬浮窗&#xff0c;可以自由的移动这个悬浮窗 需求解决 1.添加权限 <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW"/>2.请求权限 从 Android 6.0 (API 23) 开始&#xff0c;应用需要动态请求显示悬浮窗…...

SPI NAND、SD NAND和eMMC对比—MK米客方德

目录 1. 容量: 2.封装类型&#xff1a; 3.速度: 4.性能: 5.寿命: 6. 使用方式: 7. 其他优缺点: 8.常见应用场景: 1. 容量: SPI NAND通常提供从几百MB到几GB的存储容量。 SD NAND的容量覆盖范围比SPI NAND更广&#xff0c;从几GB到几十GB不等。 eMMC的容量范围更大&a…...

“深入解析:YUM仓库、RPM包与源码编译——Linux软件安装方式全面对比“

目录 YUM 仓库安装 概念&#xff1a; 优点&#xff1a; 缺点&#xff1a; RPM 包安装 概念&#xff1a; 优点&#xff1a; 缺点&#xff1a; 源码编译安装 概念&#xff1a; 优点&#xff1a; 缺点&#xff1a; 三者区别 YUM 仓库安装 概念&#xff1a; YUM&…...

中电金信:银行业私有云何去何从

2009年&#xff0c;云计算开始从概念走向实践。在这一年&#xff0c;Gartner在预测2010十大发展趋势中&#xff0c;将云计算列在榜首。在这之后&#xff0c;谷歌、亚马逊、IBM等科技巨头纷纷加码对云计算的研发投入。2010年正式迎来云计算时代&#xff0c;这一年也被定为“云元…...

Adobe Acrobat Pro或者Adobe Acrobat Reader取消多标签页显示,设置打开一个pdf文件对应一个窗口。

Windows系统&#xff1a;Adobe Acrobat Pro或者Adobe Acrobat Reader首选项-一般-取消在同一窗口的新标签中打开文档&#xff08;需要重启&#xff09;的对勾&#xff0c;点击确定&#xff0c;彻底关闭后重启&#xff0c;这样打开的每一个PDF文件对应的是一个窗口&#xff0c;并…...

从0开始学习pyspark--pyspark的数据读取[第4节]

在PySpark中&#xff0c;读取文件型数据是一个常见的操作&#xff0c;Spark支持多种数据格式&#xff0c;如CSV、JSON、Parquet、Avro等。以下是一些常用的方法来读取不同格式的文件数据。 读取文本型数据 读取CSV文件: 使用spark.read.csv方法读取CSV文件&#xff0c;可以通…...

极速升级:MacOS系统中Pip源的切换指南

极速升级&#xff1a;MacOS系统中Pip源的切换指南 在MacOS系统中&#xff0c;Python的包管理工具Pip是我们管理和安装Python库的得力助手。然而&#xff0c;默认的Pip源在国外&#xff0c;对于国内用户来说&#xff0c;访问速度可能较慢。因此&#xff0c;更换Pip源以提高下载…...

服务器的分类,主流服务器的应用场景

一、服务器分类 服务器可以按应用层次、体系架构、用途、外形等进行分类。以下是详细说明&#xff1a; 按应用层次分类 入门级服务器&#xff1a;这些服务器一般用于小型企业或部门的简单任务&#xff0c;如文件共享和打印服务。工作组级服务器&#xff1a;适用于中小型企业&…...

Objects and Classes (对象和类)

Objects and Classes [对象和类] 1. Procedural and Object-Oriented Programming (过程性编程和面向对象编程)2. Abstraction and Classes (抽象和类)2.1. Classes in C (C 中的类)2.2. Implementing Class Member Functions (实现类成员函数)2.3. Using Classes (使用类) Ref…...

从单点到全景:视频汇聚/安防监控EasyCVR全景视频监控技术的演进之路

在当今日新月异的科技浪潮中&#xff0c;安防监控领域的技术发展日新月异&#xff0c;全景摄像机便是这一领域的杰出代表。它以其独特的360度无死角监控能力&#xff0c;为各行各业提供了前所未有的安全保障&#xff0c;成为现代安防体系中的重要组成部分。 一、全景摄像机的技…...

Java学习 -Golang开发环境+目录结构+编译+部署

开发环境 环境变量设置 GOROOT 指定 golang sdk 的安装目录GOPATH golang 工作目录&#xff0c;项目的源码放在这个目录下PATH 将 GOROOT/bin 放在 Path 路径下&#xff0c;方便命令行能直接运行 golang的命令行工具项目目录结构 |--project // 位于G…...

Redis 典型应用——缓存(缓存预热,穿透,雪崩,击穿)

一、缓存 缓存是计算机中一个很经典的概念&#xff0c;核心思路是把一些常用的数据放到访问速度更快的地方&#xff0c;方便随时读取&#xff1b; 但对于计算机硬件来说&#xff0c;往往访问速度越快的设备&#xff0c;成本越高&#xff0c;存储空间越小&#xff0c;缓存是更…...

Sharding-JDBC分库分表的基本使用

前言 传统的小型应用通常一个项目一个数据库&#xff0c;单表的数据量在百万以内&#xff0c;对于数据库的操作不会成为系统性能的瓶颈。但是对于互联网应用&#xff0c;单表的数据量动辄上千万、上亿&#xff0c;此时通过数据库优化、索引优化等手段&#xff0c;对数据库操作…...

7月信用卡新规下:信用卡欠的钱不用还了?

说到信用卡&#xff0c;现在基本上人手一张&#xff0c;大家都有使用过。但你知道吗&#xff0c;使用信用卡不是这么简单容易的事&#xff0c;比如会对你的贷款有影响&#xff0c;透支不还逾期对生活的影响&#xff0c;信用卡新规对持卡人和银行那边的影响。 一、只要不逾期&am…...

坑——python的redis库的decode_responses设置

python的redis库查询返回的值默认是返回字节串&#xff0c;可以在redis.Redis()方法中通过设置decode_responses参数&#xff0c;让返回值直接是字符串&#xff1b; 查询返回字节串是因为Redis()方法中decode_responses默认值是False&#xff1a; 设置decode_responses为True就…...

从项目中学习Bus-Off的快慢恢复

0 前言 说到Bus-Off&#xff0c;大家应该都不陌生&#xff0c;使用VH6501干扰仪进行测试的文章在网上数不胜数&#xff0c;但是一般大家都是教怎么去干扰&#xff0c;但是说如何去看快慢恢复以及对快慢恢复做出解释比较少&#xff0c;因此本文以实践的视角来讲解Bus-Off的快慢恢…...

视频参考帧和重构帧复用

1、 视频编码中的参考帧和重构帧 从下图的编码框架可以看出&#xff0c;每编码一帧需要先使用当前帧CU(n)减去当前帧的参考帧CU&#xff08;n&#xff09;得到残差。同时&#xff0c;需要将当前帧的重构帧CU*&#xff08;n&#xff09;输出&#xff0c;然后再读取重构帧进行预测…...

js修改scss变量

style.scss $color : var(--color,#ccc); // 默认值 #ccc .color{background: $color; } 定义了一个scss变量&#xff08;$color&#xff09;&#xff0c;用普通的css变量&#xff08;--color&#xff09;给他赋值&#xff0c;这里需要一个默认值&#xff0c;此时css变量(--co…...

【中霖教育怎么样】报考注册会计师有年龄限制吗?

【中霖教育怎么样】报考注册会计师有年龄限制吗? 申请参加注册会计师考试有没有年龄约束? 对于注册会计师的考试&#xff0c;不存在具体的年龄上限。而且该考试的入学门栏相对低&#xff0c;主要对考生的年龄下限规定。 在专业阶段&#xff0c;注册会计师考试要求考生具备…...

PHP验证日本手机电话号码

首先&#xff0c;您需要了解手机号码的规格。 根据 &#xff0c;手机和PHS&#xff08;个人手持电话系统&#xff09;可以理解为以“070”、“080”和“090”开头的11位数字。 此外&#xff0c;以“050”开头的11位特定IP电话号码也将包含在该目标中。 关于以“060”开头的F…...

Qt 配置ASan

Qt 配置ASan 文章目录 Qt 配置ASan摘要关于ASan&#xff08;AddressSanitizer&#xff09;在Qt中配置 ASan1. 安装必要的工具2. 修改项目的 .pro 文件3. 重新构建项目4. 运行应用程序5. 分析错误报告示例注意事项 关键字&#xff1a; Qt、 ASan、 AddressSanitizer 、 GCC …...

MySQL常用操作命令大全

文章目录 一、连接与断开数据库1.1 连接数据库1.2 选择数据库1.3 断开数据库 二、数据库操作2.1 创建数据库2.2 查看数据库列表2.3 删除数据库 三、表操作3.1 创建表3.2 查看表结构3.3 修改表结构3.3.1 添加列3.3.2 删除列3.3.3 修改列数据类型 3.4 删除表 四、数据操作4.1 插入…...

有人物联的串口服务器USR-TCP232-410S基本测试通信和使用方案(485串口和232串口)

1.将 410S(USR-TCP232-410S&#xff0c;简称 410S 下同)的串口通过串口线(或USB 转串口线)与计算机相连接&#xff0c;通过网线将 410S 的网口 PC 的网口相连接&#xff0c;检测硬件连接无错误后&#xff0c;接入我们配送的电源适配器&#xff0c;给 410S 供电。观察指示灯状态…...

二维码登录的原理

二维码登录的原理: 二维码登录是一种基于移动设备和网络技术的便捷登录方式。其原理主要依赖于以下几个关键要素: 随机生成:服务器端随机生成一个具有唯一性和时效性的二维码。编码信息:这个二维码包含了特定的登录信息,例如用户标识、会话标识、时间戳等。扫描识别:用户…...

【MindSpore学习打卡】应用实践-计算机视觉-ShuffleNet图像分类:从理论到实践

在当今的深度学习领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;已经成为图像分类任务的主流方法。然而&#xff0c;随着网络深度和复杂度的增加&#xff0c;计算资源的消耗也显著增加&#xff0c;特别是在移动设备和嵌入式系统中&#xff0c;这种资源限制尤为突出。…...

6800和8080单片机读写时序和液晶屏接口

前言&#xff1a; 随着单片机发展&#xff0c;集成度越来越高&#xff0c;因此目前单片机较少使用RD和WR信号操作外设&#xff0c;因此很多时候&#xff0c;变成了6800和8080单片机读写液晶屏了。早期的读写本质上是对一个地址进行即时的操作&#xff0c;现在可能是等数据送到…...

LiveNVR监控流媒体Onvif/RTSP用户手册-视频广场:状态记录、播放、回放入口、筛选在线离线、搜索

LiveNVR监控流媒体Onvif/RTSP用户手册-视频广场:状态记录、播放、回放入口、筛选在线离线、搜索 1、视频广场1.1、搜索筛选1.2、状态记录1.3、播放1.4、视频信息1.5、回放入口 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、视频广场 1.1、搜索筛选 可以下拉筛选 在线、离线 &a…...

第4-5天:30余种加密编码和资产架构端口应用CDNWAF站库分离负载均衡

文章目录 前言知识点常见加密编码等算法解析 资产架构&端口&应用&CDN&WAF&站库分离&负载均衡资产架构番外安全考虑阻碍 前言 在安全测试中常见的敏感信息密码等会采用加密方式&#xff0c;因此作为一名安全人员要了解常见加密。 知识点 主要有存储加…...

2.3.2 主程序和外部IO交互 (文件映射方式)----IO Client实现

2.3.2 主程序和外部IO交互 &#xff08;文件映射方式&#xff09;----IO Client C实现 和IOServer主要差别&#xff1a; 1 使用Open_Client 连接 2 一定要先打开IOServer&#xff0c;再打开IO_Client 效果显示 1 C 代码实现 1.1 shareddataClient.h 头文件中引用 和sharedd…...

ionic7 使用Capacitor打包 apk 之后,设置网络权限

报错处理 在打包的时候遇到过几个问题&#xff0c;这里记录下来两个 Visual Studio Code运行ionic build出错显示ionic : 无法加载文件 ionic 项目通过 android studio 打开报错 capacitor.settings.gradle 文件不存在 ionic7 项目初始化以及打包 apk 这篇文章讲到了如果安装…...

东风奕派eπ008岚图FREE318双星闪耀

6月14日晚,东风汽车在湖北武汉和四川雅安两地同步举行盛大发布会,旗下两款重磅新能源车型——东风奕派的eπ008和东风岚图的FREE 318正式上市。这两款新车的推出,不仅进一步巩固了东风汽车在新能源市场的领先地位,也为消费者带来了更加多元化的选择和无与伦比的驾驶体验。e…...

HAL库使用FreeRTOS实时操作系统时配置时基源(TimeBase Source)

需要另外的定时器&#xff0c;用systic的时候生成项目会有警告 https://blog.51cto.com/u_16213579/10967728...

java面试中高频问题----1

一、乐观锁和悲观锁定义、场景怎么判断用什么&#xff1f; 1.乐观锁&#xff1a; 定义&#xff1a;乐观锁假设大多数情况下&#xff0c;资源不会发生冲突。因此&#xff0c;允许多个线程同时访问资源。 场景&#xff1a;读操作多&#xff0c;写操作少&#xff0c;数据冲突概率…...

服务器内存与CPU要占用多少才合理?

一 通常服务器内存占用多少合理&#xff1f;cpu占用多少才合理&#xff1f; 1 通常配置范围建议&#xff1a; 建议CPU使用率不高于80%&#xff1b;内存使用率不高于80%&#xff1b; 注意&#xff1a;具体情况还需要根据服务器的实际负载和应用场景来判断。 2 内存使用率&…...

使用python绘制一个五颜六色的爱心

使用python绘制一个五颜六色的爱心 介绍效果代码 介绍 使用numpy与matplotlib绘制一个七彩爱心&#xff01; 效果 代码 import numpy as np import matplotlib.pyplot as plt# Heart shape function def heart_shape(t):x 16 * np.sin(t)**3y 13 * np.cos(t) - 5 * np.cos…...

如何使用Postman更好的进行API渗透测试

在这个时代&#xff0c;Web 和移动应用程序通常是由 RESTful 网络服务提供支持的。 公共和私有 API 在互联网上非常普遍&#xff0c;测试这些 API 绝非易事&#xff0c;但有一些工具可以帮助你。 虽然(通常用与渗透测试)工具不能代替技能&#xff0c;但即使是最熟练的木匠也能用…...