You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:05:10