父史诗: Epic 1 - STT SDK包结构设计 (docs/prd/epic-1-stt-sdk-package-structure.md)
🔄 In Progress - 添加UMD格式支持和测试页面需求
As a TypeScript开发者, I want 将现有的stt-demo应用中的语音转文字功能封装成通用的TypeScript SDK, so that 我可以在任何TypeScript项目中轻松使用语音转文字功能,而不依赖特定框架。
验收标准扩展: 在主应用中新增SDK测试页面,验证SDK在实际应用环境中的功能完整性,包括完整的音频传输功能和实时语音识别结果显示。
packages/ 目录结构,采用monorepo模式管理SDKstt-sdk-core 包的基础配置,包括package.json、tsconfig.json、vite.config.ts[x] Task 13: 创建UMD格式测试页面 (AC: 18)
[ ] Task 14: 为UMD演示页面添加音频源选择功能 (AC: 19)
[ ] Task 15: 实现频道管理功能 (AC: 20)
[ ] Task 16: 添加翻译控制功能 (AC: 21)
[ ] Task 17: 完善开始翻译和停止翻译控制 (AC: 22)
src/manager/stt/stt.ts (SttManager)src/manager/rtm/rtm.ts (RtmManager)src/manager/events.ts (AGEventEmitter)src/manager/stt/types.ts, src/manager/rtm/types.ts安全考虑:
保护用户隐私数据
核心包路径: packages/stt-sdk-core/
源码结构: src/core/, src/managers/, src/types/, src/utils/
构建输出: dist/目录,支持CommonJS和ES Module
依赖管理: 外部依赖agora-rtm,peerDependencies配置
AgoraRTC.getDevices()获取音频设备列表AgoraRTC.createMicrophoneAudioTrack()创建麦克风音频轨道AgoraRTC.setPlaybackDevice()设置播放设备AgoraRTC.createClient()创建客户端client.join()方法加入频道client.leave()方法离开频道user-published和user-unpublished事件管理用户状态主应用集成SDK示例:
// 在sdk-test页面中集成SDK
import { createSttSdk } from "@stt-demo/stt-sdk-core"
// SDK初始化配置(appId和certificate为必填)
const sdkConfig = {
appId: "your-app-id",
certificate: "your-certificate", // 必填字段
token: "your-token", // 可选字段
}
// 创建SDK实例
const sttSdk = createSttSdk(sdkConfig)
// 监听SDK事件
sttSdk.on("connected", () => {
console.log("SDK连接成功")
})
sttSdk.on("transcriptionResult", (result) => {
console.log("转录结果:", result)
})
路由配置示例:
// src/router/index.tsx 中添加sdk-test路由
const SdkTestPage = lazy(() => import('../pages/sdk-test'))
const UmdTestPage = lazy(() => import('../pages/umd-test'))
const routerItems = [
<Route path="/" element={<LoginPage />} />,
<Route path="/home" element={<HomePage />} />,
<Route path="/login" element={<LoginPage />} />,
<Route path="/sdk-test" element={<SdkTestPage />} />, // 新增路由
<Route path="/umd-test" element={<UmdTestPage />} />, // 新增UMD测试路由
<Route path="*" element={<NotFoundPage />} />,
]
音频源选择示例:
// 音频设备枚举和选择
const getAudioDevices = async () => {
const devices = await AgoraRTC.getDevices()
const microphones = devices.filter((device) => device.kind === "audioinput")
const speakers = devices.filter((device) => device.kind === "audiooutput")
return { microphones, speakers }
}
// 选择麦克风设备
const selectMicrophone = async (deviceId: string) => {
const audioTrack = await AgoraRTC.createMicrophoneAudioTrack({
microphoneId: deviceId,
})
return audioTrack
}
// 选择扬声器设备
const selectSpeaker = async (deviceId: string) => {
await AgoraRTC.setPlaybackDevice(deviceId)
}
频道管理示例:
// 创建和加入频道
const joinChannel = async (channelName: string, userId: number) => {
const client = AgoraRTC.createClient({ mode: "rtc", codec: "vp8" })
await client.join(appId, channelName, token, userId)
return client
}
// 离开频道
const leaveChannel = async (client: IAgoraRTCClient) => {
await client.leave()
}
// 监听用户加入/离开
client.on("user-joined", (user) => {
console.log("用户加入:", user.uid)
})
client.on("user-left", (user) => {
console.log("用户离开:", user.uid)
})
翻译控制示例:
// 配置多语言翻译
const translationConfig = {
languages: [
{
source: "zh-CN", // 源语言
target: ["en-US", "ja-JP", "ko-KR"], // 目标语言(可多项)
},
],
}
// 开始翻译
const startTranslation = async () => {
await sttManager.startTranscription(translationConfig)
}
// 停止翻译
const stopTranslation = async () => {
await sttManager.stopTranscription()
}
// 监听翻译结果
sttManager.on("transcriptionResult", (result) => {
console.log("原文:", result.transcribe1)
console.log("翻译结果:", result.translate1List)
})
问题识别:
sttDataChanged事件,而主应用监听的是textstreamReceived事件缺失功能对比:
| 功能 | 主应用 | SDK测试页面 | 修复后状态 |
|---|---|---|---|
| 实时转录结果显示 | ✅ 完整字幕组件 | ❌ 缺失 | ✅ 已修复 |
| 多语言支持显示 | ✅ 支持多语言 | ❌ 缺失 | ✅ 已修复 |
| 滚动字幕效果 | ✅ 动画效果 | ❌ 缺失 | ✅ 已修复 |
| 转录结果事件监听 | ✅ 完整事件处理 | ❌ 缺失 | ✅ 已修复 |
| Protobuf数据解析 | ✅ 内置parser | ❌ 缺失 | ✅ 已修复 |
修复方案实现:
添加Parser功能
更新RtcManagerAdapter
stream-message事件中添加parser调用完善SDK测试页面
textstreamReceived事件监听修复类型定义
修复效果:
问题分析:
修复方案:
// 更新SttSdkConfig接口
export interface SttSdkConfig {
appId: string
certificate: string // 新增必填字段
token?: string
logLevel?: 'debug' | 'info' | 'warn' | 'error'
}
// 更新SttManagerAdapter构造函数
constructor(rtmManager?: any, appId: string, certificate: string) { // 改为必填参数
super()
this._rtmManager = rtmManager
this._appId = appId // 直接赋值,不再检查
this._certificate = certificate // 直接赋值,不再检查
}
// 修复_apiGetAgoraToken方法
private async _apiGetAgoraToken(config: {
uid: string | number
channel: string
}): Promise<string | null> {
const data = {
appId: this._appId,
appCertificate: this._certificate, // 使用正确的certificate
channelName: channel,
expire: 7200,
src: 'web',
types: [1, 2],
uid: uid.toString(),
}
// ... 其他代码保持不变
}
packages/stt-sdk-core/tests/目录测试文件位置: e2e/sdk-test.spec.ts
主要测试场景:
SDK初始化测试
转录功能测试
事件系统测试
错误处理测试
测试数据示例:
// e2e/fixtures/sdk-test-data.ts
export const validAppId = "test-app-id"
export const invalidAppId = "invalid-app-id"
export const testLanguages = ["zh-CN", "en-US", "ja-JP"]
| Date | Version | Description | Author |
|---|---|---|---|
| 2025-09-25 | 1.0 | 初始故事创建 | Claude Code |
| 2025-09-25 | 1.1 | 更新测试框架信息:Vitest 3.2.4, Testing Library 16.3.0, Playwright 1.55.0 | Claude Code |
| 2025-09-25 | 1.2 | 更新测试策略引用:使用architecture/testing-strategy.md文档 | Claude Code |
| 2025-09-25 | 1.3 | 根据PO验证报告修复:添加史诗引用、澄清技术细节、修正包管理工具、增强安全考虑 | Bob (SM) |
| 2025-09-25 | 1.4 | 修正包管理工具:将yarn改为npm,与实际package.json保持一致 | Bob (SM) |
| 2025-09-25 | 1.5 | 重大纠正:发现SDK实现为模拟功能而非真实封装,需要重新实现真实Agora SDK集成 | Bob (SM) |
| 2025-09-25 | 1.6 | 完成真实功能集成:重新实现管理器适配器类,集成真实Agora SDK功能,修复所有测试 | Claude Code |
| 2025-09-25 | 1.7 | 更新故事状态:添加主应用集成SDK测试页面需求,将状态改为进行中 | Bob (SM) |
| 2025-09-25 | 1.8 | 完善实施细节:根据PO建议细化Task 8任务、添加SDK集成示例和E2E测试场景 | Bob (SM) |
| 2025-09-25 | 1.9 | 修复SDK初始化问题:添加CERTIFICATE支持,修复token生成功能 | Bob (SM) |
| 2025-09-25 | 2.0 | 完成基础任务:修复SDK初始化接口,完成主应用集成SDK测试页面 | Claude Code |
| 2025-09-25 | 2.1 | 添加typecheck脚本:为主应用添加npm run typecheck命令,修复TypeScript类型错误 | Claude Code |
| 2025-09-26 | 2.2 | 发现功能不完整:识别SDK缺少RtcManager集成,更新故事状态和验收标准 | Bob (SM) |
| 2025-09-26 | 2.3 | 识别实时语音识别结果显示缺失:发现SDK测试页面缺少转录结果显示功能,添加相关任务 | Bob (SM) |
| 2025-09-26 | 2.4 | 添加UMD格式支持:配置Vite生成UMD格式SDK包,更新故事添加UMD测试页面需求 | Bob (SM) |
| 2025-09-29 | 2.5 | 扩展UMD演示页面功能:为UMD演示页面添加音频源选择、频道管理、翻译控制功能需求 | Bob (SM) |
新增/修改的文件:
packages/stt-sdk-core/ - SDK核心包目录packages/stt-sdk-core/package.json - 包配置packages/stt-sdk-core/tsconfig.json - TypeScript配置packages/stt-sdk-core/vite.config.ts - 构建配置packages/stt-sdk-core/src/core/ - 核心模块packages/stt-sdk-core/src/managers/ - 管理器适配器packages/stt-sdk-core/src/types/ - 类型定义packages/stt-sdk-core/tests/ - 测试文件package.json - 根包workspaces配置更新已完成文件:
src/pages/sdk-test/ - SDK测试页面目录 ✅src/pages/sdk-test/index.tsx - SDK测试页面组件 ✅src/pages/sdk-test/index.module.scss - 页面样式文件 ✅e2e/sdk-test.spec.ts - SDK功能E2E测试文件 ✅src/router/index.tsx - 路由配置更新 ✅vite.config.ts - 构建配置更新 ✅tsconfig.json - TypeScript配置更新 ✅SDK核心包测试状态: ✅ 基础功能通过(缺少RtcManager相关测试)
packages/stt-sdk-core/tests/主要测试覆盖范围:
SDK测试页面E2E测试: ✅ 基础功能已配置完成(缺少音频传输测试)
tests/e2e/sdk-test.spec.ts测试场景覆盖:
类型检查状态: ✅ 全部通过
npm run typecheck构建状态: ✅ 成功
npm run build