精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

鴻蒙AI能力之語音識別

開發(fā)
文章旨在幫助大家開發(fā)錄音及語音識別時(shí)少踩一點(diǎn)坑。AI語音識別不需要任何權(quán)限,但此處使用到麥克風(fēng)錄制音頻,就需要申請麥克風(fēng)權(quán)限。

[[441758]]

想了解更多內(nèi)容,請?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

文章旨在幫助大家開發(fā)錄音及語音識別時(shí)少踩一點(diǎn)坑。

效果

鴻蒙AI能力之語音識別-鴻蒙HarmonyOS技術(shù)社區(qū)

左側(cè)為簡易UI布局及識別成果,右側(cè)為網(wǎng)易云播放的測試音頻。

開發(fā)步驟

IDE安裝、項(xiàng)目創(chuàng)建等在此略過。App采用SDK版本為API 6,使用JS UI。

1.權(quán)限申請

AI語音識別不需要任何權(quán)限,但此處使用到麥克風(fēng)錄制音頻,就需要申請麥克風(fēng)權(quán)限。

在config.json配置文件中添加權(quán)限:

  1. "reqPermissions": [ 
  2.       { 
  3.         "name""ohos.permission.MICROPHONE" 
  4.       } 
  5.     ] 

 在MainAbility中顯示申明麥克風(fēng)權(quán)限:

  1. @Override 
  2.     public void onStart(Intent intent) { 
  3.         super.onStart(intent); 
  4.         requestPermission(); 
  5.     } 
  6.  
  7.     //獲取權(quán)限 
  8.     private void requestPermission() { 
  9.         String[] permission = { 
  10.                 "ohos.permission.MICROPHONE"
  11.         }; 
  12.         List<String> applyPermissions = new ArrayList<>(); 
  13.         for (String element : permission) { 
  14.             if (verifySelfPermission(element) != 0) { 
  15.                 if (canRequestPermission(element)) { 
  16.                     applyPermissions.add(element); 
  17.                 } 
  18.             } 
  19.         } 
  20.         requestPermissionsFromUser(applyPermissions.toArray(new String[0]), 0); 
  21.     } 

2.創(chuàng)建音頻錄制的工具類

首先創(chuàng)建音頻錄制的工具類AudioCaptureUtils。

而音頻錄制需要用到AudioCapturer類,而在創(chuàng)建AudioCapture類時(shí)又會(huì)用到AudioStreamInfo類及AudioCapturerInfo類,所以我們分別申明以上3個(gè)類的變量。

  1. private AudioStreamInfo audioStreamInfo; 
  2.    private AudioCapturer audioCapturer; 
  3.    private AudioCapturerInfo audioCapturerInfo; 

 在語音識別時(shí)對音頻的錄制是由限制的,限制如下:

鴻蒙AI能力之語音識別-鴻蒙HarmonyOS技術(shù)社區(qū)

所以我們在錄制音頻時(shí)需要注意:

1.采樣率16000HZ

2.聲道為單聲道

3.僅支持普通話

