flycut-caption

GitHub
1.4k 200 简单 3 次阅读 昨天NOASSERTION音频视频
AI 解读 由 AI 自动生成,仅供参考

FlyCut Caption 是一款基于 React 构建的开源视频字幕编辑组件,旨在通过 AI 技术简化视频字幕的生成、编辑与剪辑流程。它主要解决了传统字幕制作中语音转写耗时久、时间轴对齐困难以及预览修改不便等痛点,让用户能在浏览器中一站式完成从识别到导出的全过程。

这款工具非常适合前端开发者集成到自己的视频应用中,同时也适合需要高效处理多语言字幕的内容创作者、设计师及研究人员使用。其核心亮点在于集成了 Whisper 模型实现高精度的本地化语音识别,支持中、英等多种语言,且利用 Web Workers 技术在后台运行 AI 任务,确保界面操作流畅不卡顿。

FlyCut Caption 提供了直观的可视化编辑界面,用户可轻松选取、删除或合并字幕片段,并实时预览带有字幕的视频效果,甚至能直接剪掉多余片段导出精简后的视频。此外,它还支持自定义字幕样式、多格式导出(SRT/JSON/视频)以及完善的国际化设计。凭借现代化的技术栈(React 19 + TypeScript + Vite),FlyCut Caption 不仅功能强大,更具备优秀的可扩展性与响应式体验,是打造智能视频编辑功能的理想选择。

使用场景

某短视频创作者需要快速将一段 20 分钟的英文访谈视频剪辑成带中文字幕的精华片段,用于发布到社交媒体平台。

没有 flycut-caption 时

  • 流程割裂效率低:必须先在外部软件生成字幕,再导入剪辑软件对齐时间轴,最后导出视频,反复切换工具耗时极长。
  • 人工校对成本高:自动生成的字幕错误需手动逐行修改时间戳和文本,缺乏可视化的波形或分段辅助,极易出错。
  • 预览反馈滞后:无法实时预览删除片段后的视频连贯性,往往要等到最终渲染完成才发现节奏不对,返工率高。
  • 样式调整繁琐:修改字幕字体、颜色或位置需要重新设置参数并再次渲染,无法做到“所见即所得”的即时调整。
  • 本地隐私担忧:使用在线转录服务需上传原始视频素材,存在数据泄露风险,且受网络带宽限制处理速度慢。

使用 flycut-caption 后

  • 一站式闭环操作:直接在浏览器上传视频,利用内置 Whisper 模型本地生成字幕并同步剪辑,无需切换任何外部应用。
  • 可视化精准编辑:通过直观的时间轴界面批量选中并删除冗余片段,支持撤销重做,字幕与视频帧毫秒级精准对齐。
  • 实时跳过预览:开启预览模式后,播放器自动跳过已标记删除的片段,创作者可立即确认剪辑节奏和叙事流畅度。
  • 样式即时定制:拖拽调整字幕位置、颜色和背景,修改效果实时反映在视频画面上,导出前即可确定最终视觉效果。
  • 安全本地计算:基于 Transformers.js 在浏览器本地运行 AI 模型,素材无需上传云端,既保护隐私又避免了网络延迟。

flycut-caption 通过将 AI 识别、可视化剪辑与实时渲染融合于浏览器端,把原本数小时的视频字幕制作流程压缩至分钟级,极大提升了内容创作效率。

运行环境要求

操作系统
  • 未说明
GPU

不需要独立 GPU(基于浏览器端 Transformers.js 运行,利用本地计算资源)

内存

未说明

依赖
notes该工具为纯前端应用,无需安装 Python 环境。AI 语音识别模型通过 Transformers.js 在浏览器本地运行,利用 Web Workers 避免阻塞界面。主要依赖 Node.js 18+ 及 pnpm/npm 包管理器进行开发和构建。
python不需要
Node.js 18+
pnpm 或 npm
React 19
TypeScript
Vite
Tailwind CSS
Hugging Face Transformers.js
flycut-caption hero image

快速开始

FlyCut Caption - 基于AI的视频字幕编辑工具

FlyCut Caption

一款强大的AI驱动视频字幕编辑工具,专注于智能字幕生成、编辑和视频剪辑。

English | 中文

