简介:本文详细介绍如何通过JavaScript调用百度短语音识别API,涵盖环境准备、API配置、代码实现及错误处理,助力开发者快速集成语音转文字功能。
在智能交互场景中,语音转文字技术已成为提升用户体验的核心功能。百度短语音识别API凭借其高精度、低延迟的特性,成为开发者实现语音交互的首选工具。本文将深入解析如何通过JavaScript调用该API,从环境准备到实际开发,提供全流程技术指导。
百度短语音识别API专为短时语音(≤60秒)设计,支持实时流式识别与一次性文件识别两种模式。其核心优势包括:
典型应用场景涵盖智能客服、语音输入、语音搜索、IoT设备控制等。例如,在线教育平台可通过该API实现教师语音转文字的课堂记录功能。
开发者需完成以下步骤:
API Key和Secret Keynavigator.mediaDevices.getUserMedia()获取麦克风权限对于安全性要求较高的场景,建议通过后端服务中转请求:
// Node.js中转示例const express = require('express');const axios = require('axios');const app = express();app.post('/recognize', async (req, res) => {const { token, audio } = req.body;const response = await axios.post('https://vop.baidu.com/server_api', audio, {headers: { 'Content-Type': 'audio/wav' },params: { token }});res.json(response.data);});
使用Web Audio API捕获音频流:
async function startRecording() {const stream = await navigator.mediaDevices.getUserMedia({ audio: true });const audioContext = new (window.AudioContext || window.webkitAudioContext)();const source = audioContext.createMediaStreamSource(stream);const processor = audioContext.createScriptProcessor(1024, 1, 1);let audioChunks = [];processor.onaudioprocess = (e) => {const buffer = e.inputBuffer.getChannelData(0);audioChunks.push(new Float32Array(buffer));};source.connect(processor);processor.connect(audioContext.destination);return {stop: () => {source.disconnect();processor.disconnect();stream.getTracks().forEach(track => track.stop());return audioChunks;}};}
百度API要求音频格式为PCM(采样率16k/8k,16bit,单声道),需进行格式转换:
function convertToPCM(audioChunks, sampleRate = 16000) {const totalLength = audioChunks.reduce((acc, chunk) => acc + chunk.length, 0);const pcmBuffer = new Float32Array(totalLength);let offset = 0;audioChunks.forEach(chunk => {pcmBuffer.set(chunk, offset);offset += chunk.length;});// 实际项目中需使用WebAssembly或Worker进行16bit转换return encodeWAV(pcmBuffer, sampleRate); // 需实现WAV编码}
使用AK/SK生成访问令牌:
async function getAccessToken(apiKey, secretKey) {const authUrl = `https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=${apiKey}&client_secret=${secretKey}`;const response = await fetch(authUrl);return response.json();}function generateRequestParams(token, audioData, format = 'wav') {return {cuid: 'YOUR_DEVICE_ID', // 设备唯一标识token: token.access_token,len: audioData.length,format: format,rate: 16000, // 采样率channel: 1, // 单声道speech: btoa(String.fromCharCode(...new Uint8Array(audioData))), // Base64编码};}
async function recognizeSpeech() {try {// 1. 获取认证const tokenResponse = await getAccessToken('YOUR_API_KEY', 'YOUR_SECRET_KEY');// 2. 录音const recorder = await startRecording();setTimeout(() => {const audioChunks = recorder.stop();const pcmData = convertToPCM(audioChunks);// 3. 生成请求const params = generateRequestParams(tokenResponse, pcmData);const requestUrl = `https://vop.baidu.com/server_api?${new URLSearchParams(params)}`;// 4. 发送请求(实际需处理CORS)const response = await fetch(requestUrl, {method: 'POST',body: params.speech,headers: { 'Content-Type': 'application/x-www-form-urlencoded' }});const result = await response.json();console.log('识别结果:', result.result);}, 3000); // 录制3秒} catch (error) {console.error('识别失败:', error);}}
--disable-web-security(仅限测试)createBiquadFilter()进行预处理| 错误码 | 含义 | 解决方案 |
|---|---|---|
| 100 | 无效参数 | 检查token和音频格式 |
| 110 | 访问频率超限 | 增加请求间隔或升级套餐 |
| 111 | 服务器内部错误 | 实现重试机制(最多3次) |
| 130 | 音频时长超限 | 控制录音长度≤60秒 |
安全实践:
用户体验优化:
AnalyserNode)兼容性处理:
function checkBrowserSupport() {if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {alert('您的浏览器不支持录音功能,请使用Chrome/Firefox最新版');return false;}return true;}
通过WebSocket实现低延迟识别:
async function streamRecognize() {const token = (await getAccessToken()).access_token;const socket = new WebSocket(`wss://vop.baidu.com/ws_api?token=${token}`);socket.onopen = () => {const recorder = await startRecording();// 实现音频分块发送逻辑};socket.onmessage = (event) => {const result = JSON.parse(event.data);if (result.result) {console.log('实时结果:', result.result[0]);}};}
在请求头中添加Accept-Language: zh-CN,en-US,并在参数中设置lan=zh(中文为主)或lan=en(英文为主)。
百度API采用阶梯计价模式,开发者需注意:
通过本文提供的完整方案,开发者可在2小时内实现从录音到识别的全流程功能。实际开发中,建议先在测试环境验证API调用,再逐步集成到生产系统。对于高并发场景,可考虑使用百度智能云的WebSocket长连接方案,将并发性能提升3倍以上。