作為工具類,為了使AudioCaptureUtils能多處使用,我們在創(chuàng)建構(gòu)造函數(shù)時(shí),提供聲道與頻率的參數(shù)重載,并在構(gòu)造函數(shù)中初始化AudioStreamInfo類及AudioCapturerInfo類。

  1. //channelMask 聲道 
  2. //SampleRate 頻率 
  3.   public AudioCaptureUtils(AudioStreamInfo.ChannelMask channelMask, int SampleRate) { 
  4.         this.audioStreamInfo = new AudioStreamInfo.Builder() 
  5.                 .encodingFormat(AudioStreamInfo.EncodingFormat.ENCODING_PCM_16BIT) 
  6.                 .channelMask(channelMask) 
  7.                 .sampleRate(SampleRate) 
  8.                 .build(); 
  9.         this.audioCapturerInfo = new AudioCapturerInfo.Builder().audioStreamInfo(audioStreamInfo).build(); 
  10.     } 

 在init函數(shù)中進(jìn)行audioCapturer的初始化,在初始化時(shí)對音效進(jìn)行設(shè)置,默認(rèn)為降噪模式。

  1. //packageName 包名 
  2.  public void init(String packageName) { 
  3.         this.init(SoundEffect.SOUND_EFFECT_TYPE_NS,packageName ); 
  4.     } 
  5. //soundEffect 音效uuid 
  6. //packageName 包名 
  7.    public void init(UUID soundEffect, String packageName) { 
  8.         if (audioCapturer == null || audioCapturer.getState() == AudioCapturer.State.STATE_UNINITIALIZED) 
  9.             audioCapturer = new AudioCapturer(this.audioCapturerInfo); 
  10.         audioCapturer.addSoundEffect(soundEffect, packageName); 
  11.     } 

 初始化后提供start、stop和destory方法,分別開啟音頻錄制、停止音頻錄制和銷毀,此處都是調(diào)用AudioCapturer類中對應(yīng)函數(shù)。

  1. public void stop(){ 
  2.        this.audioCapturer.stop(); 
  3.    } 
  4.  
  5.    public void destory(){ 
  6.        this.audioCapturer.stop(); 
  7.        this.audioCapturer.release(); 
  8.    } 
  9.  
  10.    public Boolean start() { 
  11.        if (audioCapturer == null
  12.            return false
  13.        return audioCapturer.start(); 
  14.    } 

 提供一個(gè)讀取音頻流的方法及獲取AudioCapturer實(shí)例的方法。

  1. //buffers 需要寫入的數(shù)據(jù)流 
  2. //offset 數(shù)據(jù)流的偏移量 
  3. //byteslength 數(shù)據(jù)流的長度 
  4.  public int read(byte[] buffers, int offset, int bytesLength){ 
  5.         return audioCapturer.read(buffers,offset,bytesLength); 
  6.     } 
  7.  
  8. //獲取AudioCapturer的實(shí)例audioCapturer 
  9.   public AudioCapturer get(){ 
  10.         return this.audioCapturer; 
  11.     } 

3.創(chuàng)建語音識別的工具類

在上面我們已經(jīng)創(chuàng)建好一個(gè)音頻錄制的工具類,接下來在創(chuàng)建一個(gè)語音識別的工具類 AsrUtils。

我們再回顧一下語音識別的約束與限制:

鴻蒙AI能力之語音識別-鴻蒙HarmonyOS技術(shù)社區(qū)

在此補(bǔ)充一個(gè)隱藏限制,PCM流的長度只允許640與1280兩種長度,也就是我們音頻讀取流時(shí)只能使用640與1280兩種長度。

接下來我們定義一些基本常量:

  1. //采樣率限定16000HZ 
  2.    private static final int VIDEO_SAMPLE_RATE = 16000; 
  3. //VAD結(jié)束時(shí)間 默認(rèn)2000ms 
  4.    private static final int VAD_END_WAIT_MS = 2000; 
  5. //VAD起始時(shí)間 默認(rèn)4800ms  
  6. //這兩參數(shù)與識別準(zhǔn)確率有關(guān),相關(guān)信息可百度查看,在此使用系統(tǒng)默認(rèn) 
  7.    private static final int VAD_FRONT_WAIT_MS = 4800; 
  8. //輸入時(shí)常 20000ms 
  9.    private static final int TIMEOUT_DURATION = 20000; 
  10.  
  11. //PCM流長度僅限640或1280 
  12.    private static final int BYTES_LENGTH = 1280; 
  13. //線程池相關(guān)參數(shù) 
  14.    private static final int CAPACITY = 6; 
  15.    private static final int ALIVE_TIME = 3; 
  16.    private static final int POOL_SIZE = 3; 

 因?yàn)橐诤笈_持續(xù)錄制音頻,所以需要開辟一個(gè)新的線程。此處用到j(luò)ava的ThreadPoolExecutor類進(jìn)行線程操作。

定義一個(gè)線程池實(shí)例以及其它相關(guān)屬性如下:

  1. //錄音線程 
  2.    private ThreadPoolExecutor poolExecutor;  
  3.  /* 自定義狀態(tài)信息 
  4.     **  錯(cuò)誤:-1 
  5.     **  初始:0 
  6.     **  init:1 
  7.     **  開始輸入:2 
  8.     **  結(jié)束輸入:3 
  9.     **  識別結(jié)束:5 
  10.     **  中途出識別結(jié)果:9 
  11.     **  最終識別結(jié)果:10 
  12.     */ 
  13.    public int state = 0; 
  14.    //識別結(jié)果 
  15.    public String result; 
  16. //是否開啟語音識別 
  17. //當(dāng)開啟時(shí)才寫入PCM流 
  18.    boolean isStarted = false
  19.  
  20. //ASR客戶端 
  21.    private AsrClient asrClient; 
  22. //ASR監(jiān)聽對象 
  23.    private AsrListener listener; 
  24.    AsrIntent asrIntent; 
  25. //音頻錄制工具類 
  26.    private AudioCaptureUtils audioCaptureUtils; 