✨ 功能

🎯 核心功能

  • 🎤 智能语音识别: 基于Whisper模型的高精度语音转文字,支持多种语言
  • ✂️ 可视化字幕编辑: 直观的字幕片段选择与删除界面
  • 🎬 实时视频预览: 与字幕同步的视频播放器,支持间隔播放
  • 📤 多格式导出: 支持SRT、JSON字幕格式及视频文件导出
  • 🎨 字幕样式自定义: 自定义字幕字体、颜色、位置等样式
  • 🌐 国际化支持: 组件化国际化设计,支持中文、英文以及自定义语言包(如日语示例)

🔧 技术特性

  • ⚡ 现代技术栈: React 19 + TypeScript + Vite + Tailwind CSS
  • 🧠 本地AI处理: 使用Hugging Face Transformers.js在浏览器端本地运行AI模型
  • 🎯 Web Workers: ASR处理在后台线程中运行,不会阻塞主界面
  • 📱 响应式设计: 现代化界面适配不同屏幕尺寸
  • 🎪 组件化架构: 模块化设计,易于维护和扩展

🚀 快速开始

前置条件

  • Node.js 18+
  • pnpm(推荐)或 npm

安装步骤

  1. 克隆项目
git clone https://github.com/x007xyz/flycut-caption.git
cd flycut-caption
  1. 安装依赖
pnpm install
  1. 启动开发服务器
pnpm dev
  1. 打开浏览器
http://localhost:5173

生产环境构建

# 构建项目
pnpm build

# 预览构建结果
pnpm preview

📋 用户指南

1. 上传视频文件

  • 支持格式:MP4、WebM、AVI、MOV
  • 支持音频:MP3、WAV、OGG
  • 将文件拖拽至上传区域或点击选择文件

文件上传界面

上传完成后,进入ASR配置界面:

ASR设置界面

2. 生成字幕

  • 选择识别语言(支持中文、英文及其他语言)
  • 点击开始识别,AI将自动生成功能时间戳的字幕
  • 识别过程在后台运行,不影响界面操作

ASR处理界面

3. 编辑字幕

  • 选择片段: 从列表中选择要删除的字幕片段
  • 批量操作: 支持全选、批量删除、撤销删除等操作
  • 实时预览: 点击字幕片段可跳转到对应时间点
  • 历史记录: 支持撤销/重做操作

字幕编辑界面

4. 视频预览

  • 预览模式: 自动跳过已删除的片段以预览最终效果
  • 快捷键:
    • Space: 播放/暂停
    • ←/→: 倒退/快进5秒
    • Shift + ←/→: 倒退/快进10秒
    • ↑/↓: 调节音量
    • M: 静音/取消静音
    • F: 全屏

5. 字幕样式

  • 字体设置: 字体大小、粗细、颜色
  • 位置调整: 字幕显示位置、对齐方式
  • 背景样式: 背景颜色、透明度、边框
  • 实时预览: 所见即所得的样式调整

6. 导出结果

  • 字幕导出: SRT格式(通用字幕格式)、JSON格式
  • 视频导出:
    • 仅保留未删除的片段
    • 可选择将字幕内嵌至视频
    • 支持不同质量设置
    • 多种格式输出

🌐 国际化设计

FlyCut Caption采用组件化国际化设计,支持灵活的语言包管理和实时语言切换。该组件能够自动同步外部语言变化与内部UI组件。

内置语言包

import { FlyCutCaption, zhCN, enUS } from '@flycut/caption-react'

// 使用内置中文语言包
<FlyCutCaption
  config={{ language: 'zh' }}
  locale={zhCN}
/>

// 使用内置英文语言包
<FlyCutCaption
  config={{ language: 'en' }}
  locale={enUS}
/>

自定义语言包

import { FlyCutCaption, type FlyCutCaptionLocale } from '@flycut/caption-react'

