对我说话-mcp
具备STT/TTS功能的语音MCP服务器 - Elysia后端 + React PWA前端
一个模型上下文协议(MCP)服务器,为Claude Code及其他MCP客户端添加语音功能。使用高质量的文本转语音(TTS)技术(ElevenLabs)并结合SSML增强(OpenAI)来朗读文本,同时通过语音识别(STT)技术(Google Gemini)来接收语音输入。
特性/特点
- 🎙️ 语音输入使用带有VAD(语音活动检测)和分块功能的Google Gemini STT(语音转文本)捕捉并转录语音
- 🔊 语音输出使用ElevenLabs将文本转换为语音,并通过OpenAI支持的SSML进行增强
- 🎭 表情符号“🎭”在中文中通常被解释为“小丑脸”或“化妆脸”,它代表一种带有表演、戏剧或娱乐意味的表情。这个符号可以用来表示开玩笑、搞怪、扮演角色或者是在某种情境下展现出夸张或戏剧化的情绪。 MCP集成两个工具(
speak和listen) 可从Claude Code及其他MCP客户端访问 - 💬 PWA(渐进式网页应用)界面基于React的控制台,具备对话历史记录和音频回放功能
- 🔐 多会话支持多个并发的MCP连接,每个连接拥有独立的对话历史记录
- ✅ 经过测试81项测试,涵盖模式、工具、存储和会话管理
建筑
这是一个包含以下内容的Bun单体仓库:
- 后端 (
apps/backend): 带有MCP SSE端点的Elysia服务器 - 前端 (
apps/frontend): 带有音频控件和对话界面的React PWA(渐进式网页应用) - 包裹;软件包:
- coreMCP工具,人工智能服务(文本转语音/语音转文本/语音合成标记语言),会话管理 - database用于存储对话和消息的Prisma存储层 - sharedZod模式和TypeScript类型 - platformWeb/Electron 适配器 - ui共享的React组件
快速入门
先决条件
- 面包 (v1.0+)
- API密钥:
- OpenAI(用于SSML丰富化) - ElevenLabs(用于文本转语音,TTS) - Google Gemini(用于语音转文本,STT)
安装
# Clone the repo
git clone https://github.com/CodingButter/speak2me-mcp.git
cd speak2me-mcp
# Install dependencies
bun install
# Set up database
cd packages/database
bun run db:generate
bun run db:push
cd ../..
# Configure API keys (backend)
cp apps/backend/.env.example apps/backend/.env
# Edit apps/backend/.env with your API keys发展
# Start both backend and frontend
bun run dev
# Or start individually
bun run dev:backend # Backend on http://localhost:3000
bun run dev:frontend # Frontend on http://localhost:5173测试
# Run all tests
bun test
# Watch mode
bun test:watch
# Coverage
bun test:coverageMCP 集成
将Claude Code(或其他MCP客户端)连接到语音服务器:
1. 启动后端
bun run dev:backend2. 添加到您的项目中 .mcp.json
{
"mcpServers": {
"voice": {
"url": "http://localhost:3000/sse/my-project-id"
}
}
}每个项目都可以有自己的 conversationId (最后一个路径段)以保持独立的历史记录。
3. 使用工具
Claude Code 将自动发现两种工具:
speak - 将文本转换为语音
{
text: string, // Required: text to speak
ssml?: string, // Optional: provide your own SSML
voiceId?: string, // Optional: ElevenLabs voice ID
model?: string, // Optional: ElevenLabs model
stream?: boolean // Optional: stream audio (default: true)
}listen - 录音并转录语音
{
mode: "auto" | "manual" | "ptt", // Required: listening mode
vadThreshold?: number, // Optional: VAD threshold (0-1)
minSilenceMs?: number, // Optional: silence duration
maxUtteranceMs?: number, // Optional: max utterance length
locale?: string // Optional: e.g., "en-US"
}项目结构
speak2me-mcp/
├── apps/
│ ├── backend/ # Elysia MCP server
│ │ ├── src/
│ │ │ ├── index.ts # Main server
│ │ │ ├── mcp/ # SSE transport, tool handlers
│ │ │ └── api/ # REST endpoints
│ │ └── package.json
│ └── frontend/ # React PWA
│ ├── src/
│ │ ├── components/ # UI components
│ │ ├── hooks/ # Audio capture hooks
│ │ └── services/ # Audio encoding
│ └── package.json
├── packages/
│ ├── core/ # MCP tools & services
│ │ └── src/
│ │ ├── mcp/ # handleSpeak, handleListen
│ │ ├── services/ # TTS, STT, SSML enhancer
│ │ ├── session/ # SessionManager
│ │ └── operations/ # CoreOperations
│ ├── database/ # Prisma storage
│ │ ├── prisma/
│ │ │ └── schema.prisma
│ │ └── src/storage.ts
│ ├── shared/ # Schemas & types
│ │ └── src/
│ │ ├── schemas.ts # Zod schemas
│ │ └── types.ts # TypeScript types
│ ├── platform/ # Web/Electron adapters
│ ├── ui/ # Shared components
│ └── config/ # Shared config
└── package.json # Root workspace脚本
根级别
bun run dev- 以开发模式启动两个应用程序bun run dev:backend- 仅启动后端bun run dev:frontend- 仅启动前端bun run build- 构建所有应用程序bun test- 运行所有测试bun run typecheck- 对所有包进行类型检查bun run lint- 检查所有包的lint(代码规范检查)bun run format- 使用 Prettier 格式化代码
后端
bun run dev- 开发者模式,支持热重载bun run build- 为生产构建bun run start- 开始生产构建bun test- 运行后端测试
前端
bun run dev- 开发服务器bun run build- 为生产环境构建bun run preview- 预览生产构建bun test- 运行前端测试
数据库
bun run db:generate- 生成 Prisma 客户端bun run db:push- 将模式推送到数据库bun run db:migrate- 创建迁移(数据库迁移或数据迁移等)bun run db:studio- 打开Prisma Studio
Git 钩子(Git Hooks)
这个项目使用预推送钩子来确保代码质量:
- 预推送(或:推送前处理)在允许推送到远程仓库之前运行所有测试
- 在代码推送之前,测试必须通过
- 位于
.git/hooks/pre-push
API密钥配置
钥匙可以以两种方式存放:
服务器端(推荐用于自托管)
创建 apps/backend/.env:
OPENAI_API_KEY=sk-...
ELEVENLABS_API_KEY=...
GEMINI_API_KEY=...客户端(PWA 用户界面)
用户可以在PWA设置面板中输入密钥。密钥按对话单独存储。
文档
- CLAUDE.md(文件名可译为“克劳德.md”,但通常文件名保持原样,不翻译) - 在此仓库中工作时的Claude代码使用说明
- 项目范围文件.md - 完整的产品需求和架构
技术栈
- 运行时面包卷
- 后端Elysia,@modelcontextprotocol/sdk,Prisma
- 前端React 18,Zustand,TailwindCSS,@ricky0123/vad-web
- 人工智能服务OpenAI,ElevenLabs,Google Gemini
- 验证佐德
- 测试面包测试
做出贡献
- 为仓库创建分支
- 创建一个特性分支(
git checkout -b feature/amazing-feature) - 做出你的更改
- 运行测试(
bun test) - 提交(
git commit -m 'Add amazing feature') - 推送到你的叉(即你的GitHub仓库副本)
git push origin feature/amazing-feature) - 提交一个拉取请求
许可证
麻省理工学院(MIT)
致谢/功劳
使用……构建 克劳德·科德