在構(gòu)造函數(shù)中初始化相關(guān)屬性:

  1. public AsrUtils(Context context) { 
  2.         //實(shí)例化一個(gè)單聲道,采集頻率16000HZ的音頻錄制工具類實(shí)例 
  3.         this.audioCaptureUtils = new AudioCaptureUtils(AudioStreamInfo.ChannelMask.CHANNEL_IN_MONO, VIDEO_SAMPLE_RATE); 
  4.         //初始化降噪音效 
  5.         this.audioCaptureUtils.init("com.panda_coder.liedetector"); 
  6.         //結(jié)果值設(shè)為空 
  7.         this.result = ""
  8.         //給錄音控件初始化一個(gè)新的線程池 
  9.         poolExecutor = new ThreadPoolExecutor( 
  10.                 POOL_SIZE, 
  11.                 POOL_SIZE, 
  12.                 ALIVE_TIME, 
  13.                 TimeUnit.SECONDS, 
  14.                 new LinkedBlockingQueue<>(CAPACITY), 
  15.                 new ThreadPoolExecutor.DiscardOldestPolicy()); 
  16.  
  17.         if (asrIntent == null) { 
  18.             asrIntent = new AsrIntent(); 
  19.             //設(shè)置音頻來源為PCM流 
  20.             //此處也可設(shè)置為文件             
  21.             asrIntent.setAudioSourceType(AsrIntent.AsrAudioSrcType.ASR_SRC_TYPE_PCM); 
  22.             asrIntent.setVadEndWaitMs(VAD_END_WAIT_MS); 
  23.             asrIntent.setVadFrontWaitMs(VAD_FRONT_WAIT_MS); 
  24.             asrIntent.setTimeoutThresholdMs(TIMEOUT_DURATION); 
  25.         } 
  26.  
  27.         if (asrClient == null) { 
  28.             //實(shí)例化AsrClient 
  29.             asrClient = AsrClient.createAsrClient(context).orElse(null); 
  30.         } 
  31.         if (listener == null) { 
  32.             //實(shí)例化MyAsrListener 
  33.             listener = new MyAsrListener(); 
  34.             //初始化AsrClient 
  35.             this.asrClient.init(asrIntent, listener); 
  36.         } 
  37.      
  38.     } 
  39.  
  40. //夠建一個(gè)實(shí)現(xiàn)AsrListener接口的類MyAsrListener  
  41.  class MyAsrListener implements AsrListener { 
  42.  
  43.         @Override 
  44.         public void onInit(PacMap pacMap) { 
  45.             HiLog.info(TAG, "====== init"); 
  46.             state = 1; 
  47.         } 
  48.  
  49.         @Override 
  50.         public void onBeginningOfSpeech() { 
  51.             state = 2; 
  52.         } 
  53.  
  54.         @Override 
  55.         public void onRmsChanged(float v) { 
  56.  
  57.         } 
  58.  
  59.         @Override 
  60.         public void onBufferReceived(byte[] bytes) { 
  61.  
  62.         } 
  63.  
  64.         @Override 
  65.         public void onEndOfSpeech() { 
  66.             state = 3; 
  67.         } 
  68.  
  69.         @Override 
  70.         public void onError(int i) { 
  71.             state = -1; 
  72.             if (i == AsrError.ERROR_SPEECH_TIMEOUT) { 
  73.                 //當(dāng)超時(shí)時(shí)重新監(jiān)聽 
  74.                 asrClient.startListening(asrIntent); 
  75.             } else { 
  76.                 HiLog.info(TAG, "======error code:" + i); 
  77.                 asrClient.stopListening(); 
  78.             } 
  79.         } 
  80.  
  81.         //注意與onIntermediateResults獲取結(jié)果值的區(qū)別 
  82.         //pacMap.getString(AsrResultKey.RESULTS_RECOGNITION); 
  83.         @Override 
  84.         public void onResults(PacMap pacMap) { 
  85.             state = 10; 
  86.             //獲取最終結(jié)果  
  87.             //{"result":[{"confidence":0,"ori_word":"你 好 ","pinyin":"NI3 HAO3 ","word":"你好。"}]} 
  88.             String results = pacMap.getString(AsrResultKey.RESULTS_RECOGNITION); 
  89.             ZSONObject zsonObject = ZSONObject.stringToZSON(results); 
  90.             ZSONObject infoObject; 
  91.             if (zsonObject.getZSONArray("result").getZSONObject(0) instanceof ZSONObject) { 
  92.                 infoObject = zsonObject.getZSONArray("result").getZSONObject(0); 
  93.                 String resultWord = infoObject.getString("ori_word").replace(" """); 
  94.                 result += resultWord; 
  95.             } 
  96.         } 
  97.  
  98.         //中途識別結(jié)果 
  99.         //pacMap.getString(AsrResultKey.RESULTS_INTERMEDIATE) 
  100.         @Override 
  101.         public void onIntermediateResults(PacMap pacMap) { 
  102.             state = 9; 
  103. //            String result = pacMap.getString(AsrResultKey.RESULTS_INTERMEDIATE); 
  104. //            if (result == null
  105. //                return
  106. //            ZSONObject zsonObject = ZSONObject.stringToZSON(result); 
  107. //            ZSONObject infoObject; 
  108. //            if (zsonObject.getZSONArray("result").getZSONObject(0) instanceof ZSONObject) { 
  109. //                infoObject = zsonObject.getZSONArray("result").getZSONObject(0); 
  110. //                String resultWord = infoObject.getString("ori_word").replace(" """); 
  111. //                HiLog.info(TAG, "=========== 9 " + resultWord); 
  112. //            } 
  113.         } 
  114.  
  115.  
  116.         @Override 
  117.         public void onEnd() { 
  118.             state = 5; 
  119.             //當(dāng)還在錄音時(shí),重新監(jiān)聽 
  120.             if (isStarted) 
  121.                 asrClient.startListening(asrIntent); 
  122.         } 
  123.  
  124.         @Override 
  125.         public void onEvent(int i, PacMap pacMap) { 
  126.  
  127.         } 
  128.  
  129.         @Override 
  130.         public void onAudioStart() { 
  131.             state = 2; 
  132.  
  133.         } 
  134.  
  135.         @Override 
  136.         public void onAudioEnd() { 
  137.             state = 3; 
  138.         } 
  139.     } 