// 创建自定义语言包(日语示例)
const customJaJP: FlyCutCaptionLocale = {
  common: {
    loading: '読み込み中...',
    error: 'エラー',
    success: '成功',
    confirm: '確認',
    cancel: 'キャンセル',
    ok: 'OK',
    // ... 更多常用翻译
  },
  components: {
    fileUpload: {
      dragDropText: 'ビデオファイルをここにドラッグするか、クリックして選択',
      selectFile: 'ファイルを選択',
      supportedFormats: 'サポート形式:',
      // ... 更多组件翻译
    },
    subtitleEditor: {
      title: '字幕エディター',
      addSubtitle: '字幕を追加',
      deleteSelected: '選択項目を削除',
      // ... 更多编辑器翻译
    },
    // ... 其他组件翻译
  },
  messages: {
    fileUpload: {
      uploadSuccess: 'ファイルアップロード成功',
      uploadFailed: 'ファイルアップロード失敗',
      // ... 更多消息翻译
    },
    // ... 其他消息翻译
  }
}

// 使用自定义语言包
<FlyCutCaption
  config={{ language: 'ja' }}
  locale={customJaJP}
/>

组件化语言切换

新的组件化方法在外置控件与内部组件之间实现了更好的语言同步:

import { useState } from 'react'
import { FlyCutCaption, zhCN, enUS, type FlyCutCaptionLocale } from '@flycut/caption-react'

function App() {
  const [currentLanguage, setCurrentLanguage] = useState('zh')
  const [currentLocale, setCurrentLocale] = useState<FlyCutCaptionLocale | undefined>(undefined)

  const handleLanguageChange = (language: string) => {
    console.log('Language switched to:', language)
    setCurrentLanguage(language)

    // Set corresponding language pack based on language
    switch (language) {
      case 'zh':
      case 'zh-CN':
        setCurrentLocale(zhCN)
        break
      case 'en':
      case 'en-US':
        setCurrentLocale(enUS)
        break
      case 'ja':
      case 'ja-JP':
        setCurrentLocale(customJaJP) // Custom Japanese pack
        break
      default:
        setCurrentLocale(undefined) // Use default language pack
    }
  }

  return (
    <div className="min-h-screen bg-background">
      <div className="container mx-auto py-8">
        <h1 className="text-3xl font-bold text-center mb-8">
          FlyCut Caption 国际化演示
        </h1>

        {/* External Language Controls */}
        <div className="mb-8 text-center space-y-4">
          <div>
            <h2 className="text-xl font-semibold mb-4">语言切换器</h2>
            <div className="flex justify-center gap-4">
              <button
                className={`px-4 py-2 rounded ${currentLanguage === 'zh' ? 'bg-primary text-primary-foreground' : 'bg-secondary'}`}
                onClick={() => handleLanguageChange('zh')}
              >
                中文 (内置)
              </button>
              <button
                className={`px-4 py-2 rounded ${currentLanguage === 'en' ? 'bg-primary text-primary-foreground' : 'bg-secondary'}`}
                onClick={() => handleLanguageChange('en')}
              >
                English (内置)
              </button>
              <button
                className={`px-4 py-2 rounded ${currentLanguage === 'ja' ? 'bg-primary text-primary-foreground' : 'bg-secondary'}`}
                onClick={() => handleLanguageChange('ja')}
              >
                日本語 (自定义)
              </button>
            </div>
          </div>

          <div className="bg-muted p-4 rounded-lg">
            <p className="text-sm">
              <strong>当前语言:</strong> {currentLanguage}
            </p>
            <p className="text-sm">
              <strong>语言包类型:</strong> {currentLocale ? '自定义语言包' : '内置语言包'}
            </p>
          </div>
        </div>

        {/* FlyCut Caption Component */}
        <div className="border rounded-lg p-4">
          <h2 className="text-xl font-semibold mb-4">FlyCut Caption 组件</h2>
          <FlyCutCaption
            config={{
              theme: 'auto',
              language: currentLanguage,
              enableThemeToggle: true,
              enableLanguageSelector: true  // Internal language selector will sync with external changes
            }}
            locale={currentLocale}
            onLanguageChange={handleLanguageChange}  // Sync internal changes back to external state
            onError={(error) => {
              console.error('Component error:', error)
            }}
            onProgress={(stage, progress) => {
              console.log(`Progress: ${stage} - ${progress}%`)
            }}
          />
        </div>
      </div>
    </div>
  )
}

可用语言包

语言 导入 描述
中文(简体) zhCN 简体中文
英语(美国) enUS English (United States)
默认 defaultLocale zhCN 相同

