import { useState, useEffect } from "react" import { Card, Button, Input, Form, message, Space, Typography, Divider, Alert } from "antd" import { InfoCircleOutlined, PlayCircleOutlined, StopOutlined, ReloadOutlined, EyeOutlined, EyeInvisibleOutlined, } from "@ant-design/icons" import { useNavigate } from "react-router-dom" import { genRandomUserId } from "@/common" import styles from "./index.module.scss" // 导入SDK核心模块 import { SttSdk } from "../../../packages/stt-sdk-core/src" import type { ISttManagerAdapter, IRtmManagerAdapter, IRtcManagerAdapter, } from "../../../packages/stt-sdk-core/src/types" // 导入字幕显示组件 import CaptionDisplay from "./components/caption-display" const { Title, Text } = Typography const SdkTestPage = () => { const nav = useNavigate() const [messageApi, contextHolder] = message.useMessage() const [form] = Form.useForm() const [sdk, setSdk] = useState(null) const [sttManager, setSttManager] = useState(null) const [rtmManager, setRtmManager] = useState(null) const [rtcManager, setRtcManager] = useState(null) const [isSdkInitialized, setIsSdkInitialized] = useState(false) const [isSttManagerInitialized, setIsSttManagerInitialized] = useState(false) const [isRtcManagerJoined, setIsRtcManagerJoined] = useState(false) const [isTranscriptionActive, setIsTranscriptionActive] = useState(false) const [transcriptionStatus, setTranscriptionStatus] = useState("idle") const [testResults, setTestResults] = useState([]) const [sttData, setSttData] = useState({}) const [captionVisible, setCaptionVisible] = useState(true) const [captionLanguages, setCaptionLanguages] = useState(["live"]) // 添加测试日志 const addTestLog = (log: string) => { setTestResults((prev) => [...prev, `${new Date().toLocaleTimeString()}: ${log}`]) } // 监听STT数据变化 const onSttDataChanged = (data: any) => { console.log("[SDK Test] sttDataChanged:", data) setSttData(data) if (data.status === "start") { setIsTranscriptionActive(true) setTranscriptionStatus("active") addTestLog("📢 转录状态更新: 转录已开始") } else if (data.status === "end") { setIsTranscriptionActive(false) setTranscriptionStatus("stopped") addTestLog("📢 转录状态更新: 转录已停止") } // 如果有转录内容,记录到日志 if (data.transcribe1 || data.transcribe2) { addTestLog(`📝 转录结果: ${data.transcribe1 || data.transcribe2}`) } // 如果有翻译内容,记录到日志 if (data.translate1List?.length) { data.translate1List.forEach((text: string, index: number) => { if (text) { addTestLog(`🌐 翻译${index + 1}: ${text}`) } }) } if (data.translate2List?.length) { data.translate2List.forEach((text: string, index: number) => { if (text) { addTestLog(`🌐 翻译${index + 2}: ${text}`) } }) } } // 初始化SDK const initializeSdk = async (values: { appId: string certificate: string channel: string userName: string }) => { try { addTestLog("开始初始化SDK...") const newSdk = new SttSdk() await newSdk.initialize({ appId: values.appId, certificate: values.certificate, logLevel: "info", }) setSdk(newSdk) setIsSdkInitialized(true) addTestLog("✅ SDK初始化成功") // 创建管理器 - 先创建RTM管理器,然后创建STT管理器并传入RTM管理器 const rtmManager = newSdk.createRtmManager() const sttManager = newSdk.createSttManager(rtmManager) const rtcManager = newSdk.createRtcManager() // 监听RTM管理器的事件 rtmManager.on("sttDataChanged", onSttDataChanged) setSttManager(sttManager) setRtmManager(rtmManager) setRtcManager(rtcManager) addTestLog("✅ STT、RTM和RTC管理器创建成功") messageApi.success("SDK初始化成功") } catch (error) { addTestLog(`❌ SDK初始化失败: ${error}`) messageApi.error(`SDK初始化失败: ${error}`) } } // 初始化STT管理器(会自动加入RTM频道) const initializeSttManager = async () => { if (!sttManager || !form) return try { const values = form.getFieldsValue() addTestLog("开始初始化STT管理器...") await sttManager.init({ userId: genRandomUserId(), channel: values.channel, userName: values.userName, }) setIsSttManagerInitialized(true) addTestLog("✅ STT管理器初始化成功(已自动加入RTM频道)") messageApi.success("STT管理器初始化成功") } catch (error) { addTestLog(`❌ STT管理器初始化失败: ${error}`) messageApi.error(`STT管理器初始化失败: ${error}`) } } // 开始转录 const startTranscription = async () => { if (!sttManager) return try { addTestLog("开始语音转录...") setTranscriptionStatus("starting") await sttManager.startTranscription({ // languages: [{ source: "en-US", target: ["zh-CN"] }], languages: [{ source: "zh-CN" }], }) setIsTranscriptionActive(true) setTranscriptionStatus("active") addTestLog("✅ 语音转录已开始") messageApi.success("语音转录已开始") } catch (error) { addTestLog(`❌ 语音转录启动失败: ${error}`) setTranscriptionStatus("error") messageApi.error(`语音转录启动失败: ${error}`) } } // 停止转录 const stopTranscription = async () => { if (!sttManager) return try { addTestLog("停止语音转录...") setTranscriptionStatus("stopping") await sttManager.stopTranscription() setIsTranscriptionActive(false) setTranscriptionStatus("stopped") addTestLog("✅ 语音转录已停止") messageApi.success("语音转录已停止") } catch (error) { addTestLog(`❌ 语音转录停止失败: ${error}`) setTranscriptionStatus("error") messageApi.error(`语音转录停止失败: ${error}`) } } // 查询转录状态 const queryTranscription = async () => { if (!sttManager) return try { addTestLog("查询转录状态...") const result = await sttManager.queryTranscription() addTestLog(`📊 转录状态查询结果: ${JSON.stringify(result)}`) messageApi.info("转录状态查询完成,查看日志了解详情") } catch (error) { addTestLog(`❌ 转录状态查询失败: ${error}`) messageApi.error(`转录状态查询失败: ${error}`) } } // 加入RTC频道 const joinRtcChannel = async () => { if (!rtcManager) return try { const values = form.getFieldsValue() addTestLog("开始加入RTC频道...") await rtcManager.join({ channel: values.channel, userId: genRandomUserId(), }) setIsRtcManagerJoined(true) addTestLog("✅ RTC频道加入成功") messageApi.success("RTC频道加入成功") } catch (error) { addTestLog(`❌ RTC频道加入失败: ${error}`) messageApi.error(`RTC频道加入失败: ${error}`) } } // 创建音视频轨道 const createRtcTracks = async () => { if (!rtcManager) return try { addTestLog("开始创建音视频轨道...") await rtcManager.createTracks() addTestLog("✅ 音视频轨道创建成功") messageApi.success("音视频轨道创建成功") } catch (error) { addTestLog(`❌ 音视频轨道创建失败: ${error}`) messageApi.error(`音视频轨道创建失败: ${error}`) } } // 发布音视频流 const publishRtcStream = async () => { if (!rtcManager) return try { addTestLog("开始发布音视频流...") await rtcManager.publish() addTestLog("✅ 音视频流发布成功") messageApi.success("音视频流发布成功") } catch (error) { addTestLog(`❌ 音视频流发布失败: ${error}`) messageApi.error(`音视频流发布失败: ${error}`) } } // 清理资源 const cleanup = async () => { try { addTestLog("开始清理资源...") if (isTranscriptionActive && sttManager) { await stopTranscription() } if (sttManager) { await sttManager.destroy() setSttManager(null) setIsSttManagerInitialized(false) } if (rtmManager) { rtmManager.off("sttDataChanged", onSttDataChanged) await rtmManager.destroy() setRtmManager(null) } if (sdk) { await sdk.destroy() setSdk(null) setIsSdkInitialized(false) } addTestLog("✅ 资源清理完成") setTranscriptionStatus("idle") messageApi.success("资源清理完成") } catch (error) { addTestLog(`❌ 资源清理失败: ${error}`) messageApi.error(`资源清理失败: ${error}`) } } // 切换字幕显示 const toggleCaptionVisibility = () => { setCaptionVisible(!captionVisible) addTestLog(`📺 字幕显示: ${!captionVisible ? "开启" : "关闭"}`) } // 切换语言显示 const toggleLanguage = (language: string) => { setCaptionLanguages((prev) => { if (prev.includes(language)) { return prev.filter((lang) => lang !== language) } else { return [...prev, language] } }) addTestLog(`🌐 语言显示: ${captionLanguages.includes(language) ? "关闭" : "开启"} ${language}`) } // 返回主应用 const goToMainApp = () => { nav("/home") } // 组件卸载时清理资源 useEffect(() => { return () => { if (sdk) { cleanup() } } }, [sdk]) return (
{contextHolder}
🎯 SDK 功能测试页面 测试 STT SDK 核心功能的集成和兼容性
{transcriptionStatus === "idle" ? "等待开始转录" : transcriptionStatus === "starting" ? "正在启动转录..." : transcriptionStatus === "active" ? "转录进行中" : transcriptionStatus === "stopping" ? "正在停止转录..." : transcriptionStatus === "stopped" ? "转录已停止" : "状态异常"}
{sttData.status && (
任务ID: {sttData.taskId || "未设置"}
开始时间:{" "} {sttData.startTime ? new Date(sttData.startTime).toLocaleTimeString() : "未开始"}
持续时间: {sttData.duration ? `${sttData.duration / 1000}秒` : "未设置"}
)}
} type={ transcriptionStatus === "active" ? "success" : transcriptionStatus === "error" ? "error" : "info" } showIcon />
{testResults.length === 0 ? ( 暂无测试日志,请开始测试... ) : ( testResults.map((log, index) => (
{log}
)) )}
{testResults.length > 0 && ( )}
测试步骤:
  1. 填写 App ID 和 Certificate
  2. 点击"初始化 SDK"
  3. 初始化 STT 管理器和加入 RTM 频道
  4. 开始/停止转录测试
  5. 加入 RTC 频道并测试音频传输
  6. 查看测试日志了解详细结果
📺 实时转录显示 } className={styles.captionCard} extra={ } >
) } export default SdkTestPage