開啟識別與停止識別的函數(shù):

  1. public void start() { 
  2.      if (!this.isStarted) { 
  3.          this.isStarted = true
  4.          asrClient.startListening(asrIntent); 
  5.          poolExecutor.submit(new AudioCaptureRunnable()); 
  6.      } 
  7.  } 
  8.  
  9.  public void stop() { 
  10.      this.isStarted = false
  11.      asrClient.stopListening(); 
  12.      audioCaptureUtils.stop(); 
  13.  } 
  14.  
  15. //音頻錄制的線程 
  16.  private class AudioCaptureRunnable implements Runnable { 
  17.      @Override 
  18.      public void run() { 
  19.          byte[] buffers = new byte[BYTES_LENGTH]; 
  20. //開啟錄音 
  21.          audioCaptureUtils.start(); 
  22.          while (isStarted) { 
  23.     //讀取錄音的PCM流 
  24.              int ret = audioCaptureUtils.read(buffers, 0, BYTES_LENGTH); 
  25.              if (ret <= 0) { 
  26.                  HiLog.error(TAG, "======Error read data"); 
  27.              } else { 
  28.         //將錄音的PCM流寫入到語音識別服務(wù)中 
  29.         //若buffer的長度不為1280或640時(shí),則需要手動(dòng)處理成1280或640 
  30.                  asrClient.writePcm(buffers, BYTES_LENGTH); 
  31.              } 
  32.          } 
  33.      } 
  34.  } 