语言包 API

// Import language pack utilities
import { LocaleProvider, useLocale, useTranslation } from '@flycut/caption-react'

// Use LocaleProvider for nested components
<LocaleProvider language="zh" locale={zhCN}>
  <YourComponent />
</LocaleProvider>

// Access language pack context
const { t, setLanguage, registerLocale } = useLocale()

// Register custom language pack
registerLocale('fr', frenchLocale)

// Programmatic language switching
setLanguage('fr')

📚 详细国际化指南:请参阅 INTERNATIONALIZATION.md,了解关于语言包、自定义本地化及高级 i18n 功能的完整文档。

📚 使用指南

1. 安装与设置

# Install package
npm install @flycut/caption-react

# TypeScript projects don't need additional type packages
# Type definitions are included

2. 导入样式

该组件需要 CSS 样式才能正常工作:

import '@flycut/caption-react/styles'
// or specific CSS file
import '@flycut/caption-react/dist/caption-react.css'

3. 基本集成

import { FlyCutCaption } from '@flycut/caption-react'
import '@flycut/caption-react/styles'

function VideoEditor() {
  return (
    <div className="video-editor-container">
      <FlyCutCaption />
    </div>
  )
}

4. 事件处理

import { FlyCutCaption } from '@flycut/caption-react'

function VideoEditorWithEvents() {
  const handleFileSelected = (file: File) => {
    console.log('Selected file:', file.name, file.size)
  }

  const handleSubtitleGenerated = (subtitles: SubtitleChunk[]) => {
    console.log('Generated subtitles:', subtitles.length)
    // Save subtitles to backend
    saveSubtitles(subtitles)
  }

  const handleVideoProcessed = (blob: Blob, filename: string) => {
    // Handle processed video
    const url = URL.createObjectURL(blob)
    // Download or upload to server
    downloadFile(url, filename)
  }

  const handleError = (error: Error) => {
    // Handle errors gracefully
    console.error('FlyCut Caption error:', error)
    showErrorNotification(error.message)
  }

  return (
    <FlyCutCaption
      onFileSelected={handleFileSelected}
      onSubtitleGenerated={handleSubtitleGenerated}
      onVideoProcessed={handleVideoProcessed}
      onError={handleError}
    />
  )
}

5. 配置选项

import { FlyCutCaption } from '@flycut/caption-react'

function ConfiguredEditor() {
  const config = {
    // Theme settings
    theme: 'dark' as const,

    // Language settings
    language: 'zh-CN',
    asrLanguage: 'zh',

    // Feature toggles
    enableDragDrop: true,
    enableExport: true,
    enableVideoProcessing: true,
    enableThemeToggle: true,
    enableLanguageSelector: true,

    // File constraints
    maxFileSize: 1000, // 1GB
    supportedFormats: ['mp4', 'webm', 'mov']
  }

  return (
    <FlyCutCaption config={config} />
  )
}

6. 自定义样式

import { FlyCutCaption } from '@flycut/caption-react'
import './custom-styles.css'

function StyledEditor() {
  return (
    <FlyCutCaption
      className="my-custom-editor"
      style={{
        borderRadius: '8px',
        boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)'
      }}
    />
  )
}
/* custom-styles.css */
.my-custom-editor {
  --flycut-primary: #10b981;
  --flycut-border-radius: 12px;
}

.my-custom-editor .subtitle-item {
  border-radius: var(--flycut-border-radius);
}

📖 API 参考

FlyCutCaptionProps

属性 类型 默认值 描述
className string undefined 自定义 CSS 类名
style CSSProperties undefined 自定义内联样式
config FlyCutCaptionConfig defaultConfig 组件配置
locale FlyCutCaptionLocale undefined 自定义语言包
onReady () => void undefined 组件准备就绪时调用
onFileSelected (file: File) => void undefined 文件选择时调用
onSubtitleGenerated (subtitles: SubtitleChunk[]) => void undefined 字幕生成时调用
onSubtitleChanged (subtitles: SubtitleChunk[]) => void undefined 字幕更改时调用
onVideoProcessed (blob: Blob, filename: string) => void undefined 视频处理完成时调用
onExportComplete (blob: Blob, filename: string) => void undefined 导出完成时调用
onError (error: Error) => void undefined 发生错误时调用
onProgress (stage: string, progress: number) => void undefined 进度更新时调用
onLanguageChange (language: string) => void undefined 语言切换时调用

