简介:本文深入探讨如何利用纯前端技术实现文字与语音的双向转换,涵盖Web Speech API、TTS/STT原理、性能优化及跨浏览器兼容方案,提供完整代码示例与实用建议。
在Web开发领域,文字与语音的双向转换曾长期依赖后端服务或第三方API,但随着浏览器技术的演进,纯前端方案已成为现实。本文将系统解析如何利用Web Speech API等现代浏览器特性,实现无需服务器的文字转语音(TTS)与语音转文字(STT)功能,为开发者提供从原理到实践的完整指南。
Web Speech API由W3C标准化,包含两个核心子接口:
现代浏览器(Chrome、Edge、Safari、Firefox最新版)均已完整支持,开发者可通过JavaScript直接调用,无需任何后端服务。
function textToSpeech(text, lang = 'zh-CN') {const utterance = new SpeechSynthesisUtterance(text);utterance.lang = lang;utterance.rate = 1.0; // 语速(0.1-10)utterance.pitch = 1.0; // 音高(0-2)// 可选:设置语音库(需浏览器支持)const voices = window.speechSynthesis.getVoices();const voice = voices.find(v => v.lang.includes(lang) && v.name.includes('Microsoft'));if (voice) utterance.voice = voice;speechSynthesis.speak(utterance);}// 使用示例textToSpeech('您好,欢迎使用纯前端语音合成', 'zh-CN');
getVoices()获取可用语音列表,优先选择本地安装的语音包
utterance.onerror = (event) => {console.error('语音合成错误:', event.error);// 回退方案:显示文字或调用备用语音库};
function getCompatibleVoice(lang) {const voices = speechSynthesis.getVoices();// 优先级:本地语音 > 云语音 > 默认语音return voices.find(v =>v.lang.startsWith(lang) &&(v.localService || !navigator.userAgent.includes('Firefox'))) || voices[0];}
function startSpeechRecognition(callback) {const recognition = new (window.SpeechRecognition ||window.webkitSpeechRecognition ||window.mozSpeechRecognition)();recognition.lang = 'zh-CN';recognition.interimResults = false; // 是否返回临时结果recognition.maxAlternatives = 1; // 返回的最佳结果数量recognition.onresult = (event) => {const transcript = event.results[0][0].transcript;callback(transcript);};recognition.onerror = (event) => {console.error('识别错误:', event.error);callback(null, event.error);};recognition.start();return recognition; // 返回实例以便停止}// 使用示例const rec = startSpeechRecognition((text, err) => {if (err) return alert('识别失败,请重试');console.log('识别结果:', text);rec.stop();});
连续识别:设置interimResults = true获取实时转写
recognition.onresult = (event) => {let interimTranscript = '';let finalTranscript = '';for (let i = event.resultIndex; i < event.results.length; i++) {const transcript = event.results[i][0].transcript;if (event.results[i].isFinal) {finalTranscript += transcript;} else {interimTranscript += transcript;}}updateUI(interimTranscript, finalTranscript);};
grammars属性限制识别范围(需构建SRGS语法文件)continuous = false自动停止长时间静音recognition.stop()释放资源
/speech-demo/├── index.html # 基础HTML结构├── style.css # 响应式样式├── tts.js # 文字转语音模块├── stt.js # 语音转文字模块├── utils.js # 工具函数(浏览器检测、语音库管理等)└── fallback.js # 降级方案实现
语音输入按钮:
<button id="recordBtn" class="speech-btn"><span id="btnText">开始录音</span></button><div id="transcript" class="transcript-box"></div>
document.getElementById('recordBtn').addEventListener('click', async () => {const btn = event.target;const isRecording = btn.dataset.recording === 'true';if (isRecording) {recognition.stop();btn.dataset.recording = 'false';btnText.textContent = '开始录音';} else {const text = await startContinuousRecognition();btn.dataset.recording = 'true';btnText.textContent = '停止录音';}});
function logAvailableVoices() {const voices = speechSynthesis.getVoices();console.table(voices.map(v => ({name: v.name,lang: v.lang,local: v.localService})));}
voiceschanged事件
window.speechSynthesis.onvoiceschanged = () => {// 此时可安全调用getVoices()};
<input type="text">聚焦后才能识别纯前端文字语音互转技术已进入成熟阶段,开发者只需掌握Web Speech API的核心方法,结合适当的兼容性处理和用户体验优化,即可构建出功能完备的语音交互应用。随着浏览器能力的不断提升,未来将有更多创新场景等待探索。