原生JavaScrip實(shí)現(xiàn)語音識(shí)別的示例詳解
用過微信的同學(xué)大部分都使用過語音轉(zhuǎn)文本功能吧?語音識(shí)別轉(zhuǎn)文本看似是很有難度的一個(gè)功能,但你知道嗎?使用原生 JavaScript 也能實(shí)現(xiàn)語音識(shí)別功能。
效果展示
SpeechRecognition
MDN文檔:developer.mozilla.org/en-US/docs/Web/API/SpeechRecognition
1、基礎(chǔ)定義
// 瀏覽器兼容性處理 const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; const recognition = new SpeechRecognition();
2、核心參數(shù)配置
參數(shù) | 類型 | 作用描述 |
---|---|---|
continuous | boolean | 是否持續(xù)識(shí)別(默認(rèn)false) |
interimResults | boolean | 是否返回臨時(shí)識(shí)別結(jié)果(默認(rèn)false) |
lang | string | 識(shí)別語言(如'zh-CN'/'en-US') |
maxAlternatives | number | 返回候選結(jié)果數(shù)量(默認(rèn)1) |
功能實(shí)現(xiàn)
1、實(shí)時(shí)結(jié)果處理
recognition.onresult = (event) => { const results = event.results; const resultIndex = event.resultIndex; // 臨時(shí)結(jié)果和最終結(jié)果分離處理 const current = results[resultIndex]; const isFinal = current.isFinal; if (isFinal) { // 處理最終結(jié)果 saveToDatabase(current[0].transcript); } else { // 實(shí)時(shí)顯示臨時(shí)結(jié)果 showInterimResult(current[0].transcript); } };
2、移動(dòng)端適配方案
// Android 自動(dòng)重啟識(shí)別 recognition.onend = () => { if (/Android/.test(navigator.userAgent)) { setTimeout(() => recognition.start(), 500); } }; // iOS 特殊處理 if (/iPhone|iPad/.test(navigator.userAgent)) { recognition.continuous = false; }
應(yīng)用場(chǎng)景
1、語音指令系統(tǒng)
recognition.onresult = (event) => { const command = event.results[0][0].transcript.toLowerCase(); if(command.includes('刷新')) location.reload(); if(command.includes('搜索')) triggerSearch(command); };
2、實(shí)時(shí)字幕生成
語音筆記應(yīng)用
Demo源碼
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>語音轉(zhuǎn)文字實(shí)時(shí)演示</title> <style> body { font-family: 'Segoe UI', sans-serif; max-width: 800px; margin: 2rem auto; padding: 0 1rem; } #status { width: 20px; height: 20px; border-radius: 50%; display: inline-block; margin-right: 10px; background: #ccc; } #status.active { background: #00c853; animation: pulse 1s infinite; } @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(0,200,83,0.4); } 70% { box-shadow: 0 0 0 10px rgba(0,200,83,0); } 100% { box-shadow: 0 0 0 0 rgba(0,200,83,0); } } #transcript { border: 1px solid #ddd; min-height: 150px; padding: 1rem; margin: 1rem 0; white-space: pre-wrap; background: #f8f9fa; } .interim { color: #666; font-style: italic; } </style> </head> <body> <h2>實(shí)時(shí)語音轉(zhuǎn)文字演示</h2> <div> <span id="status"></span> <button id="toggleBtn">開始識(shí)別</button> <span id="lang">當(dāng)前語言:中文</span> </div> <div id="transcript"></div> <script> const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)(); const transcriptDiv = document.getElementById('transcript'); const statusEl = document.getElementById('status'); const toggleBtn = document.getElementById('toggleBtn'); // 基礎(chǔ)配置 recognition.continuous = true; recognition.interimResults = true; recognition.lang = 'zh-CN'; // 狀態(tài)管理 let isRecognizing = false; // 事件處理 recognition.onstart = () => { isRecognizing = true; statusEl.classList.add('active'); toggleBtn.textContent = '停止識(shí)別'; }; recognition.onend = () => { isRecognizing = false; statusEl.classList.remove('active'); toggleBtn.textContent = '開始識(shí)別'; }; recognition.onresult = (event) => { let final = ''; let interim = ''; for (let i = event.resultIndex; i < event.results.length; i++) { const transcript = event.results[i][0].transcript; if (event.results[i].isFinal) { final += transcript + '\n'; } else { interim += transcript; } } transcriptDiv.innerHTML = final.replace(/\n/g, '<br>') + `<span class="interim">${interim}</span>`; }; recognition.onerror = (event) => { console.error('識(shí)別錯(cuò)誤:', event.error); alert(`識(shí)別錯(cuò)誤: ${event.error}`); }; // 按鈕控制 toggleBtn.addEventListener('click', () => { if (isRecognizing) { recognition.stop(); } else { recognition.start(); } }); // 權(quán)限檢測(cè) if (!('webkitSpeechRecognition' in window)) { transcriptDiv.innerHTML = '?? 當(dāng)前瀏覽器不支持語音識(shí)別功能'; toggleBtn.disabled = true; } </script> </body> </html>
瀏覽器兼容
實(shí)測(cè)edge可以正常識(shí)別,chrome需要梯子,局限性還是比較大。
到此這篇關(guān)于原生JavaScrip實(shí)現(xiàn)語音識(shí)別的示例詳解的文章就介紹到這了,更多相關(guān)JavaScrip語音識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
bootstrap中的導(dǎo)航條實(shí)例代碼詳解
本文通過實(shí)例代碼給大家介紹了bootstrap中的導(dǎo)航條,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05javascript將DOM節(jié)點(diǎn)添加到文檔的方法實(shí)例分析
這篇文章主要介紹了javascript將DOM節(jié)點(diǎn)添加到文檔的方法,對(duì)比分析了javascript的兩種節(jié)點(diǎn)創(chuàng)建的方法,涉及javascript節(jié)點(diǎn)操作及運(yùn)行時(shí)間計(jì)算的相關(guān)技巧,需要的朋友可以參考下2015-08-08微信公眾平臺(tái) 發(fā)送模板消息(Java接口開發(fā))
這篇文章主要介紹了微信公眾平臺(tái) 發(fā)送模板消息(Java接口開發(fā)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04javascript將數(shù)組插入到另一個(gè)數(shù)組中的代碼
下面的代碼主要功能就是將數(shù)組arr2插入到數(shù)組arr1的index位置,需要的朋友可以參考下2013-01-01JavaScript實(shí)現(xiàn)獲取設(shè)備網(wǎng)絡(luò)連接信息
作為前端開發(fā),做好用戶體驗(yàn)是很重要的,日常開發(fā)中我們經(jīng)常可以遇到用戶網(wǎng)速慢導(dǎo)致靜態(tài)資源加載慢,從而給影響用戶體驗(yàn),所以本文來和大家分享一個(gè)有趣的API,可以實(shí)現(xiàn)獲取網(wǎng)絡(luò)信息2023-05-05