FlyCutCaptionConfig

属性 类型 默认值 描述
theme 'light' | 'dark' | 'auto' 'auto' 主题模式
language string 'zh-CN' 界面语言
asrLanguage string 'auto' ASR 识别语言
enableDragDrop boolean true 启用拖放上传文件功能
enableExport boolean true 启用导出功能
enableVideoProcessing boolean true 启用视频处理功能
enableThemeToggle boolean true 启用主题切换按钮
enableLanguageSelector boolean true 启用语言选择器
maxFileSize number 500 最大文件大小,单位为 MB
supportedFormats string[] ['mp4', 'webm', 'avi', 'mov', 'mp3', 'wav', 'ogg'] 支持的文件格式

🎨 样式

该组件自带内置样式,需导入:

import '@flycut/caption-react/styles'

您还可以通过以下方式自定义外观:

  1. CSS 自定义属性:覆盖颜色和间距的 CSS 变量
  2. 自定义 CSS 类:使用 className 属性应用自定义样式
  3. 主题配置:使用 theme 配置选项设置浅色/深色模式

CSS 变量

:root {
  --flycut-primary: #3b82f6;
  --flycut-background: #ffffff;
  --flycut-foreground: #1f2937;
  --flycut-muted: #f3f4f6;
  --flycut-border: #e5e7eb;
}

.dark {
  --flycut-background: #111827;
  --flycut-foreground: #f9fafb;
  --flycut-muted: #374151;
  --flycut-border: #4b5563;
}

🏗️ 项目架构

技术栈

  • 前端框架:React 19(带 Hooks)
  • 类型检查:TypeScript 5.8
  • 构建工具:Vite 7.1
  • 样式解决方案:Tailwind CSS 4.1 + Shadcn/ui
  • 状态管理:Zustand + React Context
  • AI 模型:Hugging Face Transformers.js
  • 视频处理:WebAV
  • 国际化:react-i18next

项目结构

src/
├── components/          # UI 组件
│   ├── FileUpload/     # 文件上传组件
│   ├── VideoPlayer/    # 视频播放器
│   ├── SubtitleEditor/ # 字幕编辑器
│   ├── ProcessingPanel/ # 处理面板
│   ├── ExportPanel/    # 导出面板
│   └── ui/             # 基础 UI 组件
├── hooks/              # 自定义 Hooks
├── services/           # 业务服务层
│   ├── asrService.ts   # ASR 语音识别服务
│   └── UnifiedVideoProcessor.ts # 视频处理服务
├── stores/             # 状态管理
│   ├── appStore.ts     # 应用程序全局状态
│   ├── historyStore.ts # 字幕历史记录
│   └── themeStore.ts   # 主题状态
├── types/              # TypeScript 类型定义
├── utils/              # 工具函数
├── workers/            # Web Workers
│   └── asrWorker.ts    # ASR 处理工作线程
└── locales/            # 国际化文件

核心模块

ASR 语音识别

  • 基于 Whisper 模型的本地语音识别
  • 使用 Web Workers 在后台处理,不阻塞主线程
  • 支持多种语言和音频格式
  • 生成精确的词级时间戳

字幕编辑器

  • 可视化的字幕片段管理
  • 支持批量选择和操作
  • 实时同步视频播放位置
  • 提供历史记录及撤销/重做功能

视频处理

  • 基于 WebAV 的本地视频处理
  • 支持区间剪辑和合并
  • 字幕嵌入功能
  • 多种输出格式和质量选项

🛠️ 开发指南

开发命令

# 启动开发服务器
pnpm dev

# 类型检查
pnpm run typecheck

# 代码检查
pnpm lint

# 构建项目
pnpm build

# 预览构建
pnpm preview

添加新组件

项目使用 Shadcn/ui 组件库:

pnpm dlx shadcn@latest add <component-name>

代码规范

  • TypeScript 严格模式
  • ESLint + React 相关规则
  • 函数式组件 + Hooks
  • 组件化和模块化设计

🎬 视频处理

