首先来介绍一下科大讯飞开放平台吧?网址是:http://www.xfyun.cn/

  科大讯飞开放平台提供了很多免费的服务。

在这边分享中主要是使用java平台介绍科大讯飞中的在线语音合成功能(包括语音转文字和文字转语音)。

  首先大家下载该功能的SDK.下载前必须要首先注册一个科大讯飞平台的账户。并在控制台中创建一个与之对应的java项目。之后下载在线语音合成的SDK.

解压缩后,有以下文件。

doc文件夹中含有改功能的介绍和api的介绍。lib文件夹中包含了该功能所需要的架包和动态链接库。sample文件夹中包含了一下例子,可以直接导入使用,完全不需要修改。

lib文件夹中有:

把这些文件和lib文件夹中的文件全部复制到创建的java项目中的lib文件夹下(没有该文件夹就自己创建一个)。

在项目处点击右键进入项目的属性。

选择javaBuild Path→选择Libraries→点击AddExternal JARS导入项目中lib文件夹下的*.jar的架包。然后点击Source→选择NativeLibraries Location ->点击右边的Edit->选择项目的lib文件夹。这样就完成了架包的导入。

下面就是开始主题啦。

java平台功能介绍链接:http://www.xfyun.cn/doccenter/java

1.文字转语音的关键代码:

1. SpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer( );
2. //2.合成参数设置,详见《iFlytek MSC Reference Manual》SpeechSynthesizer 类
3. mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");//设置发音人
4. mTts.setParameter(SpeechConstant.SPEED, "50");//设置语速
5. mTts.setParameter(SpeechConstant.VOLUME, "80");//设置音量,范围0~100
6. //设置合成音频保存位置(可自定义保存位置),保存在“./iflytek.pcm”
7. //如果不需要保存合成音频,注释该行代码
8. mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./iflytek.pcm");
9. //3.开始合成
10. mTts.startSpeaking("科大讯飞,让世界聆听我们的声音", mSynListener);
11.
12. //合成监听器
13. private SynthesizerListener mSynListener = new SynthesizerListener(){
14.     //会话结束回调接口,没有错误时,error为null
15.     public void onCompleted(SpeechError error) {}
16.     //缓冲进度回调
17.     //percent为缓冲进度0~100,beginPos为缓冲音频在文本中开始位置,endPos表示缓冲音频在文本中结束位置,info为附加信息。
18.     public void onBufferProgress(int percent, int beginPos, int endPos, String info) {}
19.     //开始播放
20.     public void onSpeakBegin() {}
21.     //暂停播放
22.     public void onSpeakPaused() {}
23.     //播放进度回调
24.     //percent为播放进度0~100,beginPos为播放音频在文本中开始位置,endPos表示播放音频在文本中结束位置.
25.     public void onSpeakProgress(int percent, int beginPos, int endPos) {}
26.     //恢复播放回调接口
27.     public void onSpeakResumed() {}
28. };   

2.语音转文字关键代码

