如何通过Python API集成Watson Assistant语音功能(含TTS/STT)及聊天窗口麦克风
实现带语音功能的Watson Assistant网页集成方案
核心思路
放弃Python API中转的复杂方式,直接在前端结合Watson Speech to Text(STT)和Text to Speech(TTS)服务,与已嵌入的Watson Assistant聊天窗口联动,快速实现麦克风语音交互功能。
步骤1:配置Watson语音服务
- 在IBM Cloud上创建Speech to Text和Text to Speech服务,获取各自的API密钥与服务端点(Endpoint),确保服务区域与Watson Assistant保持一致。
步骤2:修改网页嵌入代码,添加语音逻辑
在已有的Watson Assistant嵌入代码基础上,新增麦克风录音、语音转文字、助手交互、文字转语音播报的完整逻辑,示例代码如下:
<!DOCTYPE html> <html> <head> <title>Watson Voice Assistant</title> <script src="https://web-chat.global.assistant.watson.appdomain.cloud/versions/preview-2023-09/web-chat.js"></script> </head> <body> <button id="micBtn" style="padding: 10px; font-size: 16px;">🎤 开始说话</button> <div id="watson-chat-container"></div> <script> // 初始化Watson Assistant聊天窗口 window.watsonAssistantChatOptions = { integrationID: "YOUR_INTEGRATION_ID", // 替换为你的集成ID region: "YOUR_REGION", // 替换为服务区域(如us-south) serviceInstanceID: "YOUR_SERVICE_INSTANCE_ID", // 替换为服务实例ID onLoad: function(instance) { instance.render(); } }; setTimeout(function(){ const t=document.createElement('script'); t.src='https://web-chat.global.assistant.watson.appdomain.cloud/versions/preview-2023-09/web-chat-runtime.js'; document.head.appendChild(t); }); // 语音服务配置 const sttApiKey = "YOUR_STT_API_KEY"; // 替换为STT的API密钥 const sttEndpoint = "YOUR_STT_ENDPOINT"; // 替换为STT服务端点 const ttsApiKey = "YOUR_TTS_API_KEY"; // 替换为TTS的API密钥 const ttsEndpoint = "YOUR_TTS_ENDPOINT"; // 替换为TTS服务端点 let mediaRecorder; let audioChunks = []; const micBtn = document.getElementById('micBtn'); // 麦克风按钮交互 micBtn.addEventListener('click', async () => { if (micBtn.textContent.includes('开始')) { micBtn.textContent = '🔴 停止说话'; const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); mediaRecorder = new MediaRecorder(stream); audioChunks = []; mediaRecorder.ondataavailable = (event) => audioChunks.push(event.data); mediaRecorder.onstop = async () => { const audioBlob = new Blob(audioChunks, { type: 'audio/wav' }); const transcript = await speechToText(audioBlob); if (transcript) { window.watsonAssistantChatOptions.onLoad(instance => { instance.sendMessage({ input: { text: transcript } }); }); } }; mediaRecorder.start(); } else { micBtn.textContent = '🎤 开始说话'; mediaRecorder.stop(); } }); // 监听助手回复,自动播报 document.addEventListener('watsonAssistantChatMessage', (event) => { const message = event.data.message; if (message.source === 'assistant' && message.input?.text) { textToSpeech(message.input.text); } }); // STT:音频转文字 async function speechToText(audioBlob) { const formData = new FormData(); formData.append('audio', audioBlob); formData.append('content_type', 'audio/wav'); try { const response = await fetch(`${sttEndpoint}/v1/recognize?model=en-US_BroadbandModel`, { method: 'POST', headers: { 'Authorization': `Basic ${btoa(`apikey:${sttApiKey}`)}` }, body: formData }); const data = await response.json(); return data.results?.[0]?.alternatives?.[0]?.transcript || null; } catch (error) { console.error('STT调用失败:', error); return null; } } // TTS:文字转语音播放 async function textToSpeech(text) { try { const response = await fetch(`${ttsEndpoint}/v1/synthesize?voice=en-US_MichaelV3Voice`, { method: 'POST', headers: { 'Authorization': `Basic ${btoa(`apikey:${ttsApiKey}`)}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ text: text }) }); const audioBlob = await response.blob(); const audio = new Audio(URL.createObjectURL(audioBlob)); audio.play(); } catch (error) { console.error('TTS调用失败:', error); } } </script> </body> </html>
关键注意事项
- 替换所有
YOUR_XXX占位符为实际服务凭证,包括Watson Assistant和语音服务的ID、密钥、端点。 - 调试需用HTTPS环境(localhost除外),否则浏览器会拒绝麦克风权限。
- 可按需替换STT模型(如中文用
zh-CN_BroadbandModel)和TTS语音(如中文女声zh-CN_LiNaVoice)。
调试技巧
- 打开浏览器开发者工具Console面板,排查API调用错误(如凭证失效、跨域问题)。
- 先单独测试STT/TTS功能,确认音频转文字、文字转语音正常后,再与Watson Assistant联动。
内容的提问来源于stack exchange,提问作者Shaik Saad Abdul Tawwab
相关产品推荐
相关产品推荐

