n3tw4rl0k/ytinsights
GitHub: n3tw4rl0k/ytinsights
本地优先的 YouTube 视频语音内容搜索工具,通过索引字幕实现基于时间戳的精准定位。
Stars: 0 | Forks: 0
# YTInsights
YTInsights 是一款免费的、本地优先的 Web 应用程序,用于搜索 YouTube 视频中的语音内容。它可以直接获取 YouTube 字幕而无需下载媒体文件,为带有时间戳的单词建立索引,打开短语被说出的准确时刻,或者下载媒体文件以进行本地 Whisper 转录和视频剪辑。
它适用于 OSINT、数字取证、媒体监控、新闻报道、事实核查、学术研究、访谈分析、档案探索,以及在大量视频中寻找引语的来源。
所有操作都在您的计算机上本地运行。您的数据库、转录文本、下载的媒体文件、搜索索引和生成的剪辑都将保留在本地。
## 两种获取模式
| 模式 | 下载内容 | 速度与存储 | 搜索 | 视频剪辑 |
| --- | --- | --- | --- | --- |
| **仅转录文本** | YouTube 手动或自动字幕 | 最快;通常仅几 KB | 是,立即可搜 | 无可用媒体进行剪辑 |
| **媒体 + 本地转录** | 视频或音频,随后使用本地 Whisper 模型 | 较慢;占用磁盘、CPU/GPU 和 FFmpeg | 是,转录后可搜 | 是 |
当目标是回答诸如“这个人在哪里说了 X?”之类的问题时,建议以仅转录文本模式作为起点。仅在您还需要离线副本、剪辑片段或混合输出时,才下载视频。
## 功能
- 无需下载视频或音频即可下载并索引字幕。
- 为每个视频选择字幕语言;当 YouTube 提供自动字幕时,支持使用自动生成的字幕。
- 搜索单个单词或短语,并跳转至带有时间戳的 YouTube 搜索结果。
- 使用 YouTube Data API 搜索 YouTube 并同步频道视频列表。
- 从已保存的频道中批量获取转录文本、音频或视频。
- 使用 `faster-whisper` 在本地对下载的媒体进行转录,并支持词级时间戳。
- 按频道过滤转录文本搜索结果,并将 YouTube 搜索结果导出为 CSV。
- 从下载的视频源创建剪辑和视频混剪。
- 持久化的任务状态可恢复中断的本地工作。
- 本地 SQLite 存储,无需托管账户或付费服务。
## 快速开始:仅搜索转录文本
环境要求:
- Python 3.11 或 3.12
- 获取 YouTube 元数据或字幕时的网络访问权限
- 仅当您需要进行关键字搜索和频道同步时,才需要 YouTube Data API 密钥;直接通过 URL 获取字幕不需要该密钥
在仓库根目录下执行:
```
cd YTInsights
py -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install -r requirements.txt
Copy-Item ..\.env.example ..\.env
python manage.py migrate
python manage.py runserver
```
在 macOS 或 Linux 上,使用 `source .venv/bin/activate` 激活环境,并使用 `cp ../.env.example ../.env` 复制环境文件。
打开 `http://127.0.0.1:8000/`,进入 **YouTube 获取**,保持选中 **仅转录文本**,选择一种语言(例如 `en` 或 `ro`),然后提交一个 YouTube URL。一旦队列处理完成,即可使用 **转录文本搜索** 来查找单词和短语。
如果请求的语言不可用,当 YouTube 提供相关信息时,任务会报告可用的字幕语言。字幕的准确性和时间轴取决于源字幕本身。
## 启用媒体转录和视频剪辑
安装媒体扩展组件,而不是最小依赖要求:
```
pip install -r requirements-media.txt
```
安装 `ffmpeg` 并确保 `ffmpeg` 和 `ffprobe` 在 `PATH` 中可用。可选支持 CUDA 的环境配置;Whisper 可以在 CPU 上运行,但运行较大的模型速度会比较慢。
然后使用以下流程:
```
Download video/audio -> Process -> Transcribe -> Search or create a mix
```
## 配置
应用程序会从仓库根目录或 `YTInsights` 应用程序目录中加载 `.env` 文件。重要的环境变量包括:
| 变量 | 默认值 | 用途 |
| --- | --- | --- |
| `YOUTUBE_API_KEYS` | 空 | 用于 YouTube 搜索和频道同步的逗号分隔 API 密钥 |
| `YTINSIGHTS_STORAGE_DIR` | `YTInsights/storage` | 本地媒体、转录文本和混剪文件的存储路径 |
| `DATABASE_PATH` | `YTInsights/db.sqlite3` | SQLite 数据库路径 |
| `WHISPER_MODEL` | `medium` | 默认的本地转录模型 |
| `DOWNLOAD_NUM_WORKERS` | `1` | 并发获取任务的工作线程数 |
| `POSTPROCESS_NUM_WORKERS` | `1` | 并发媒体处理任务的工作线程数 |
| `DJANGO_DEBUG` | `1` | 本地开发模式 |
| `DJANGO_SECRET_KEY` | 仅限本地的回退值 | 在禁用调试模式时为必填项 |
| `DJANGO_ALLOWED_HOSTS` | 本地主机 | 逗号分隔的允许主机名 |
使用 SQLite 时请保持较低的工作线程数,尤其是在下载和索引大批量数据时。
## 测试
```
cd YTInsights
python manage.py test
python manage.py check
```
测试会模拟外部下载,涵盖 URL 验证、仅转录文本获取、字幕解析与索引、媒体处理、搜索行为以及混剪安全防护等内容。
## 数据与部署说明
- 生成的数据库、日志、媒体、转录文本、模型文件以及 `.env` 中的密钥都会被 Git 忽略。
- 本项目主要为受信任的本地计算机设计。如果将其暴露于网络中,请务必禁用调试模式,设置高强度的密钥,配置允许的主机名和 HTTPS,并保持身份验证处于开启状态。
- 后台任务目前在 Django 进程内运行。对于多用户或高吞吐量的部署环境,请使用生产级别的任务队列和数据库替换进程内工作线程和 SQLite。
- 仅转录文本模式要求 YouTube 上必须提供相关字幕。如果缺失字幕,该模式不会执行语音识别。
## 负责任的使用
YTInsights 不附属于 YouTube,也未获得 YouTube 的认可。请仅对您有权访问和处理的内容使用本工具。请尊重版权、隐私、平台条款、数据保留要求以及适用于您所在辖区或调查的法律。带有时间戳的搜索结果仅为研究线索;请务必对照原始录音及其上下文验证重要发现。
## 许可证
[MIT](LICENSE) — 允许使用、复制、修改、合并、发布、分发、再授权或销售副本,仅受许可证声明和免责声明的约束。
`YTInsights/static/` 下的前端资源已在本地打包,因此运行时不会有任何页面请求第三方的 CDN:[Bootstrap](https://getbootstrap.com/) (MIT)、[Chart.js](https://www.chartjs.org/) (MIT) 和 [SortableJS](https://github.com/SortableJS/Sortable) (MIT)。它们均保留其各自适用的许可证。
欢迎提交代码贡献和 Bug 报告。
标签:OSINT工具, Whisper, YouTube字幕抓取, 数据泄露, 本地优先, 视频剪辑, 语音识别搜索, 逆向工具