//1.创建SpeechRecognizer对象
1. SpeechRecognizer mIat= SpeechRecognizer.createRecognizer( );
2. //2.设置听写参数,详见《iFlytek MSC Reference Manual》SpeechConstant类
3. mIat.setParameter(SpeechConstant.DOMAIN, "iat");
4. mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
5. mIat.setParameter(SpeechConstant.ACCENT, "mandarin ");
6. //3.开始听写
7. mIat.startListening(mRecoListener);
8. //听写监听器
9. private RecognizerListener mRecoListener = new RecognizerListener(){
10. //听写结果回调接口(返回Json格式结果,用户可参见附录);
11. //一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;
12. //关于解析Json的代码可参见MscDemo中JsonParser类;
13. //isLast等于true时会话结束。
14. public void onResult(RecognizerResult results, boolean isLast) {
15.             DebugLog.Log("Result:"+results.getResultString ());
16.     }
17. //会话发生错误回调接口
18.     public void onError(SpeechError error) {
19. error.getPlainDescription(true) //获取错误码描述}
20.     //开始录音
21.     public void onBeginOfSpeech() {}
22.     //音量值0~30
23.     public void onVolumeChanged(int volume){}
24.     //结束录音
25.     public void onEndOfSpeech() {}
26.     //扩展用接口
27.     public void onEvent(int eventType,int arg1,int arg2,String msg) {}
28. };   

知道关键代码后就直接上本项目的完成代码啦,主要是写了一个界面,功能代码在WordVoice类中。MainJFrame主要是界面的逻辑控制和点击事件,有注释了,应该很容易看懂。

MainJFrame.java文件内容为:

import com.iflytek.cloud.speech.SpeechRecognizer;
/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*//**** @author peiyuwang*/
public class MainJFrame extends javax.swing.JFrame {SpeechRecognizer mIat = null;/*** Creates new form MainJFrame*/public MainJFrame() {initComponents();BtnStop.setEnabled(false);BtnEnd.setEnabled(false);TxtVoiceToWord.setEditable(false);}/*** This method is called from within the constructor to initialize the form.* WARNING: Do NOT modify this code. The content of this method is always* regenerated by the Form Editor.*/@SuppressWarnings("unchecked")// <editor-fold defaultstate="collapsed" desc="Generated Code">private void initComponents() {jLabel1 = new javax.swing.JLabel();jLabel2 = new javax.swing.JLabel();jScrollPane1 = new javax.swing.JScrollPane();TxtWordToVoice = new javax.swing.JTextArea();BtnPlay = new javax.swing.JButton();jLabel3 = new javax.swing.JLabel();BtnStart = new javax.swing.JButton();BtnStop = new javax.swing.JButton();BtnEnd = new javax.swing.JButton();jScrollPane2 = new javax.swing.JScrollPane();TxtVoiceToWord = new javax.swing.JTextArea();setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);jLabel1.setText("多媒体实验2"); // NOI18NjLabel2.setText("文字转语音:");TxtWordToVoice.setColumns(20);TxtWordToVoice.setLineWrap(true);TxtWordToVoice.setRows(5);jScrollPane1.setViewportView(TxtWordToVoice);BtnPlay.setText("播放");BtnPlay.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent evt) {BtnPlayActionPerformed(evt);}});jLabel3.setText("语音转文字:");BtnStart.setText("开始录制");BtnStart.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent evt) {BtnStartActionPerformed(evt);}});BtnStop.setText("暂停录制");BtnStop.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent evt) {BtnStopActionPerformed(evt);}});BtnEnd.setText("结束录制");BtnEnd.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent evt) {BtnEndActionPerformed(evt);}});TxtVoiceToWord.setColumns(20);TxtVoiceToWord.setRows(5);jScrollPane2.setViewportView(TxtVoiceToWord);javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());getContentPane().setLayout(layout);layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(45, 45, 45).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jLabel3).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING).addGroup(layout.createSequentialGroup().addComponent(jLabel2).addGap(297, 297, 297).addComponent(BtnPlay, javax.swing.GroupLayout.DEFAULT_SIZE, 76, Short.MAX_VALUE)).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false).addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup().addComponent(BtnStart, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 80, Short.MAX_VALUE).addComponent(BtnStop, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(72, 72, 72).addComponent(BtnEnd, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)).addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING)))).addContainerGap(22, Short.MAX_VALUE)).addGroup(layout.createSequentialGroup().addGap(209, 209, 209).addComponent(jLabel1).addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(9, 9, 9).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING).addComponent(jLabel2).addComponent(BtnPlay)).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 103, javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED).addComponent(jLabel3).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(BtnStart).addComponent(BtnStop).addComponent(BtnEnd)).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 113, Short.MAX_VALUE).addContainerGap()));pack();}// </editor-fold>    //文字转语音中的播放按钮的执行事件private void BtnPlayActionPerformed(java.awt.event.ActionEvent evt) {String strWord = TxtWordToVoice.getText().toString();if (!strWord.isEmpty()) {BtnPlay.setEnabled(false);BtnPlay.setText("正在缓冲...");WordVoice.WordToVoice(strWord, BtnPlay);}}//语音转文字的开始录音按钮的事件private void BtnStartActionPerformed(java.awt.event.ActionEvent evt) {BtnStart.setEnabled(false);BtnStart.setText("正在录音...");BtnStop.setEnabled(true);BtnEnd.setEnabled(true);//当为空时,说明是没有录过音或者已经按了结束录音,此时为第二次录音,所以应该先置空if(mIat==null){TxtVoiceToWord.setText("");}mIat = WordVoice.VoiceToWord(TxtVoiceToWord);}//语音转文字的暂停录音按钮的事件private void BtnStopActionPerformed(java.awt.event.ActionEvent evt) {BtnStart.setEnabled(true);BtnStart.setText("继续录音");BtnStop.setEnabled(false);if (mIat != null) {mIat.stopListening();}}//语音转文字的结束录音按钮的事件private void BtnEndActionPerformed(java.awt.event.ActionEvent evt) {BtnStart.setEnabled(true);BtnStart.setText("开始录音");BtnStop.setEnabled(false);BtnEnd.setEnabled(false);if (mIat != null) {mIat.stopListening();mIat = null;}}/*** @param args*            the command line arguments*/public static void main(String args[]) {/* Set the Nimbus look and feel */// <editor-fold defaultstate="collapsed" desc=" Look and feel setting// code (optional) ">/** If Nimbus (introduced in Java SE 6) is not available, stay with the* default look and feel. For details see* http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.* html*/try {for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {if ("Nimbus".equals(info.getName())) {javax.swing.UIManager.setLookAndFeel(info.getClassName());break;}}} catch (ClassNotFoundException ex) {java.util.logging.Logger.getLogger(MainJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null,ex);} catch (InstantiationException ex) {java.util.logging.Logger.getLogger(MainJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null,ex);} catch (IllegalAccessException ex) {java.util.logging.Logger.getLogger(MainJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null,ex);} catch (javax.swing.UnsupportedLookAndFeelException ex) {java.util.logging.Logger.getLogger(MainJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null,ex);}// </editor-fold>/* Create and display the form */java.awt.EventQueue.invokeLater(new Runnable() {public void run() {new MainJFrame().setVisible(true);}});}// Variables declaration - do not modifyprivate javax.swing.JButton BtnEnd;private javax.swing.JButton BtnPlay;private javax.swing.JButton BtnStart;private javax.swing.JButton BtnStop;private javax.swing.JTextArea TxtVoiceToWord;private javax.swing.JTextArea TxtWordToVoice;private javax.swing.JLabel jLabel1;private javax.swing.JLabel jLabel2;private javax.swing.JLabel jLabel3;private javax.swing.JScrollPane jScrollPane1;private javax.swing.JScrollPane jScrollPane2;// End of variables declaration
}

WordVoice.java文件内容为:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;import javax.swing.JButton;
import javax.swing.JTextArea;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.iflytek.cloud.speech.RecognizerListener;
import com.iflytek.cloud.speech.RecognizerResult;
import com.iflytek.cloud.speech.SpeechConstant;
import com.iflytek.cloud.speech.SpeechError;
import com.iflytek.cloud.speech.SpeechSynthesizer;
import com.iflytek.cloud.speech.SpeechUtility;
import com.iflytek.cloud.speech.SynthesizerListener;
import com.iflytek.cloud.speech.Version;
import com.iflytek.cloud.speech.SpeechRecognizer;public class WordVoice {public static void WordToVoice(String strContent, JButton button) {// 将“12345678”替换成您申请的APPID,申请地址:http://open.voicecloud.cnSpeechUtility.createUtility(SpeechConstant.APPID + "=58493c56");// 1.创建SpeechSynthesizer对象SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer();// 2.合成参数设置,详见《iFlytek MSC Reference Manual》SpeechSynthesizer 类mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");// 设置发音人mTts.setParameter(SpeechConstant.SPEED, "50");// 设置语速mTts.setParameter(SpeechConstant.VOLUME, "80");// 设置音量,范围0~100// 设置合成音频保存位置(可自定义保存位置),保存在“./iflytek.pcm”// 如果不需要保存合成音频,注释该行代码// mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./iflytek.pcm");// 合成监听器SynthesizerListener mSynListener = new SynthesizerListener() {// 会话结束回调接口,没有错误时,error为nullpublic void onCompleted(SpeechError error) {button.setText("播放");button.setEnabled(true);}// 缓冲进度回调// percent为缓冲进度0~100,beginPos为缓冲音频在文本中开始位置,endPos表示缓冲音频在文本中结束位置,info为附加信息。public void onBufferProgress(int percent, int beginPos, int endPos, String info) {}// 开始播放public void onSpeakBegin() {button.setText("正在播放");}// 暂停播放public void onSpeakPaused() {}// 播放进度回调// percent为播放进度0~100,beginPos为播放音频在文本中开始位置,endPos表示播放音频在文本中结束位置.public void onSpeakProgress(int percent, int beginPos, int endPos) {}// 恢复播放回调接口public void onSpeakResumed() {}};// 3.开始合成mTts.startSpeaking(strContent, mSynListener);}public static SpeechRecognizer VoiceToWord(JTextArea text) {// 将“12345678”替换成您申请的APPID,申请地址:http://open.voicecloud.cnSpeechUtility.createUtility(SpeechConstant.APPID + "=58493c56");// 1.创建SpeechRecognizer对象SpeechRecognizer mIat = SpeechRecognizer.createRecognizer();// 2.设置听写参数,详见《iFlytek MSC Reference Manual》SpeechConstant类mIat.setParameter(SpeechConstant.DOMAIN, "iat");mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");mIat.setParameter(SpeechConstant.ACCENT, "mandarin ");// 听写监听器RecognizerListener mRecoListener = new RecognizerListener() {public void onResult(RecognizerResult results, boolean isLast) {//使用了阿里巴巴fastjson的架包来解析返回的json字符串。//对于这部分可能大家要看看fastjson的使用方法才看得懂哦Root root=JSON.parseObject(results.getResultString(), Root.class);Iterator<Ws> list=root.getWs().iterator();while(list.hasNext()){Iterator<Cw> listCw=list.next().getCw().iterator();while(listCw.hasNext()){text.append(listCw.next().getW());}}}// 会话发生错误回调接口public void onError(SpeechError error) {System.out.println("错误" + error.getErrorCode() + "  " + error.getErrorDesc());}// 开始录音public void onBeginOfSpeech() {}// 音量值0~30public void onVolumeChanged(int volume) {}// 结束录音public void onEndOfSpeech() {}// 扩展用接口public void onEvent(int eventType, int arg1, int arg2, String msg) {}};// 3.开始听写mIat.startListening(mRecoListener);return mIat;}
}

以下的三个java文件主要是为了方便解析语音转文字时对json字符串的解析。为什么要这几个文件,因为阿里巴巴的fastjson架包是按类来解析json字符串的。每个字段对应一个成员变量。大家想了解更多的,可以自行查阅。

Root.java内容

import java.util.List;
public class Root {
private int sn;private boolean ls;private int bg;private int ed;private List<Ws> ws ;public void setSn(int sn){
this.sn = sn;
}
public int getSn(){
return this.sn;
}
public void setLs(boolean ls){
this.ls = ls;
}
public boolean getLs(){
return this.ls;
}
public void setBg(int bg){
this.bg = bg;
}
public int getBg(){
return this.bg;
}
public void setEd(int ed){
this.ed = ed;
}
public int getEd(){
return this.ed;
}
public void setWs(List<Ws> ws){
this.ws = ws;
}
public List<Ws> getWs(){
return this.ws;
}}

Ws.java文件内容

import java.util.List;
public class Ws {
private int bg;private List<Cw> cw ;public void setBg(int bg){
this.bg = bg;
}
public int getBg(){
return this.bg;
}
public void setCw(List<Cw> cw){
this.cw = cw;
}
public List<Cw> getCw(){
return this.cw;
}}

Cw,java文件

public class Cw {
private double sc;private String w;public void setSc(double sc){
this.sc = sc;
}
public double getSc(){
return this.sc;
}
public void setW(String w){
this.w = w;
}
public String getW(){
return this.w;
}}

执行之后显示是这样的:

项目下载地址:http://dl.download.csdn.net/down11/20161210/b507c99c8261d0c5b6a63fc1dfe4c55a.zip?response-content-disposition=attachment%3Bfilename%2A%3D%22utf8%27%27WordVoice.zip%22&OSSAccessKeyId=9q6nvzoJGowBj4q1&Expires=1481381643&Signature=UzKuy0IdVXL8C5gHtr8IN2YWnlA%3D

项目下载页面:http://download.csdn.net/detail/peiyuwang_2015/9707706

科大讯飞平台语音和文字互转简单介绍相关推荐

  1. Android studio调用科大讯飞的语音转文字功能

    Android studio调用科大讯飞的语音转文字功能 一.在科大讯飞的官网上注册并下载SDK 二.配置安卓项目 三.运行效果展示 一.在科大讯飞的官网上注册并下载SDK 1.首先去讯飞开放平台申请 ...

  2. Android对接科大讯飞AIUI语音转文字装置(魔飞)串口开发

    #对接科大讯飞的魔飞装置有一段时间了,现在来总结一下遇到的一些问题以及踩过的一些坑: 1.参考科大讯飞给的串口开发文档 https://doc.iflyos.cn/aiui/sdk/smart_doc ...

  3. 5款软件做访谈 | 语音转文字 | 实时转录 | 简单高效

    最近在做访谈,所以整理了一些好用的录音转文字的软件和APP,跟大家分享下,希望能够对大家有用- 1.百度输入法的语音输入 需要先下载百度输入法,然后打开一份空白的Word文件,点击"语音输入 ...

  4. oppo手机语音转文字其实很简单,学会这个方法,一分钟搞定课堂笔记

    九月开学季,同学们也纷纷返校投入学习中,但迎面而来的是听不完的讲座和记不完的笔记,而讲座老师尤其喜欢口述重点,记录长时间手不仅酸的要死,而且还会因为疲劳而造成错记漏记重点的情况,其实我们利用oppo手 ...

  5. 科大讯飞cordova语音插件填坑及api介绍

    项目要求语音合成,准备调用科大讯飞的cordova插件,百度仅有一篇有价值的参考文章(再吐槽下,百度搜索到各种复制的文章....),谷歌有2篇,但介绍不全,只用typescript列出api,没有ap ...

  6. 手机语音转文字怎么做才简单?按下这个按钮,一键轻松记录

    很多朋友都是语音转文字很困难,其实我们用对方法,语音转文字就特别简单,下面笔者就教大家一个方法,手机按下这个按钮,就能非常轻松的记录了. 方法一:录音机记录 很多朋友都会说录音机记录,到后面还不是要人 ...

  7. java mp3转wav_在线语音转文字网站,快收藏起来

    如果你有会议录音或者课堂录音想要转换成文字,就需要找个语音转文字工具,知意字稿可以在线语音转文字,不用下载任何软件,是一个非常方便的网站. 一.在线语音转文字方便 在这个快速发展的时代,为了让用户更加 ...

  8. 在线语音转文字就是这么方便,快点击收藏吧!

    如果你有会议录音或者课堂录音想要转换成文字,就需要找个语音转文字工具,知意字稿可以在线语音转文字,不用下载任何软件,是一个非常方便的网站.     一.在线语音转文字方便     在这个快速发展的时代 ...

  9. 在线语音转文字工具V1.0

    在线语音转文字工具V1.0 介绍 在线语音转文字工具V1.0,采用C#开发语音基于Framework4.5开发,主要采用百度语音识别SDK,实现了在线文本转语音的功能,可以转换后直接播放.有需要的朋友 ...

最新文章

  1. Quartz.Net—配置化
  2. C++逻辑运算符与逻辑表达式
  3. Struts 2(一):初识Struts
  4. 网络流题目详讲+题单(提高版)(持续更新中......)
  5. 记一次解决问题的掉坑过程
  6. 用android制作一个记事本app_用扁平化呈现一个天气APP
  7. php开发简易论坛教程,[php] 我的微型论坛的简单教程[已完成]第3/8页
  8. exchange 2010 sp2系列之(二)证书配置
  9. 国内最适合年轻人旅游的地方
  10. SpringBoot 发送邮件和附件(实用版)
  11. Python项目 huobi量化交易系统
  12. 郭霖:手把手教你实现 App 360 度旋转看车效果
  13. win10电脑新建Excel工作簿,后缀变成xlsm(正常本应该是xlsx)的解决办法
  14. R mean() 函数 - 计算平均值
  15. java opengl 图片文字_如何通过opengl显示相机预览
  16. 【Spring源码】4. 自己搞个标签?~自定义标签保姆级全过程(图解向,堆图预警)
  17. 攻防世界——xff_referer
  18. 爱游思 » 站长常用工具
  19. docker容器打包成镜像并上传至dockerhub
  20. 路测里程超过350万英里之后,Waymo想在冬天进行「冰雪测试」

热门文章

  1. JavaScript 判断闰年典型案例,小算法
  2. [汉化主题] Knowhow v1.1.20 – 响应式论坛知识库WordPress主题 (2020.09.20更新)
  3. 工具 | Windows10 软件推荐 (二)
  4. php微信判断转发次数,微信朋友圈文章转发次数和点赞的次数如何查询
  5. ASW3410数据手册|ASW3410设计参数|USB3.0高速数据开关切换IC说明书
  6. 调查报告:竞业协议应该怎么签
  7. 虹科案例 | 用AR进行建筑规划,这家公司竟已“走近”了元宇宙?
  8. 视频剪辑教程,教你自定义裁切多个视频的画面
  9. 《惢客创业日记》2022.03.01-31(周二)二月份的总结和三月份的计划
  10. 微信检测是否被删好友