flycut-caption
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(基于浏览器端 Transformers.js 运行,利用本地计算资源)
未说明

快速开始
FlyCut Caption - 基于AI的视频字幕编辑工具
✨ 功能
🎯 核心功能
- 🎤 智能语音识别: 基于Whisper模型的高精度语音转文字,支持多种语言
- ✂️ 可视化字幕编辑: 直观的字幕片段选择与删除界面
- 🎬 实时视频预览: 与字幕同步的视频播放器,支持间隔播放
- 📤 多格式导出: 支持SRT、JSON字幕格式及视频文件导出
- 🎨 字幕样式自定义: 自定义字幕字体、颜色、位置等样式
- 🌐 国际化支持: 组件化国际化设计,支持中文、英文以及自定义语言包(如日语示例)
🔧 技术特性
- ⚡ 现代技术栈: React 19 + TypeScript + Vite + Tailwind CSS
- 🧠 本地AI处理: 使用Hugging Face Transformers.js在浏览器端本地运行AI模型
- 🎯 Web Workers: ASR处理在后台线程中运行,不会阻塞主界面
- 📱 响应式设计: 现代化界面适配不同屏幕尺寸
- 🎪 组件化架构: 模块化设计,易于维护和扩展
🚀 快速开始
前置条件
- Node.js 18+
- pnpm(推荐)或 npm
安装步骤
- 克隆项目
git clone https://github.com/x007xyz/flycut-caption.git
cd flycut-caption
- 安装依赖
pnpm install
- 启动开发服务器
pnpm dev
- 打开浏览器
http://localhost:5173
生产环境构建
# 构建项目
pnpm build
# 预览构建结果
pnpm preview
📋 用户指南
1. 上传视频文件
- 支持格式:MP4、WebM、AVI、MOV
- 支持音频:MP3、WAV、OGG
- 将文件拖拽至上传区域或点击选择文件

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

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

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'
您还可以通过以下方式自定义外观:
- CSS 自定义属性:覆盖颜色和间距的 CSS 变量
- 自定义 CSS 类:使用
className属性应用自定义样式 - 主题配置:使用
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>
)
}
最佳实践
- 始终导入样式:组件需要 CSS 才能正常工作。
- 优雅地处理错误:实现适当的错误边界和用户反馈。
- 优化性能:在 SSR 应用中使用动态导入。
- 提供用户反馈:显示加载状态和进度指示器。
- 响应式设计:确保容器具有合适的高度/宽度。
- 可访问性:组件包含 ARIA 标签和键盘导航功能。
- 内存管理:在组件卸载时清理 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
🤝 贡献
我们欢迎各种形式的贡献!
如何贡献
- 分支本项目。
- 创建特性分支 (
git checkout -b feature/AmazingFeature)。 - 提交更改 (
git commit -m '添加一些 AmazingFeature')。 - 推送到分支 (
git push origin feature/AmazingFeature)。 - 创建拉取请求。
贡献类型
- 🐛 修复 bug。
- ✨ 新功能开发。
- 📝 文档改进。
- 🎨 UI/UX 优化。
- ⚡ 性能优化。
- 🌐 国际化翻译。
📝 许可证
本项目采用 MIT 许可证,并附加以下条款:
- ✅ 允许:个人、教育、商业用途。
- ✅ 允许:修改、分发、创建衍生作品。
- ❌ 禁止:移除或修改软件界面中的标志、水印、品牌元素。
- ❌ 禁止:隐藏或篡改署名声明。
如需移除品牌元素,请联系 FlyCut 团队以获得明确的书面许可。
详情请参阅 LICENSE 文件。
🙏 致谢
- Hugging Face - 优秀的 Transformers.js 库。
- OpenAI Whisper - 强大的语音识别模型。
- Shadcn/ui - 优雅的 UI 组件库。
- WebAV - 强大的 Web 音频/视频处理库。
📞 支持
- 📧 邮箱:x007xyzabc@gmail.com
- 🐛 问题:GitHub Issues
- 📖 文档:API 文档
如果这个项目对您有帮助,请给我们一颗⭐ Star!
由 FlyCut 团队用心打造。
常见问题
相似工具推荐
ML-For-Beginners
ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。
MoneyPrinterTurbo
MoneyPrinterTurbo 是一款利用 AI 大模型技术,帮助用户一键生成高清短视频的开源工具。只需输入一个视频主题或关键词,它就能全自动完成从文案创作、素材匹配、字幕合成到背景音乐搭配的全过程,最终输出完整的竖屏或横屏短视频。 这款工具主要解决了传统视频制作流程繁琐、门槛高以及素材版权复杂等痛点。无论是需要快速产出内容的自媒体创作者,还是希望尝试视频生成的普通用户,无需具备专业的剪辑技能或昂贵的硬件配置(普通电脑即可运行),都能轻松上手。同时,其清晰的 MVC 架构和对多种主流大模型(如 DeepSeek、Moonshot、通义千问等)的广泛支持,也使其成为开发者进行二次开发或技术研究的理想底座。 MoneyPrinterTurbo 的独特亮点在于其高度的灵活性与本地化友好性。它不仅支持中英文双语及多种语音合成,允许用户精细调整字幕样式和画面比例,还特别优化了国内网络环境下的模型接入方案,让用户无需依赖 VPN 即可使用高性能国产大模型。此外,工具提供批量生成模式,可一次性产出多个版本供用户择优,极大地提升了内容创作的效率与质量。
oh-my-openagent
oh-my-openagent(简称 omo)是一款强大的开源智能体编排框架,前身名为 oh-my-opencode。它致力于打破单一模型供应商的生态壁垒,解决开发者在构建 AI 应用时面临的“厂商锁定”难题。不同于仅依赖特定模型的封闭方案,omo 倡导开放市场理念,支持灵活调度多种主流大模型:利用 Claude、Kimi 或 GLM 进行任务编排,调用 GPT 处理复杂推理,借助 Minimax 提升响应速度,或发挥 Gemini 的创意优势。 这款工具特别适合希望摆脱平台限制、追求极致性能与成本平衡的开发者及研究人员使用。通过统一接口,用户可以轻松组合不同模型的长处,构建更高效、更具适应性的智能体系统。其独特的技术亮点在于“全模型兼容”架构,让用户不再受制于某一家公司的策略变动或定价调整,真正实现对前沿模型资源的自由驾驭。无论是构建自动化编码助手,还是开发多步骤任务处理流程,oh-my-openagent 都能提供灵活且稳健的基础设施支持,助力用户在快速演进的 AI 生态中保持技术主动权。
TTS
🐸TTS 是一款功能强大的深度学习文本转语音(Text-to-Speech)开源库,旨在将文字自然流畅地转化为逼真的人声。它解决了传统语音合成技术中声音机械生硬、多语言支持不足以及定制门槛高等痛点,让高质量的语音生成变得触手可及。 无论是希望快速集成语音功能的开发者,还是致力于探索前沿算法的研究人员,亦或是需要定制专属声音的数据科学家,🐸TTS 都能提供得力支持。它不仅预置了覆盖全球 1100 多种语言的训练模型,让用户能够即刻上手,还提供了完善的工具链,支持用户利用自有数据训练新模型或对现有模型进行微调,轻松实现特定风格的声音克隆。 在技术亮点方面,🐸TTS 表现卓越。其最新的 ⓍTTSv2 模型支持 16 种语言,并在整体性能上大幅提升,实现了低于 200 毫秒的超低延迟流式输出,极大提升了实时交互体验。此外,它还无缝集成了 🐶Bark、🐢Tortoise 等社区热门模型,并支持调用上千个 Fairseq 模型,展现了极强的兼容性与扩展性。配合丰富的数据集分析与整理工具,🐸TTS 已成为科研与生产环境中备受信赖的语音合成解决方案。
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 获
bark
Bark 是由 Suno 推出的开源生成式音频模型,能够根据文本提示创造出高度逼真的多语言语音、音乐、背景噪音及简单音效。与传统仅能朗读文字的语音合成工具不同,Bark 基于 Transformer 架构,不仅能模拟说话,还能生成笑声、叹息、哭泣等非语言声音,甚至能处理带有情感色彩和语气停顿的复杂文本,极大地丰富了音频表达的可能性。 它主要解决了传统语音合成声音机械、缺乏情感以及无法生成非语音类音效的痛点,让创作者能通过简单的文字描述获得生动自然的音频素材。无论是需要为视频配音的内容创作者、探索多模态生成的研究人员,还是希望快速原型设计的开发者,都能从中受益。普通用户也可通过集成的演示页面轻松体验其神奇效果。 技术亮点方面,Bark 支持商业使用(MIT 许可),并在近期更新中实现了显著的推理速度提升,同时提供了适配低显存 GPU 的版本,降低了使用门槛。此外,社区还建立了丰富的提示词库,帮助用户更好地驾驭模型生成特定风格的声音。只需几行 Python 代码,即可将创意文本转化为高质量音频,是连接文字与声音世界的强大桥梁。