该组件支持多种视频处理功能:

支持的格式

  • 视频:MP4、WebM、AVI、MOV
  • 音频:MP3、WAV、OGG

处理选项

  • 质量:低、中、高
  • 格式:MP4、WebM
  • 字幕处理:嵌入或单独文件
  • 音频保留:默认启用

💡 示例与最佳实践

完整的 React 应用程序

import React, { useState, useCallback } from 'react'
import { FlyCutCaption, zhCN, enUS, type FlyCutCaptionLocale } from '@flycut/caption-react'
import '@flycut/caption-react/styles'

function VideoEditorApp() {
  const [language, setLanguage] = useState<'zh' | 'en'>('zh')
  const [subtitles, setSubtitles] = useState([])
  const [isProcessing, setIsProcessing] = useState(false)

  const locale = language === 'zh' ? zhCN : enUS

  const handleLanguageChange = useCallback((newLang: string) => {
    setLanguage(newLang as 'zh' | 'en')
  }, [])

  const handleSubtitleGenerated = useCallback((newSubtitles) => {
    setSubtitles(newSubtitles)
    // 自动保存到本地存储
    localStorage.setItem('flycut-subtitles', JSON.stringify(newSubtitles))
  }, [])

  const handleProgress = useCallback((stage: string, progress: number) => {
    setIsProcessing(progress < 100)
  }, [])

  return (
    <div className="min-h-screen bg-gray-50">
      <header className="bg-white shadow-sm">
        <div className="max-w-7xl mx-auto px-4 py-4">
          <div className="flex justify-between items-center">
            <h1 className="text-2xl font-bold">视频编辑器</h1>
            <div className="flex gap-2">
              <button
                onClick={() => handleLanguageChange('zh')}
                className={language === 'zh' ? 'btn-primary' : 'btn-secondary'}
              >
                中文
              </button>
              <button
                onClick={() => handleLanguageChange('en')}
                className={language === 'en' ? 'btn-primary' : 'btn-secondary'}
              >
                英文
              </button>
            </div>
          </div>
        </div>
      </header>

      <main className="max-w-7xl mx-auto px-4 py-8">
        <div className="bg-white rounded-lg shadow-lg overflow-hidden">
          <FlyCutCaption
            config={{
              theme: 'auto',
              language,
              enableDragDrop: true,
              enableExport: true,
              maxFileSize: 1000
            }}
            locale={locale}
            onLanguageChange={handleLanguageChange}
            onSubtitleGenerated={handleSubtitleGenerated}
            onProgress={handleProgress}
            onError={(error) => {
              console.error('Error:', error)
              // 显示友好的错误提示
              alert('处理过程中发生错误,请重试')
            }}
          />
        </div>

        {isProcessing && (
          <div className="mt-4 text-center">
            <div className="inline-flex items-center px-4 py-2 bg-blue-100 rounded-lg">
              <div className="animate-spin rounded-full h-4 w-4 border-b-2 border-blue-600 mr-2"></div>
              处理中,请稍候...
            </div>
          </div>
        )}

        {subtitles.length > 0 && (
          <div className="mt-8 bg-white rounded-lg shadow p-6">
            <h2 className="text-lg font-semibold mb-4">生成的字幕({subtitles.length} 条)</h2>
            <div className="text-sm text-gray-600">
              字幕已自动保存到本地存储
            </div>
          </div>
        )}
      </main>
    </div>
  )
}

export default VideoEditorApp

Next.js 集成

// pages/editor.tsx
import dynamic from 'next/dynamic'
import { useState } from 'react'

// 动态导入以避免 SSR 问题
const FlyCutCaption = dynamic(
  () => import('@flycut/caption-react').then(mod => mod.FlyCutCaption),
  { ssr: false }
)

export default function EditorPage() {
  return (
    <div style={{ height: '100vh' }}>
      <FlyCutCaption
        config={{
          theme: 'auto',
          language: 'zh'
        }}
        onVideoProcessed={(blob, filename) => {
          // 处理视频处理结果
          const url = URL.createObjectURL(blob)
          window.open(url, '_blank')
        }}
      />
    </div>
  )
}

