# 语音合成功能集成文档

## 概述

在 VoiceSelector 组件中集成了基于 `useFetchVoiceTtsV2` 接口的语音合成功能，实现了智能缓存、自动播放和错误回退机制。

## 核心功能

### 1. 智能缓存

- 基于配置参数生成唯一哈希值作为缓存键
- 相同配置的语音只生成一次，存储在内存中
- 支持手动清除缓存

### 2. 参数映射

- `tone` (音调) → `loudnessRate` (音量)
- `speed` (语速) → `speechRate` (语速)
- 参数范围：[-50, 100]

### 3. 播放逻辑

1. **优先级**：TTS 生成的语音 > 预设语音文件
2. **错误回退**：TTS 失败时自动使用预设语音
3. **状态管理**：生成中、播放中、已缓存等状态

## 文件结构

```
src/
├── hooks/
│   ├── useVoiceTTS.ts          # 语音合成核心 Hook
│   └── useCommon.ts            # TTS 接口 Hook
├── components/
│   └── features/
│       └── VoiceTTSPlayer.tsx  # 独立的语音播放器组件
├── app/
│   ├── (main)/create/components/Voice/
│   │   └── VoiceSelector.tsx   # 集成了 TTS 的语音选择器
│   ├── test-voice-tts/
│   │   └── page.tsx           # TTS 功能测试页面
│   └── test-voice-selector/
│       └── page.tsx           # VoiceSelector 测试页面
└── docs/
    └── VoiceTTSIntegration.md  # 本文档
```

## 使用方法

### 基础用法

```tsx
import { useVoiceTTS } from '@/hooks/useVoiceTTS'

function MyComponent() {
  const { generateAndPlay, isPlaying, isGenerating } = useVoiceTTS()

  const config = {
    text: '你好，这是测试语音',
    voiceType: 'S_zh_xiaoxiao_emotion',
    speechRate: 0,
    loudnessRate: 0,
  }

  return (
    <button onClick={() => generateAndPlay(config)} disabled={isGenerating}>
      {isGenerating ? '生成中...' : isPlaying(config) ? '播放中' : '播放'}
    </button>
  )
}
```

### VoiceSelector 集成

```tsx
import VoiceSelector from '@/app/(main)/create/components/Voice/VoiceSelector'

function CreateForm() {
  const [voiceConfig, setVoiceConfig] = useState({
    tone: 0, // 音调 [-50, 100]
    speed: 0, // 语速 [-50, 100]
    content: 'voice_id', // 语音类型ID
  })

  return (
    <VoiceSelector
      value={voiceConfig}
      onChange={setVoiceConfig}
      onPlay={handlePlayVoice} // 预设语音播放回调
      playing={isPlayingPreset} // 预设语音播放状态
    />
  )
}
```

## 接口说明

### useFetchVoiceTtsV2 参数

```typescript
interface FetchVoiceTtsV2Request {
  text?: string // 文本内容
  voiceType?: string // 语音类型 (以 S_ 开头)
  speechRate?: number // 语速 [-50, 100]
  loudnessRate?: number // 音量 [-50, 100]
}
```

### useVoiceTTS 选项

```typescript
interface UseVoiceTTSOptions {
  autoPlay?: boolean // 生成完成后自动播放，默认 true
  cacheEnabled?: boolean // 启用缓存，默认 true
  onPlayStart?: (configHash: string) => void
  onPlayEnd?: (configHash: string) => void
  onGenerateStart?: (config: FetchVoiceTtsV2Request) => void
  onGenerateEnd?: (config: FetchVoiceTtsV2Request, url: string) => void
  onError?: (error: string) => void
}
```

## 状态说明

### VoiceSelector 状态

- **未选择**：显示提示选择语音
- **已选择 + 未生成**：显示播放按钮
- **生成中**：显示动画和 "Generating..."
- **播放中**：显示播放动画
- **已缓存**：显示 "Cached" 标识
- **错误**：显示错误信息

### 播放优先级

1. TTS 生成的语音（如果有有效的 voiceType 和 voiceText）
2. 预设语音文件（回退机制）
3. 错误处理和用户提示

## 缓存机制

- **缓存键**：基于 `text + voiceType + speechRate + loudnessRate` 生成哈希
- **存储方式**：内存中存储（页面刷新后清除）
- **清除策略**：手动清除或组件卸载时清除

## 错误处理

1. **TTS 接口错误**：自动回退到预设语音
2. **播放错误**：显示错误信息给用户
3. **网络错误**：重试机制（在 useVoiceTTS 中实现）

## 测试页面

- `/test-voice-tts` - 独立的 TTS 功能测试
- `/test-voice-selector` - VoiceSelector 组件测试

## 性能优化

1. **缓存机制**：避免重复生成相同配置的语音
2. **懒加载**：只在用户点击播放时才生成语音
3. **错误回退**：TTS 失败时使用预设语音，不影响用户体验
4. **状态管理**：精确的状态控制，避免不必要的重渲染

## 扩展功能

- 支持自定义缓存策略
- 支持批量预生成常用语音
- 支持语音质量选择
- 支持播放进度控制