識別結(jié)果是通過listener的回調(diào)獲取的結(jié)果,所以我們在處理時(shí)是將結(jié)果賦值給result,通過getresult或getResultAndClear函數(shù)獲取結(jié)果。

  1. public String getResult() { 
  2.        return result; 
  3.    } 
  4.  
  5.    public String getResultAndClear() { 
  6.        if (this.result == ""
  7.            return ""
  8.        String results = getResult(); 
  9.        this.result = ""
  10.        return results; 
  11.    } 

4.創(chuàng)建一個(gè)簡易的JS UI,并通過JS調(diào)ServerAbility的能力調(diào)用Java

hml代碼:

  1. <div class="container"
  2.     <div> 
  3.         <button class="btn" @touchend="start">開啟</button> 
  4.         <button class="btn" @touchend="sub">訂閱結(jié)果</button> 
  5.         <button class="btn" @touchend="stop">關(guān)閉</button> 
  6.     </div> 
  7.     <text class="title"
  8.         語音識別內(nèi)容: {{ text }} 
  9.     </text> 
  10. </div> 

樣式代碼:

  1. .container { 
  2.     flex-direction: column
  3.     justify-content: flex-start; 
  4.     align-items: center; 
  5.     width: 100%; 
  6.     height: 100%; 
  7.     padding: 10%; 
  8.  
  9. .title { 
  10.     font-size: 20px; 
  11.     color: #000000; 
  12.     opacity: 0.9; 
  13.     text-align: left
  14.     width: 100%; 
  15.     margin: 3% 0; 
  16.  
  17. .btn{ 
  18.     padding: 10px 20px; 
  19.     margin:3px; 
  20.     border-radius: 6px; 

 js邏輯控制代碼:

  1. //js調(diào)Java ServiceAbility的工具類 
  2. import { jsCallJavaAbility } from '../../common/JsCallJavaAbilityUtils.js'
  3.  
  4. export default { 
  5.     data: { 
  6.         text: "" 
  7.     }, 
  8.     //開啟事件 
  9.     start() { 
  10.         jsCallJavaAbility.callAbility("ControllerAbility",100,{}).then(result=>{ 
  11.             console.log(result) 
  12.         }) 
  13.     }, 
  14. //關(guān)閉事件 
  15.     stop() { 
  16.         jsCallJavaAbility.callAbility("ControllerAbility",101,{}).then(result=>{ 
  17.             console.log(result) 
  18.         }) 
  19.         jsCallJavaAbility.unSubAbility("ControllerAbility",201).then(result=>{ 
  20.             if (result.code == 200) { 
  21.                 console.log("取消訂閱成功"); 
  22.             } 
  23.         }) 
  24.     }, 
  25. //訂閱Java端結(jié)果事件 
  26.     sub() { 
  27.         jsCallJavaAbility.subAbility("ControllerAbility", 200, (data) => { 
  28.             let text = data.data.text 
  29.             text && (this.text += text) 
  30.         }).then(result => { 
  31.             if (result.code == 200) { 
  32.                 console.log("訂閱成功"); 
  33.             } 
  34.         }) 
  35.     } 

ServerAbility:

  1. public class ControllerAbility extends Ability { 
  2.     AnswerRemote remote = new AnswerRemote(); 
  3.     AsrUtils asrUtils; 
  4.     //訂閱事件的委托 
  5.     private static HashMap<Integer, IRemoteObject> remoteObjectHandlers = new HashMap<Integer, IRemoteObject>(); 
  6.  
  7.     @Override 
  8.     public void onStart(Intent intent) { 
  9.         HiLog.error(LABEL_LOG, "ControllerAbility::onStart"); 
  10.         super.onStart(intent); 
  11.     //初始化語音識別工具類 
  12.         asrUtils = new AsrUtils(this); 
  13.     } 
  14.  
  15.  
  16.     @Override 
  17.     public void onCommand(Intent intent, boolean restart, int startId) { 
  18.     } 
  19.  
  20.     @Override 
  21.     public IRemoteObject onConnect(Intent intent) { 
  22.         super.onConnect(intent); 
  23.         return remote.asObject(); 
  24.     } 
  25.  
  26.     class AnswerRemote extends RemoteObject implements IRemoteBroker { 
  27.         AnswerRemote() { 
  28.             super(""); 
  29.         } 
  30.  
  31.         @Override 
  32.         public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) { 
  33.             Map<String, Object> zsonResult = new HashMap<String, Object>(); 
  34.             String zsonStr = data.readString(); 
  35.             ZSONObject zson = ZSONObject.stringToZSON(zsonStr); 
  36.             switch (code) { 
  37.                 case 100: { 
  38.             //當(dāng)js發(fā)送code為100時(shí),開啟語音識別 
  39.                     asrUtils.start(); 
  40.                     break; 
  41.                 } 
  42.                 case 101: { 
  43.             //當(dāng)js發(fā)送code為101時(shí),關(guān)閉語音識別 
  44.                     asrUtils.stop(); 
  45.                     break; 
  46.                 } 
  47.                 case 200: { 
  48.             //當(dāng)js發(fā)送code為200時(shí),訂閱獲取識別結(jié)果事件 
  49.                     remoteObjectHandlers.put(200 ,data.readRemoteObject()); 
  50.             //定時(shí)獲取語音識別結(jié)果并返回JS UI                     
  51.                 getAsrText(); 
  52.                     break; 
  53.                 } 
  54.                 default: { 
  55.                     reply.writeString("service not defined"); 
  56.                     return false
  57.                 } 
  58.             } 
  59.             reply.writeString(ZSONObject.toZSONString(zsonResult)); 
  60.             return true
  61.         } 
  62.  
  63.         @Override 
  64.         public IRemoteObject asObject() { 
  65.             return this; 
  66.         } 
  67.     } 
  68.  
  69.     public void getAsrText() { 
  70.         new Thread(() -> { 
  71.             while (true) { 
  72.                 try { 
  73.                     Thread.sleep(1 * 500); 
  74.                     Map<String, Object> zsonResult = new HashMap<String, Object>(); 
  75.                     zsonResult.put("text",asrUtils.getResultAndClear()); 
  76.                     ReportEvent(200, zsonResult); 
  77.  
  78.                 } catch (RemoteException | InterruptedException e) { 
  79.                     break; 
  80.                 } 
  81.             } 
  82.         }).start(); 
  83.     } 
  84.  
  85.     private void ReportEvent(int remoteHandler, Object backData) throws RemoteException { 
  86.         MessageParcel data = MessageParcel.obtain(); 
  87.         MessageParcel reply = MessageParcel.obtain(); 
  88.         MessageOption option = new MessageOption(); 
  89.         data.writeString(ZSONObject.toZSONString(backData)); 
  90.         IRemoteObject remoteObject = remoteObjectHandlers.get(remoteHandler); 
  91.         remoteObject.sendRequest(100, data, reply, option); 
  92.         reply.reclaim(); 
  93.         data.reclaim(); 
  94.     } 
  95.  

至此簡易的語音識別功能完畢。

相關(guān)演示:https://www.bilibili.com/video/BV1E44y177hv/ 

完整代碼開源:https://gitee.com/panda-coder/harmonyos-apps/tree/master/AsrDemo

想了解更多內(nèi)容,請?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2025-06-27 05:00:00

AI語音詐騙AI語音識別人工智能

2021-05-06 11:18:23

人工智能語音識別

2021-05-06 11:13:06

人工智能語音識別

2022-02-17 17:19:31

鴻蒙語音識別語音播報(bào)

2011-05-31 16:38:47

Android 實(shí)現(xiàn)語音

2016-02-17 10:39:18

語音識別語音合成語音交互

2023-07-06 08:41:20

TTS?Mac?系統(tǒng)

2021-11-23 09:58:35

鴻蒙HarmonyOS應(yīng)用

2009-08-21 15:28:23

C#英文

2011-01-18 11:52:25

Linux語音識別

2009-07-21 15:28:06

Windows Emb

2022-12-01 07:03:22

語音識別人工智能技術(shù)

2014-05-04 13:39:15

人臉識別算法

2020-09-21 07:00:00

語音識別AI人工智能

2017-03-20 10:14:03

語音識別匹配算法模型

2015-10-23 13:41:20

android源碼科大訊飛語音識別

2024-01-08 19:30:15

AI開源語音識別

2019-10-12 17:42:33

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

国产尤物一区二区| 蜜桃一区二区三区| 一区二区三区高清在线| 日韩免费在线看| www.99热| 韩国一区二区三区视频| 亚洲午夜av在线| 黑人另类av| jizz国产在线| 香蕉久久网站| 亚洲国产精品电影| 嫩草av久久伊人妇女超级a| 在线观看的av| 成人高清伦理免费影院在线观看| 午夜精品久久久久久久久久久久| 欧洲美一区二区三区亚洲| 成人精品动漫| 亚洲mv大片欧洲mv大片精品| 欧美日韩高清免费| 国产喷水吹潮视频www| 国产精品观看| 一区二区中文字幕| 中文字幕亚洲日本| 另类中文字幕国产精品| 中文字幕亚洲区| 国产欧美亚洲日本| 亚洲无码精品在线观看| 在线视频观看日韩| 色777狠狠综合秋免鲁丝| 精品国产aⅴ一区二区三区东京热 久久久久99人妻一区二区三区 | 欧美日韩另类图片| 欧美在线一区二区三区| 欧美午夜小视频| 亚洲视频综合网| 欧美精品久久久久a| 法国伦理少妇愉情| 国产精品视频一区二区三区综合 | 一区二区三区影视| 超碰97久久| 欧美日韩一区二区三区视频| 久久亚洲精品无码va白人极品| av电影在线网| 91丨porny丨首页| 7777奇米亚洲综合久久| 不卡av电影在线| 欧美91视频| 在线观看日韩视频| av无码一区二区三区| 亚洲天堂网站| 精品久久久久久久久久久久久| 日本丰满少妇黄大片在线观看| h视频网站在线观看| 久久免费看少妇高潮| 风间由美一区二区三区| 国产女人18毛片18精品| 蜜臀av一区二区三区| 日本道色综合久久影院| 日本一级一片免费视频| 欧美精品午夜| 欧美另类交人妖| 色哟哟一一国产精品| 欧美电影一区| 中文字幕在线成人| 日本免费www| 精品国产一区二区三区久久久樱花 | 亚洲国产精品网站| 亚洲av无码一区东京热久久| 免费观看亚洲视频大全| 欧美久久久久久久久中文字幕| 久久精品一区二| 深夜成人福利| 在线亚洲高清视频| 成人毛片一区二区| 俺来也官网欧美久久精品| 亚洲精品久久久久久国产精华液| 自拍偷拍亚洲色图欧美| 超碰在线网址| 一区二区三区国产豹纹内裤在线| 400部精品国偷自产在线观看| 欧美另类极品| 最新国产精品久久精品| 亚洲三区在线观看| 黄色网页在线免费观看| 成人免费在线视频观看| 中文字幕中文字幕一区三区| 免费高清完整在线观看| 亚洲人123区| 久草免费福利在线| 五月天av在线| 日本高清不卡一区| 亚洲天堂2018av| 日韩毛片网站| 精品少妇一区二区三区在线视频| 偷偷色噜狠狠狠狠的777米奇| 欧美在线导航| 视频在线观看一区二区| 青青草原在线免费观看| 亚洲网址在线| 欧美在线一区二区三区四| 国产字幕在线观看| 精品中文av资源站在线观看| 91免费看网站| 日韩专区一区二区| 国产精品三级电影| 国产精品一二三在线观看| 欧美xxx黑人xxx水蜜桃| 色婷婷狠狠综合| 成人不卡免费视频| 老司机aⅴ在线精品导航| 亚洲深夜福利在线| 波多野结衣家庭教师| 国产一区91| 国产精品入口免费视| 国产91视频在线| 国产亚洲欧美色| 日韩av中文字幕第一页| 警花av一区二区三区| 伊人精品在线观看| 五月天婷婷久久| 岛国精品在线观看| 红桃一区二区三区| 欧美高清免费| 在线观看国产精品日韩av| 国产污片在线观看| 国产精品资源网站| 天堂精品一区二区三区| 一区二区电影免费观看| 亚洲精品一区二区精华| 激情五月少妇a| 久久精品国产999大香线蕉| 蜜桃网站成人| 国产精品论坛| 亚洲国产第一页| 欧美日韩国产999| 国产美女主播一区| 亚洲黄色小说网址| 中文字幕一区二区三区色视频| 国产精品欧美激情在线观看| 久久a爱视频| 欧美激情一区二区三区成人| 国产剧情精品在线| 18欧美乱大交hd1984| 色91精品久久久久久久久 | 女同一区二区| 男人的天堂免费在线视频| 亚洲高清一区二| 久久久久99精品| 成人av电影在线| 日韩欧美国产综合在线| 国内精品麻豆美女在线播放视频 | 色狠狠av一区二区三区香蕉蜜桃| 中文字幕 国产精品| 国产视频视频一区| 亚洲免费一级视频| 污污视频网站在线免费观看| 欧美国产视频一区| 男人操女人的视频网站| 青青草国产成人av片免费 | av成人app永久免费| 麻豆成人在线看| 国产夫妻性生活视频| 亚洲欧美另类久久久精品2019| 在线观看中文av| 国产精品99一区二区| www.av一区视频| 国产白浆在线免费观看| 亚洲成av人片在线观看香蕉| 久操视频免费在线观看| 91在线免费视频观看| 毛片av免费在线观看| 日韩精品免费| 96成人在线视频| 成人bbav| 色天天综合狠狠色| 亚洲成人一二三区| 五月婷婷久久丁香| 免费福利视频网站| 国产精品自在欧美一区| 成人资源av| 国产无码精品视频| 神马精品久久| 国产精品的网站| 中文字幕第10页| 亚洲在线国产日韩欧美| 午夜精品一区二区在线观看| 久久九九精品视频| 日本精品视频在线播放| 2017亚洲天堂1024| 粉嫩一区二区三区性色av| 欧美一级二级三级九九九| 日韩成人综合网站| 久久免费视频这里只有精品| 成人高清免费观看mv| 日韩欧美成人激情| 日日夜夜操视频| 亚洲人成网站影音先锋播放| 中文字幕在线免费看线人| 久久国产精品一区二区| 我的公把我弄高潮了视频| 国产精品密蕾丝视频下载| 亚洲专区中文字幕| 91九色综合| 国产+人+亚洲| 免费看美女视频在线网站| 日韩av在线免费| 精品国产av一区二区| 91久久精品日日躁夜夜躁欧美| 亚洲国产精品免费在线观看| 久久久久久免费网| www.啪啪.com| 国产一区91精品张津瑜| jizz欧美激情18| 亚洲黄页一区| 激情图片qvod| 成人中文视频| 久久久www免费人成黑人精品| 久久久久毛片免费观看| 国产精品成人一区二区| 国产拍在线视频| 久久国产精品影视| 在线视频二区| 亚洲欧美国产精品久久久久久久| 国内老熟妇对白xxxxhd| 欧美精品精品一区| 午夜视频网站在线观看| 日韩欧美国产网站| 日本最新中文字幕| 亚洲伊人色欲综合网| 欧美特黄一级片| 国产精品无遮挡| 久久久久久国产免费a片| 91在线观看污| 亚洲av成人片色在线观看高潮 | 91传媒视频在线播放| 日韩 欧美 综合| 亚洲香肠在线观看| 国产一级免费av| 亚洲成av人片一区二区三区| 久久久久久免费观看| 一区二区在线免费观看| 最新一区二区三区| 亚洲人成网站影音先锋播放| 三级在线观看免费大全| 亚洲图片你懂的| caoporn91| 亚洲综合精品久久| 久久激情免费视频| 香蕉加勒比综合久久| 日韩免费视频网站| 精品久久久久久电影| www.国产高清| 一本大道av一区二区在线播放 | 日韩欧美国产麻豆| 不卡av中文字幕| 亚洲第一网站男人都懂| 污视频网站免费观看| 国产视频久久久久| 成人在线免费电影| 久久精品国产精品亚洲| 2021国产在线| 国内精品小视频| 日韩影片中文字幕| 成人国产精品av| 91午夜精品| 欧美日韩亚洲一区二区三区在线观看| 女优一区二区三区| 亚洲第一精品区| 亚洲国产日韩在线| 国产精品人人妻人人爽人人牛| 日本女优在线视频一区二区| 亚洲天堂av一区二区三区| 成人午夜免费视频| 人妻精品久久久久中文字幕| 欧美韩日一区二区三区四区| 欧洲美女女同性互添| 亚洲午夜在线视频| 亚洲av无码乱码国产精品fc2| 欧美精品色一区二区三区| 亚洲女人18毛片水真多| 亚洲视频在线视频| 午夜伦理在线视频| 欧亚精品中文字幕| 精品精品视频| 免费国产一区二区| 亚洲天天影视网| 国产中文字幕在线免费观看| 轻轻草成人在线| 在线精品视频播放| 国产精品区一区二区三| 久久久久久久久久久网| 一本高清dvd不卡在线观看| 97人妻精品一区二区三区动漫| 亚洲国产精品悠悠久久琪琪| www.黄在线观看| 亚洲2020天天堂在线观看| 欧美爱爱视频| 蜜桃传媒视频麻豆一区| 中文字幕免费一区二区| www.国产区| 成人精品在线视频观看| 国产在线观看免费视频软件| 精品久久久久久中文字幕大豆网 | 国产一区二区三区免费观看| 波多野结衣av在线免费观看| 亚洲另类春色国产| 亚洲av综合一区| 日韩精品中文字幕在线观看| 中文字幕中文字幕在线十八区 | 91专区在线观看| 久草在线在线精品观看| 性欧美成人播放77777| 亚洲精品菠萝久久久久久久| 日本黄色中文字幕| 日韩精品高清在线| 人人干在线视频| 国产福利视频一区| 青草久久视频| 9色porny| 国产麻豆精品95视频| 成人午夜免费影院| 在线中文字幕一区二区| 瑟瑟在线观看| 91国在线精品国内播放| 视频亚洲一区二区| 国产日产欧美一区二区| 久久精品国产99国产精品| 欧美波霸videosex极品| 一本大道久久a久久综合 | 久久天堂av综合合色| 欧美三区四区| 免费久久99精品国产自| 亚洲一区成人| 内射中出日韩无国产剧情| 亚洲v日本v欧美v久久精品| 蜜臀av免费在线观看| 欧美日韩高清区| 一区二区中文字幕在线观看| 超碰免费在线公开| 久久99国产精品久久99果冻传媒| 91麻豆制片厂| 欧美日韩在线综合| www.黄在线观看| 国产啪精品视频| 91精品久久久久久久久久不卡| 天堂视频免费看| 1区2区3区欧美| 亚洲av无码乱码在线观看性色| 欧美成人精品xxx| 中文字幕区一区二区三| 久久亚洲精品无码va白人极品| 不卡一区在线观看| 国产一级片毛片| 亚洲免费av网址| 91大神在线观看线路一区| 亚洲国产精品一区二区第一页| 青青草国产精品97视觉盛宴| 久久久久久久久久97| 欧美一区二区在线视频| 国产三线在线| 欧美大香线蕉线伊人久久国产精品 | 97久久超碰福利国产精品…| 日韩欧美黄色| 天美星空大象mv在线观看视频| 国产精品久久久久久久久晋中| 一级黄色片在线看| 久久91超碰青草是什么| 欧美精品中文| 亚洲视频第二页| 一区二区三区日韩精品视频| 欧美一级性视频| 国产精品69av| 91精品国产福利在线观看麻豆| xxxxwww一片| 一本一道波多野结衣一区二区| 日本中文字幕在线2020| 亚洲影院污污.| 一区二区三区四区五区在线 | 亚洲手机在线| www.狠狠爱| 日韩美女视频在线| 自拍偷拍亚洲视频| 在线电影看在线一区二区三区| 丁香网亚洲国际| 影音先锋国产在线| 欧美激情一区二区三区在线视频观看 | 日本一区二区三区四区在线观看| 国内一区二区在线| 久久久久99精品成人片我成大片 | 高h视频免费观看| 精品亚洲永久免费精品| 成人精品在线| 日本一区二区黄色| 亚洲精品一卡二卡| 国产一级在线| 99国产精品久久久久老师| 首页综合国产亚洲丝袜| 精品97人妻无码中文永久在线 | 日韩免费性生活视频播放| 黑人巨大精品欧美一区二区桃花岛| 可以免费看的黄色网址|