最佳实践

  1. 始终导入样式:组件需要 CSS 才能正常工作。
  2. 优雅地处理错误:实现适当的错误边界和用户反馈。
  3. 优化性能:在 SSR 应用中使用动态导入。
  4. 提供用户反馈:显示加载状态和进度指示器。
  5. 响应式设计:确保容器具有合适的高度/宽度。
  6. 可访问性:组件包含 ARIA 标签和键盘导航功能。
  7. 内存管理:在组件卸载时清理 Blob URL。

🔧 开发

先决条件

  • Node.js 18+
  • pnpm 8+

设置

git clone https://github.com/x007xyz/flycut-caption.git
cd flycut-caption
pnpm install

开发

# 启动开发服务器
pnpm dev

# 构建库
pnpm run build:lib

# 构建演示
pnpm run build:demo

# 检查代码风格
pnpm lint

# 运行测试应用
cd test-app && pnpm dev

🤝 贡献

我们欢迎各种形式的贡献!

如何贡献

  1. 分支本项目。
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)。
  3. 提交更改 (git commit -m '添加一些 AmazingFeature')。
  4. 推送到分支 (git push origin feature/AmazingFeature)。
  5. 创建拉取请求。

贡献类型

  • 🐛 修复 bug。
  • ✨ 新功能开发。
  • 📝 文档改进。
  • 🎨 UI/UX 优化。
  • ⚡ 性能优化。
  • 🌐 国际化翻译。

📝 许可证

本项目采用 MIT 许可证,并附加以下条款:

  • 允许:个人、教育、商业用途。
  • 允许:修改、分发、创建衍生作品。
  • 禁止:移除或修改软件界面中的标志、水印、品牌元素。
  • 禁止:隐藏或篡改署名声明。

如需移除品牌元素,请联系 FlyCut 团队以获得明确的书面许可。

详情请参阅 LICENSE 文件。

🙏 致谢

📞 支持


如果这个项目对您有帮助,请给我们一颗⭐ Star!

由 FlyCut 团队用心打造。

常见问题

相似工具推荐

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

MoneyPrinterTurbo

MoneyPrinterTurbo 是一款利用 AI 大模型技术,帮助用户一键生成高清短视频的开源工具。只需输入一个视频主题或关键词,它就能全自动完成从文案创作、素材匹配、字幕合成到背景音乐搭配的全过程,最终输出完整的竖屏或横屏短视频。 这款工具主要解决了传统视频制作流程繁琐、门槛高以及素材版权复杂等痛点。无论是需要快速产出内容的自媒体创作者,还是希望尝试视频生成的普通用户,无需具备专业的剪辑技能或昂贵的硬件配置(普通电脑即可运行),都能轻松上手。同时,其清晰的 MVC 架构和对多种主流大模型(如 DeepSeek、Moonshot、通义千问等)的广泛支持,也使其成为开发者进行二次开发或技术研究的理想底座。 MoneyPrinterTurbo 的独特亮点在于其高度的灵活性与本地化友好性。它不仅支持中英文双语及多种语音合成,允许用户精细调整字幕样式和画面比例,还特别优化了国内网络环境下的模型接入方案,让用户无需依赖 VPN 即可使用高性能国产大模型。此外,工具提供批量生成模式,可一次性产出多个版本供用户择优,极大地提升了内容创作的效率与质量。

55k|★★★☆☆|今天
开发框架语言模型Agent

oh-my-openagent

oh-my-openagent(简称 omo)是一款强大的开源智能体编排框架,前身名为 oh-my-opencode。它致力于打破单一模型供应商的生态壁垒,解决开发者在构建 AI 应用时面临的“厂商锁定”难题。不同于仅依赖特定模型的封闭方案,omo 倡导开放市场理念,支持灵活调度多种主流大模型:利用 Claude、Kimi 或 GLM 进行任务编排,调用 GPT 处理复杂推理,借助 Minimax 提升响应速度,或发挥 Gemini 的创意优势。 这款工具特别适合希望摆脱平台限制、追求极致性能与成本平衡的开发者及研究人员使用。通过统一接口,用户可以轻松组合不同模型的长处,构建更高效、更具适应性的智能体系统。其独特的技术亮点在于“全模型兼容”架构,让用户不再受制于某一家公司的策略变动或定价调整,真正实现对前沿模型资源的自由驾驭。无论是构建自动化编码助手,还是开发多步骤任务处理流程,oh-my-openagent 都能提供灵活且稳健的基础设施支持,助力用户在快速演进的 AI 生态中保持技术主动权。

