Files
light-code/web/src/apps/muse/videos/store/README.md

2.6 KiB

Voice Store 使用说明

这个 Zustand store 管理语音记录列表,实现了以下功能:

主要特性

  1. 本地存储: 使用 IndexedDB 永久保存语音数据
  2. 当天记录: 自动获取和过滤当天的语音记录
  3. 音频 URL 管理: 将 base64 数据转换为 Blob URL 供播放使用
  4. 不保存 URL: 保存时不存储 URL 地址,避免无效引用
  5. 自动清理: 页面卸载时自动释放 Blob URL 资源

使用方法

基本使用

import { useVoiceStore } from '../store/voiceStore';

const MyComponent = () => {
  const { 
    voiceList, 
    isLoading, 
    error, 
    initialize, 
    addVoice, 
    updateVoice, 
    deleteVoice 
  } = useVoiceStore();

  // 初始化(通常在组件挂载时调用)
  useEffect(() => {
    initialize();
  }, [initialize]);

  // ... 组件逻辑
};

添加语音记录

// 通过 Blob 添加(推荐方式)
const audioBlob = new Blob([wavBuffer], { type: 'audio/wav' });
const newRecord = await addVoice(temporaryUrl, duration, audioBlob);

// 仅通过 URL 添加
const newRecord = await addVoice(url, duration);

更新记录

await updateVoice(recordId, {
  text: "识别的文字内容",
  speaker: "说话人名称"
});

删除记录

await deleteVoice(recordId);

数据流程

  1. 初始化: initialize() 从 IndexedDB 获取当天记录
  2. 生成 URL: 为每条记录的 base64 数据生成 Blob URL
  3. 添加记录: addVoice() 将音频转为 base64 保存到 IndexedDB
  4. 播放: 组件使用生成的 Blob URL 播放音频
  5. 清理: 页面卸载时释放所有 Blob URL

存储策略

  • IndexedDB: 存储 base64 编码的音频数据、文本、元数据
  • 内存: 临时存储 Blob URL 用于播放
  • 不存储: URL 地址不会保存到 IndexedDB

注意事项

  1. Blob URL 仅在当前会话有效,刷新页面后会重新生成
  2. 大量语音记录可能占用较多内存,建议定期清理旧记录
  3. 初始化时会自动过滤当天记录,跨天使用需要重新初始化
  4. 组件卸载时会自动清理资源,无需手动管理

错误处理

Store 提供了错误状态管理:

const { error, setError } = useVoiceStore();

// 检查错误状态
if (error) {
  console.error('语音操作失败:', error);
}

// 清除错误
setError(null);

性能优化

  • 使用 Zustand 的 devtools 进行调试
  • Blob URL 按需生成,避免内存浪费
  • IndexedDB 操作异步执行,不阻塞 UI
  • 批量操作支持,提高大量数据处理效率