# agent-voice-player **Repository Path**: ijboy/agent-voice-player ## Basic Information - **Project Name**: agent-voice-player - **Description**: 这是一个基于Java的Agent工具的语音播放工具库 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-08 - **Last Updated**: 2026-10-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # agent-voice [120000多种音频下载](https://pixabay.com/zh/sound-effects/search/%e9%80%9a%e7%9f%a5%e5%a3%b0%e9%9f%b3/) 智能体音频播放工具。作为纯通知角色 hook 运行,接收智能体工具(Claude Code / Codex 兼容格式)的钩子事件 JSON(stdin),按事件语义播放系统提示音、内置音频或实时 TTS 语音。任何失败都只记录日志并降级发声,绝不中断智能体工作流。 ## 编译产物 Jar 使用规则 ### 产物与前置 - **编译产物**:`build/libs/agent-voice-player-1.0.0.jar`(版本号见 `build.gradle.kts` 的 `version`;可执行 fat-jar,内置依赖与音频资源)。 - **前置要求**:JDK 21 及以上。 ### 命令行参数 | 参数 | 取值 | 说明 | |------|------|------| | `--mode` | `default` / `audio` / `tts` | 声音模式(见下文"声音模式") | | `--tts-provider` | `dashscope` / `volcengine` | TTS 服务商,默认 `dashscope` | | `--event` | 事件名 | 按事件名直接触发,免 stdin(本地调试用) | | `--event-file` | JSON 文件路径 | 读取事件 JSON 文件触发(本地调试用) | | `--spring.profiles.active=dev` | — | 打开日志便于本地调试;默认激活 `prod`(钩子调用场景静默) | ### 输入与输出 - **输入**:默认从 **stdin** 读取钩子事件 JSON;也可用 `--event` / `--event-file` 指定。 - **输出**:**stdout 固定打印 `{}`**(智能体钩子协议要求,任何异常都不会影响上游工作流);日志默认静默(prod profile)。 ### 钩子事件 JSON 载荷 | 字段 | 说明 | |------|------| | `hook_event_name` | 事件名(必填),见"支持的事件" | | `session_id` | 会话标识,用于跨进程共享状态(缺省 `default`) | | `tool_name` / `tool_input` | 工具调用上下文(权限询问语气、动作描述播报用) | | `transcript_path` | 会话转录 JSONL 路径(tts 模式的昵称提取 / 长响应总结用) | | `is_error` | `PostToolUse` 携带 `true` 时升级为失败事件 | | `permission_request` | 权限询问载荷 | ### 支持的事件 `SessionStart` / `SessionEnd` / `UserPromptSubmit` / `PostToolUse` / `PostToolUseFailure` / `PermissionRequest` / `PermissionDenied` / `SubagentStart` / `SubagentStop` / `Stop`。未知事件被静默忽略,仍输出 `{}`。 另识别特殊归一化事件:`PostToolUse` + `tool_name=AskUserQuestion`(Claude Code 内置 askUserQuestion 工具调用)归一化为 `ASK_USER_QUESTION`,对应音频 `sounds/ASK_USER_QUESTION.mp3`(缺失时回退蜂鸣);也可用 `--event AskUserQuestion` 本地调试。 ## 快速开始 ```bash # 构建(产物:build/libs/agent-voice-player-1.0.0.jar) ./gradlew build # 运行(模拟智能体工具调用,事件 JSON 走 stdin) echo '{"hook_event_name":"PostToolUse"}' | java -jar build/libs/agent-voice-player-1.0.0.jar --mode audio # 本地模拟脚本(参数:[事件名] [模式],默认 PostToolUse + audio) ./script/run-hook.sh SessionStart tts # bash .\script\run-hook.ps1 SessionStart tts # PowerShell script\run-hook.cmd SessionStart tts # CMD ``` 调试可用内置测试载荷(目录见 `src/main/resources/input/`): ```bash java -jar build/libs/agent-voice-player-1.0.0.jar --mode tts --event-file src/main/resources/input/SessionStart.input.json ``` ## 声音模式 `java -jar build/libs/agent-voice-player-1.0.0.jar --mode [--tts-provider ]` | 模式 | 说明 | |------|------| | `default` | 系统内置提示音(蜂鸣) | | `audio` | 内置固定音频文件,按事件枚举名匹配 `classpath:sounds/{事件枚举名}.{mp3\|wav}`(如 `TOOL_AFTER.mp3`),缺失时回退蜂鸣 | | `tts` | 实时语音合成,按事件语义动态生成 | ### tts 模式行为 | 事件 | 发声 | |------|------| | 会话开始 | 从系统提示词提取用户昵称生成欢迎语(异步延后,10s 超时);提取不到回退纯音频 | | 会话结束 | 告别语音 | | 用户提示词发送 / 工具调用前后失败 / 权限拒绝 / 子Agent起止 | 纯音频提示 | | 权限询问 | "正在执行xxx,需要申请xxx权限,请确认" 语气 | | 模型响应结束 | 响应时长超过阈值(默认 30s)时用大模型将正文总结成 ≤2 句语音;否则纯音频 | 任何 TTS/LLM 失败都会逐级回退:TTS → 内置音频 → 系统提示音,绝不中断智能体工作流。 ### 服务商与密钥 | 服务商 | TTS | LLM 摘要 | 环境变量 | |--------|-----|----------|----------| | dashscope(默认) | 百炼 CosyVoice HTTP | qwen-plus(OpenAI 兼容) | `DASHSCOPE_API_KEY` | | volcengine | 火山引擎语音合成 V3(单向流式 HTTP) | 豆包大模型(方舟 OpenAI 兼容) | `ARK_API_KEY` | 密钥只走环境变量或 `--agent-voice.*` 配置参数,不落盘。 官方文档指引: | 服务商 | 文档 | |--------|------| | dashscope | [语音合成模型总览](https://help.aliyun.com/zh/model-studio/tts-model/) · [CosyVoice HTTP API 参考](https://help.aliyun.com/zh/model-studio/cosyvoice-tts-http-api) · [获取与配置 API Key](https://help.aliyun.com/zh/model-studio/get-api-key) · [OpenAI 兼容接口](https://help.aliyun.com/zh/model-studio/compatibility-of-openai-with-dashscope) | | volcengine | [豆包语音合成大模型](https://www.volcengine.com/product/tts) · [方舟 Agent 计划-个人音色模型](https://ark.volcengine.com/region:cn-beijing/docs/ark/agent-plan-personal-voice-model) · [豆包语音接口文档(API Key)](https://docs.volcengine.com/docs/DoubaoVoice/APIinterfacedocumentation?lang=zh) · [火山方舟大模型(OpenAI 兼容)](https://docs.volcengine.com/docs/ark/compatible-with-openai-sdk?lang=zh) | ## 注册为智能体工具钩子 本工具适配所有提供 hook 机制的智能体工具(Claude Code / Codex 等),以下以 Claude Code 为例。在 `~/.claude/settings.json` 或项目 `.claude/settings.local.json` 的 `hooks` 中配置: ```json { "hooks": { "PostToolUse": [ { "type": "command", "command": "java -jar /path/to/agent-voice-player-1.0.0.jar --mode audio" } ] } } ``` ## 项目结构 ``` src/main/java/com/hookvoice/ ├── AgentVoiceApplication.java # Spring Boot 入口(--mode → --agent-voice.mode) ├── cli/AgentVoiceMain.java # stdin/参数钩子入口(--event / --event-file) ├── application/ # 应用编排(事件 → 发声决策 → 回退链) ├── domain/ # 领域层(事件、发声、语音、状态、TTS 抽象,零框架依赖) └── infrastructure/ # 音频播放、阿里/豆包 TTS+LLM、状态文件、装配 ``` 会话状态(响应计时、用户昵称)按 sessionId 持久化在 `~/.agent-voice/` 下,跨钩子进程共享。 ## 设计文档 - [设计规格](docs/superpowers/specs/2026-07-06-hook-voice-design.md) - [实现计划](docs/superpowers/plans/2026-07-06-hook-voice-plan.md) ## 技术栈 Java 21, Spring Boot 4.1(无 Web), Jackson 3, JDK HttpClient, Gradle Kotlin DSL ## 许可 MIT