48.4k|★★☆☆☆|今天
视频语言模型开发框架

TTS

🐸TTS 是一款功能强大的深度学习文本转语音(Text-to-Speech)开源库,旨在将文字自然流畅地转化为逼真的人声。它解决了传统语音合成技术中声音机械生硬、多语言支持不足以及定制门槛高等痛点,让高质量的语音生成变得触手可及。 无论是希望快速集成语音功能的开发者,还是致力于探索前沿算法的研究人员,亦或是需要定制专属声音的数据科学家,🐸TTS 都能提供得力支持。它不仅预置了覆盖全球 1100 多种语言的训练模型,让用户能够即刻上手,还提供了完善的工具链,支持用户利用自有数据训练新模型或对现有模型进行微调,轻松实现特定风格的声音克隆。 在技术亮点方面,🐸TTS 表现卓越。其最新的 ⓍTTSv2 模型支持 16 种语言,并在整体性能上大幅提升,实现了低于 200 毫秒的超低延迟流式输出,极大提升了实时交互体验。此外,它还无缝集成了 🐶Bark、🐢Tortoise 等社区热门模型,并支持调用上千个 Fairseq 模型,展现了极强的兼容性与扩展性。配合丰富的数据集分析与整理工具,🐸TTS 已成为科研与生产环境中备受信赖的语音合成解决方案。

45k|★★★☆☆|2天前
音频开发框架图像

LocalAI

LocalAI 是一款开源的本地人工智能引擎,旨在让用户在任意硬件上轻松运行各类 AI 模型,包括大语言模型、图像生成、语音识别及视频处理等。它的核心优势在于彻底打破了高性能计算的门槛,无需昂贵的专用 GPU,仅凭普通 CPU 或常见的消费级显卡(如 NVIDIA、AMD、Intel 及 Apple Silicon)即可部署和运行复杂的 AI 任务。 对于担心数据隐私的用户而言,LocalAI 提供了“隐私优先”的解决方案,确保所有数据处理均在本地基础设施内完成,无需上传至云端。同时,它完美兼容 OpenAI、Anthropic 等主流 API 接口,这意味着开发者可以无缝迁移现有应用,直接利用本地资源替代云服务,既降低了成本又提升了可控性。 LocalAI 内置了超过 35 种后端支持(如 llama.cpp、vLLM、Whisper 等),并集成了自主 AI 代理、工具调用及检索增强生成(RAG)等高级功能,且具备多用户管理与权限控制能力。无论是希望保护敏感数据的企业开发者、进行算法实验的研究人员,还是想要在个人电脑上体验最新 AI 技术的极客玩家,都能通过 LocalAI 获

44.8k|★★★☆☆|3天前
图像音频语言模型

bark

Bark 是由 Suno 推出的开源生成式音频模型,能够根据文本提示创造出高度逼真的多语言语音、音乐、背景噪音及简单音效。与传统仅能朗读文字的语音合成工具不同,Bark 基于 Transformer 架构,不仅能模拟说话,还能生成笑声、叹息、哭泣等非语言声音,甚至能处理带有情感色彩和语气停顿的复杂文本,极大地丰富了音频表达的可能性。 它主要解决了传统语音合成声音机械、缺乏情感以及无法生成非语音类音效的痛点,让创作者能通过简单的文字描述获得生动自然的音频素材。无论是需要为视频配音的内容创作者、探索多模态生成的研究人员,还是希望快速原型设计的开发者,都能从中受益。普通用户也可通过集成的演示页面轻松体验其神奇效果。 技术亮点方面,Bark 支持商业使用(MIT 许可),并在近期更新中实现了显著的推理速度提升,同时提供了适配低显存 GPU 的版本,降低了使用门槛。此外,社区还建立了丰富的提示词库,帮助用户更好地驾驭模型生成特定风格的声音。只需几行 Python 代码,即可将创意文本转化为高质量音频,是连接文字与声音世界的强大桥梁。

39.1k|★★★☆☆|2天前
音频