Commit
·
948605a
1
Parent(s):
73e1c72
commit
Browse files- README.md +67 -5
- index.html +80 -18
- parse_markdown.py +281 -0
- projects.json +638 -0
- projects.md +632 -0
- script.js +197 -0
- style.css +295 -18
README.md
CHANGED
|
@@ -1,10 +1,72 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: Awesome Whisper Apps Browser
|
| 3 |
+
emoji: 🎙️
|
| 4 |
+
colorFrom: purple
|
| 5 |
+
colorTo: blue
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
---
|
| 9 |
|
| 10 |
+
# Awesome Whisper Apps Browser
|
| 11 |
+
|
| 12 |
+
An interactive browser for discovering applications, tools, and resources built with [OpenAI Whisper](https://github.com/openai/whisper) - a robust automatic speech recognition (ASR) system.
|
| 13 |
+
|
| 14 |
+
## Features
|
| 15 |
+
|
| 16 |
+
- **Browse by Platform**: Filter projects by Linux, macOS, Windows, Android, iOS, Cross-Platform, and Web
|
| 17 |
+
- **Browse by Use Case**: Find projects for Voice Typing, Subtitles & Captioning, Meetings & Productivity, Real-Time Transcription, Developer Tools, and Model Variants
|
| 18 |
+
- **Search**: Quickly find projects by name or description
|
| 19 |
+
- **Sort**: Organize projects by name, platform, or use case
|
| 20 |
+
|
| 21 |
+
## Data Source
|
| 22 |
+
|
| 23 |
+
The project data is sourced from the `projects.md` awesome list and automatically parsed into a structured JSON format using `parse_markdown.py`.
|
| 24 |
+
|
| 25 |
+
To update the projects database:
|
| 26 |
+
|
| 27 |
+
```bash
|
| 28 |
+
python parse_markdown.py
|
| 29 |
+
```
|
| 30 |
+
|
| 31 |
+
This will regenerate `projects.json` from the latest `projects.md` content.
|
| 32 |
+
|
| 33 |
+
## Project Structure
|
| 34 |
+
|
| 35 |
+
```
|
| 36 |
+
.
|
| 37 |
+
├── index.html # Main HTML interface
|
| 38 |
+
├── style.css # Styles for the application
|
| 39 |
+
├── script.js # JavaScript for filtering and display
|
| 40 |
+
├── projects.md # Source data (awesome list format)
|
| 41 |
+
├── projects.json # Parsed project data
|
| 42 |
+
├── parse_markdown.py # Script to convert MD to JSON
|
| 43 |
+
└── README.md # This file
|
| 44 |
+
```
|
| 45 |
+
|
| 46 |
+
## Development
|
| 47 |
+
|
| 48 |
+
The Space uses a static HTML/CSS/JavaScript approach:
|
| 49 |
+
|
| 50 |
+
1. **Data Layer**: `projects.md` serves as the single source of truth
|
| 51 |
+
2. **Parser**: `parse_markdown.py` extracts structured data
|
| 52 |
+
3. **Frontend**: Vanilla JavaScript loads and filters the JSON data
|
| 53 |
+
|
| 54 |
+
## About Whisper
|
| 55 |
+
|
| 56 |
+
Whisper is OpenAI's robust automatic speech recognition system trained on 680,000 hours of multilingual and multitask supervised data.
|
| 57 |
+
|
| 58 |
+
- [Official Repository](https://github.com/openai/whisper)
|
| 59 |
+
- [Research Paper](https://arxiv.org/abs/2212.04356)
|
| 60 |
+
- [Hugging Face Models](https://huggingface.co/collections/openai/whisper-release)
|
| 61 |
+
|
| 62 |
+
## Contributing
|
| 63 |
+
|
| 64 |
+
To add new projects:
|
| 65 |
+
|
| 66 |
+
1. Edit `projects.md` following the existing format
|
| 67 |
+
2. Run `python parse_markdown.py` to regenerate the JSON
|
| 68 |
+
3. Commit both `projects.md` and `projects.json`
|
| 69 |
+
|
| 70 |
+
## License
|
| 71 |
+
|
| 72 |
+
This project browser is created to showcase the Awesome Whisper Apps collection. Individual projects have their own licenses.
|
index.html
CHANGED
|
@@ -1,19 +1,81 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
</html>
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Awesome Whisper Apps - Project Browser</title>
|
| 7 |
+
<link rel="stylesheet" href="style.css">
|
| 8 |
+
</head>
|
| 9 |
+
<body>
|
| 10 |
+
<header>
|
| 11 |
+
<div class="container">
|
| 12 |
+
<h1>🎙️ Awesome Whisper Apps</h1>
|
| 13 |
+
<p class="subtitle">A curated collection of applications built with OpenAI Whisper for speech recognition</p>
|
| 14 |
+
</div>
|
| 15 |
+
</header>
|
| 16 |
+
|
| 17 |
+
<main class="container">
|
| 18 |
+
<section class="filters">
|
| 19 |
+
<h2>Browse Projects</h2>
|
| 20 |
+
<div class="filter-group">
|
| 21 |
+
<div class="filter-section">
|
| 22 |
+
<h3>By Platform</h3>
|
| 23 |
+
<div class="filter-buttons" id="platform-filters">
|
| 24 |
+
<button class="filter-btn active" data-filter="all" data-type="platform">All Platforms</button>
|
| 25 |
+
<button class="filter-btn" data-filter="linux" data-type="platform">Linux</button>
|
| 26 |
+
<button class="filter-btn" data-filter="macos" data-type="platform">macOS</button>
|
| 27 |
+
<button class="filter-btn" data-filter="windows" data-type="platform">Windows</button>
|
| 28 |
+
<button class="filter-btn" data-filter="android" data-type="platform">Android</button>
|
| 29 |
+
<button class="filter-btn" data-filter="ios" data-type="platform">iOS</button>
|
| 30 |
+
<button class="filter-btn" data-filter="cross-platform" data-type="platform">Cross-Platform</button>
|
| 31 |
+
<button class="filter-btn" data-filter="web" data-type="platform">Web</button>
|
| 32 |
+
</div>
|
| 33 |
+
</div>
|
| 34 |
+
|
| 35 |
+
<div class="filter-section">
|
| 36 |
+
<h3>By Use Case</h3>
|
| 37 |
+
<div class="filter-buttons" id="usecase-filters">
|
| 38 |
+
<button class="filter-btn active" data-filter="all" data-type="usecase">All Use Cases</button>
|
| 39 |
+
<button class="filter-btn" data-filter="voice-typing" data-type="usecase">Voice Typing</button>
|
| 40 |
+
<button class="filter-btn" data-filter="subtitles" data-type="usecase">Subtitles & Captioning</button>
|
| 41 |
+
<button class="filter-btn" data-filter="meetings" data-type="usecase">Meetings & Productivity</button>
|
| 42 |
+
<button class="filter-btn" data-filter="real-time" data-type="usecase">Real-Time Transcription</button>
|
| 43 |
+
<button class="filter-btn" data-filter="developer" data-type="usecase">Developer Tools</button>
|
| 44 |
+
<button class="filter-btn" data-filter="model-variants" data-type="usecase">Model Variants</button>
|
| 45 |
+
</div>
|
| 46 |
+
</div>
|
| 47 |
+
|
| 48 |
+
<div class="search-section">
|
| 49 |
+
<input type="text" id="search-input" placeholder="Search projects by name or description...">
|
| 50 |
+
</div>
|
| 51 |
+
</div>
|
| 52 |
+
</section>
|
| 53 |
+
|
| 54 |
+
<section class="results">
|
| 55 |
+
<div class="results-header">
|
| 56 |
+
<h2>Projects <span id="project-count"></span></h2>
|
| 57 |
+
<div class="sort-controls">
|
| 58 |
+
<label>Sort by:</label>
|
| 59 |
+
<select id="sort-select">
|
| 60 |
+
<option value="name">Name (A-Z)</option>
|
| 61 |
+
<option value="platform">Platform</option>
|
| 62 |
+
<option value="usecase">Use Case</option>
|
| 63 |
+
</select>
|
| 64 |
+
</div>
|
| 65 |
+
</div>
|
| 66 |
+
<div id="projects-grid" class="projects-grid">
|
| 67 |
+
<!-- Projects will be loaded here by JavaScript -->
|
| 68 |
+
</div>
|
| 69 |
+
</section>
|
| 70 |
+
</main>
|
| 71 |
+
|
| 72 |
+
<footer>
|
| 73 |
+
<div class="container">
|
| 74 |
+
<p>Data sourced from the <a href="projects.md" target="_blank">Awesome Whisper Apps</a> collection</p>
|
| 75 |
+
<p>Learn more about <a href="https://github.com/openai/whisper" target="_blank">OpenAI Whisper</a></p>
|
| 76 |
+
</div>
|
| 77 |
+
</footer>
|
| 78 |
+
|
| 79 |
+
<script src="script.js"></script>
|
| 80 |
+
</body>
|
| 81 |
</html>
|
parse_markdown.py
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""
|
| 3 |
+
Parse the Awesome Whisper Apps markdown file and generate a JSON data file.
|
| 4 |
+
This script extracts project information from projects.md and creates projects.json
|
| 5 |
+
"""
|
| 6 |
+
|
| 7 |
+
import json
|
| 8 |
+
import re
|
| 9 |
+
from pathlib import Path
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
def extract_github_repo(url):
|
| 13 |
+
"""Extract GitHub repository from URL."""
|
| 14 |
+
github_match = re.search(r'github\.com/([^/]+/[^/\s)]+)', url)
|
| 15 |
+
if github_match:
|
| 16 |
+
return github_match.group(1)
|
| 17 |
+
return None
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
def parse_table_row(line, context):
|
| 21 |
+
"""Parse a markdown table row."""
|
| 22 |
+
# Table format: | [Name](url) | stars_badge | Description |
|
| 23 |
+
parts = [p.strip() for p in line.split('|')[1:-1]] # Remove empty first/last
|
| 24 |
+
if len(parts) < 3:
|
| 25 |
+
return None
|
| 26 |
+
|
| 27 |
+
# Extract name and URL from first column
|
| 28 |
+
match = re.search(r'\[([^\]]+)\]\(([^)]+)\)', parts[0])
|
| 29 |
+
if not match:
|
| 30 |
+
return None
|
| 31 |
+
|
| 32 |
+
name = match.group(1)
|
| 33 |
+
url = match.group(2)
|
| 34 |
+
description = parts[2] if len(parts) > 2 else ""
|
| 35 |
+
|
| 36 |
+
return {
|
| 37 |
+
'name': name,
|
| 38 |
+
'url': url,
|
| 39 |
+
'description': description,
|
| 40 |
+
'platforms': context.get('platforms', []),
|
| 41 |
+
'usecases': context.get('usecases', []),
|
| 42 |
+
'github_repo': extract_github_repo(url)
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
|
| 46 |
+
def parse_bullet_item(line, context):
|
| 47 |
+
"""Parse a bullet list item."""
|
| 48 |
+
# Format: - **[name](url)** description
|
| 49 |
+
# or: - **[name](url)**  - description
|
| 50 |
+
match = re.search(r'-\s+\*\*\[([^\]]+)\]\(([^)]+)\)\*\*\s+(?:!\[GitHub[^\]]*\][^-]*-\s+)?(.+)', line)
|
| 51 |
+
|
| 52 |
+
if not match:
|
| 53 |
+
return None
|
| 54 |
+
|
| 55 |
+
name = match.group(1)
|
| 56 |
+
url = match.group(2)
|
| 57 |
+
description = match.group(3).strip()
|
| 58 |
+
|
| 59 |
+
return {
|
| 60 |
+
'name': name,
|
| 61 |
+
'url': url,
|
| 62 |
+
'description': description,
|
| 63 |
+
'platforms': context.get('platforms', []),
|
| 64 |
+
'usecases': context.get('usecases', []),
|
| 65 |
+
'github_repo': extract_github_repo(url)
|
| 66 |
+
}
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
def determine_platform_from_subsection(line, current_platforms):
|
| 70 |
+
"""Determine platform from **Platform:** style markers."""
|
| 71 |
+
line_lower = line.lower()
|
| 72 |
+
|
| 73 |
+
if '**cross-platform:**' in line_lower:
|
| 74 |
+
return ['cross-platform']
|
| 75 |
+
elif '**linux:**' in line_lower:
|
| 76 |
+
return ['linux']
|
| 77 |
+
elif '**macos:**' in line_lower:
|
| 78 |
+
return ['macos']
|
| 79 |
+
elif '**windows:**' in line_lower:
|
| 80 |
+
return ['windows']
|
| 81 |
+
elif '**mobile:**' in line_lower:
|
| 82 |
+
return ['android', 'ios']
|
| 83 |
+
|
| 84 |
+
return current_platforms
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
def parse_markdown(md_path):
|
| 88 |
+
"""Parse the markdown file and extract all projects."""
|
| 89 |
+
projects = []
|
| 90 |
+
current_context = {'platforms': [], 'usecases': []}
|
| 91 |
+
in_content_section = False
|
| 92 |
+
|
| 93 |
+
with open(md_path, 'r', encoding='utf-8') as f:
|
| 94 |
+
lines = f.readlines()
|
| 95 |
+
|
| 96 |
+
i = 0
|
| 97 |
+
while i < len(lines):
|
| 98 |
+
line = lines[i].strip()
|
| 99 |
+
|
| 100 |
+
# Start tracking only in sections with real URLs (not reference links)
|
| 101 |
+
if '## By Platform' in line:
|
| 102 |
+
in_content_section = True
|
| 103 |
+
current_context = {'platforms': [], 'usecases': []}
|
| 104 |
+
elif '## By Use Case' in line:
|
| 105 |
+
in_content_section = False # Skip this section (has reference links only)
|
| 106 |
+
|
| 107 |
+
# Major section headers (##)
|
| 108 |
+
if line.startswith('##') and in_content_section:
|
| 109 |
+
if 'By Platform' in line:
|
| 110 |
+
current_context = {'platforms': [], 'usecases': []}
|
| 111 |
+
elif 'For Developers' in line:
|
| 112 |
+
in_content_section = True
|
| 113 |
+
current_context = {'platforms': [], 'usecases': ['developer']}
|
| 114 |
+
elif 'SRT' in line or 'Subtitles' in line:
|
| 115 |
+
current_context['usecases'] = ['subtitles']
|
| 116 |
+
elif 'Meeting' in line:
|
| 117 |
+
current_context['usecases'] = ['meetings']
|
| 118 |
+
elif 'Real-Time' in line or 'Streaming' in line:
|
| 119 |
+
current_context['usecases'] = ['real-time']
|
| 120 |
+
|
| 121 |
+
# Subsection headers (###)
|
| 122 |
+
elif line.startswith('###') and in_content_section:
|
| 123 |
+
# Platform sections
|
| 124 |
+
if 'Linux' in line and '##' not in line:
|
| 125 |
+
current_context['platforms'] = ['linux']
|
| 126 |
+
elif 'macOS' in line:
|
| 127 |
+
current_context['platforms'] = ['macos']
|
| 128 |
+
elif 'Windows' in line:
|
| 129 |
+
current_context['platforms'] = ['windows']
|
| 130 |
+
elif 'Android' in line:
|
| 131 |
+
current_context['platforms'] = ['android']
|
| 132 |
+
elif 'iOS' in line:
|
| 133 |
+
current_context['platforms'] = ['ios']
|
| 134 |
+
elif 'Cross-Platform' in line:
|
| 135 |
+
current_context['platforms'] = ['cross-platform']
|
| 136 |
+
elif 'Embedded' in line or 'Raspberry' in line:
|
| 137 |
+
current_context['platforms'] = ['embedded']
|
| 138 |
+
|
| 139 |
+
# Use case sections
|
| 140 |
+
if 'Voice Typing' in line or 'Dictation' in line:
|
| 141 |
+
current_context['usecases'] = ['voice-typing']
|
| 142 |
+
elif 'SaaS' in line or 'Cloud' in line:
|
| 143 |
+
current_context['usecases'] = ['saas']
|
| 144 |
+
elif 'Subtitles' in line or 'Captioning' in line:
|
| 145 |
+
current_context['usecases'] = ['subtitles']
|
| 146 |
+
elif 'Meeting' in line or 'Productivity' in line:
|
| 147 |
+
current_context['usecases'] = ['meetings']
|
| 148 |
+
elif 'Web Interface' in line or 'Web UI' in line:
|
| 149 |
+
current_context['usecases'] = ['web']
|
| 150 |
+
current_context['platforms'] = ['web']
|
| 151 |
+
elif 'Real-Time' in line or 'Streaming' in line:
|
| 152 |
+
current_context['usecases'] = ['real-time']
|
| 153 |
+
elif 'Model Variants' in line or 'Performance' in line:
|
| 154 |
+
current_context['usecases'] = ['model-variants']
|
| 155 |
+
elif 'Fine-Tuning' in line or 'Diarization' in line or 'Timestamps' in line:
|
| 156 |
+
current_context['usecases'] = ['developer']
|
| 157 |
+
|
| 158 |
+
# Sub-subsection headers (####)
|
| 159 |
+
elif line.startswith('####') and in_content_section:
|
| 160 |
+
if 'Desktop Applications' in line:
|
| 161 |
+
pass # Keep current platform
|
| 162 |
+
elif 'System Integration' in line:
|
| 163 |
+
if not current_context.get('usecases'):
|
| 164 |
+
current_context['usecases'] = ['voice-typing']
|
| 165 |
+
elif 'CLI Tools' in line:
|
| 166 |
+
current_context['usecases'] = ['developer']
|
| 167 |
+
|
| 168 |
+
# Check for **Platform:** style subsections
|
| 169 |
+
elif line.startswith('**') and ':' in line and '**' in line[:20]:
|
| 170 |
+
current_context['platforms'] = determine_platform_from_subsection(line, current_context.get('platforms', []))
|
| 171 |
+
|
| 172 |
+
# Parse table rows
|
| 173 |
+
elif in_content_section and line.startswith('|') and '[' in line and '](' in line:
|
| 174 |
+
project = parse_table_row(line, current_context)
|
| 175 |
+
if project and not any(p['name'] == project['name'] for p in projects):
|
| 176 |
+
projects.append(project)
|
| 177 |
+
|
| 178 |
+
# Parse bullet items
|
| 179 |
+
elif in_content_section and line.startswith('- **['):
|
| 180 |
+
project = parse_bullet_item(line, current_context)
|
| 181 |
+
if project and not any(p['name'] == project['name'] for p in projects):
|
| 182 |
+
projects.append(project)
|
| 183 |
+
|
| 184 |
+
# Parse simple links (for SaaS section)
|
| 185 |
+
elif in_content_section and line.startswith('- [') and not line.startswith('- **['):
|
| 186 |
+
match = re.search(r'-\s+\[([^\]]+)\]\(([^)]+)\)\s+-\s+(.+)', line)
|
| 187 |
+
if match:
|
| 188 |
+
name = match.group(1)
|
| 189 |
+
url = match.group(2)
|
| 190 |
+
description = match.group(3).strip()
|
| 191 |
+
|
| 192 |
+
project = {
|
| 193 |
+
'name': name,
|
| 194 |
+
'url': url,
|
| 195 |
+
'description': description,
|
| 196 |
+
'platforms': current_context.get('platforms', ['web']),
|
| 197 |
+
'usecases': current_context.get('usecases', ['saas']),
|
| 198 |
+
'github_repo': extract_github_repo(url)
|
| 199 |
+
}
|
| 200 |
+
|
| 201 |
+
if not any(p['name'] == project['name'] for p in projects):
|
| 202 |
+
projects.append(project)
|
| 203 |
+
|
| 204 |
+
i += 1
|
| 205 |
+
|
| 206 |
+
return projects
|
| 207 |
+
|
| 208 |
+
|
| 209 |
+
def enhance_projects(projects):
|
| 210 |
+
"""Add additional metadata and clean up project data."""
|
| 211 |
+
for project in projects:
|
| 212 |
+
# Ensure we have at least one use case
|
| 213 |
+
if not project.get('usecases'):
|
| 214 |
+
desc_lower = project['description'].lower()
|
| 215 |
+
|
| 216 |
+
if 'subtitle' in desc_lower or 'caption' in desc_lower or 'srt' in desc_lower:
|
| 217 |
+
project['usecases'] = ['subtitles']
|
| 218 |
+
elif 'real-time' in desc_lower or 'streaming' in desc_lower or 'live' in desc_lower:
|
| 219 |
+
project['usecases'] = ['real-time']
|
| 220 |
+
elif 'meeting' in desc_lower or 'note' in desc_lower or 'minutes' in desc_lower:
|
| 221 |
+
project['usecases'] = ['meetings']
|
| 222 |
+
elif 'dictation' in desc_lower or 'voice' in desc_lower or 'typing' in desc_lower:
|
| 223 |
+
project['usecases'] = ['voice-typing']
|
| 224 |
+
elif 'model' in desc_lower or 'implementation' in desc_lower or 'whisper' in desc_lower:
|
| 225 |
+
project['usecases'] = ['model-variants']
|
| 226 |
+
else:
|
| 227 |
+
project['usecases'] = ['developer']
|
| 228 |
+
|
| 229 |
+
# Ensure we have at least one platform
|
| 230 |
+
if not project.get('platforms'):
|
| 231 |
+
desc_lower = project['description'].lower()
|
| 232 |
+
url_lower = project['url'].lower()
|
| 233 |
+
|
| 234 |
+
if 'web' in desc_lower or 'browser' in desc_lower or 'online' in desc_lower:
|
| 235 |
+
project['platforms'] = ['web']
|
| 236 |
+
elif not project.get('github_repo'): # Non-GitHub links are likely web services
|
| 237 |
+
project['platforms'] = ['web']
|
| 238 |
+
else:
|
| 239 |
+
project['platforms'] = ['cross-platform']
|
| 240 |
+
|
| 241 |
+
return projects
|
| 242 |
+
|
| 243 |
+
|
| 244 |
+
def main():
|
| 245 |
+
script_dir = Path(__file__).parent
|
| 246 |
+
md_path = script_dir / 'projects.md'
|
| 247 |
+
json_path = script_dir / 'projects.json'
|
| 248 |
+
|
| 249 |
+
print(f"Parsing {md_path}...")
|
| 250 |
+
projects = parse_markdown(md_path)
|
| 251 |
+
|
| 252 |
+
print(f"Extracted {len(projects)} projects")
|
| 253 |
+
|
| 254 |
+
# Enhance with additional metadata
|
| 255 |
+
projects = enhance_projects(projects)
|
| 256 |
+
|
| 257 |
+
# Write to JSON
|
| 258 |
+
with open(json_path, 'w', encoding='utf-8') as f:
|
| 259 |
+
json.dump(projects, f, indent=2, ensure_ascii=False)
|
| 260 |
+
|
| 261 |
+
print(f"✓ Created {json_path} with {len(projects)} projects")
|
| 262 |
+
|
| 263 |
+
# Print statistics
|
| 264 |
+
platforms = set()
|
| 265 |
+
usecases = set()
|
| 266 |
+
for p in projects:
|
| 267 |
+
platforms.update(p['platforms'])
|
| 268 |
+
usecases.update(p['usecases'])
|
| 269 |
+
|
| 270 |
+
print(f"\nStatistics:")
|
| 271 |
+
print(f" Platforms: {', '.join(sorted(platforms))}")
|
| 272 |
+
print(f" Use cases: {', '.join(sorted(usecases))}")
|
| 273 |
+
|
| 274 |
+
# Show sample projects
|
| 275 |
+
print(f"\nSample projects:")
|
| 276 |
+
for p in projects[:5]:
|
| 277 |
+
print(f" - {p['name']} ({', '.join(p['platforms'])}) - {p['description'][:50]}...")
|
| 278 |
+
|
| 279 |
+
|
| 280 |
+
if __name__ == '__main__':
|
| 281 |
+
main()
|
projects.json
ADDED
|
@@ -0,0 +1,638 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
{
|
| 3 |
+
"name": "Buzz",
|
| 4 |
+
"url": "https://github.com/chidiwilliams/buzz",
|
| 5 |
+
"description": "Feature-rich transcription app",
|
| 6 |
+
"platforms": [
|
| 7 |
+
"cross-platform"
|
| 8 |
+
],
|
| 9 |
+
"usecases": [
|
| 10 |
+
"developer"
|
| 11 |
+
],
|
| 12 |
+
"github_repo": "chidiwilliams/buzz"
|
| 13 |
+
},
|
| 14 |
+
{
|
| 15 |
+
"name": "whisper-writer",
|
| 16 |
+
"url": "https://github.com/savbell/whisper-writer",
|
| 17 |
+
"description": "Voice-to-text application",
|
| 18 |
+
"platforms": [
|
| 19 |
+
"cross-platform"
|
| 20 |
+
],
|
| 21 |
+
"usecases": [
|
| 22 |
+
"voice-typing"
|
| 23 |
+
],
|
| 24 |
+
"github_repo": "savbell/whisper-writer"
|
| 25 |
+
},
|
| 26 |
+
{
|
| 27 |
+
"name": "faster-whisper-GUI",
|
| 28 |
+
"url": "https://github.com/CheshireCC/faster-whisper-GUI",
|
| 29 |
+
"description": "GUI for faster-whisper",
|
| 30 |
+
"platforms": [
|
| 31 |
+
"cross-platform"
|
| 32 |
+
],
|
| 33 |
+
"usecases": [
|
| 34 |
+
"model-variants"
|
| 35 |
+
],
|
| 36 |
+
"github_repo": "CheshireCC/faster-whisper-GUI"
|
| 37 |
+
},
|
| 38 |
+
{
|
| 39 |
+
"name": "SoftWhisper",
|
| 40 |
+
"url": "https://github.com/NullMagic2/SoftWhisper",
|
| 41 |
+
"description": "User-friendly GUI",
|
| 42 |
+
"platforms": [
|
| 43 |
+
"cross-platform"
|
| 44 |
+
],
|
| 45 |
+
"usecases": [
|
| 46 |
+
"developer"
|
| 47 |
+
],
|
| 48 |
+
"github_repo": "NullMagic2/SoftWhisper"
|
| 49 |
+
},
|
| 50 |
+
{
|
| 51 |
+
"name": "speech-assistant",
|
| 52 |
+
"url": "https://github.com/Mohamad-Hussein/speech-assistant",
|
| 53 |
+
"description": "Speech assistant GUI",
|
| 54 |
+
"platforms": [
|
| 55 |
+
"cross-platform"
|
| 56 |
+
],
|
| 57 |
+
"usecases": [
|
| 58 |
+
"developer"
|
| 59 |
+
],
|
| 60 |
+
"github_repo": "Mohamad-Hussein/speech-assistant"
|
| 61 |
+
},
|
| 62 |
+
{
|
| 63 |
+
"name": "whisper-dictation",
|
| 64 |
+
"url": "https://github.com/foges/whisper-dictation",
|
| 65 |
+
"description": "Dictation application",
|
| 66 |
+
"platforms": [
|
| 67 |
+
"cross-platform"
|
| 68 |
+
],
|
| 69 |
+
"usecases": [
|
| 70 |
+
"voice-typing"
|
| 71 |
+
],
|
| 72 |
+
"github_repo": "foges/whisper-dictation"
|
| 73 |
+
},
|
| 74 |
+
{
|
| 75 |
+
"name": "whisper-realtime-gui",
|
| 76 |
+
"url": "https://github.com/phongthanhbuiit/whisper-realtime-gui",
|
| 77 |
+
"description": "Real-time transcription GUI",
|
| 78 |
+
"platforms": [
|
| 79 |
+
"cross-platform"
|
| 80 |
+
],
|
| 81 |
+
"usecases": [
|
| 82 |
+
"real-time"
|
| 83 |
+
],
|
| 84 |
+
"github_repo": "phongthanhbuiit/whisper-realtime-gui"
|
| 85 |
+
},
|
| 86 |
+
{
|
| 87 |
+
"name": "whisper-ui",
|
| 88 |
+
"url": "https://github.com/schnoddelbotz/whisper-ui",
|
| 89 |
+
"description": "Cross-platform desktop UI",
|
| 90 |
+
"platforms": [
|
| 91 |
+
"cross-platform"
|
| 92 |
+
],
|
| 93 |
+
"usecases": [
|
| 94 |
+
"developer"
|
| 95 |
+
],
|
| 96 |
+
"github_repo": "schnoddelbotz/whisper-ui"
|
| 97 |
+
},
|
| 98 |
+
{
|
| 99 |
+
"name": "whisper_dictation",
|
| 100 |
+
"url": "https://github.com/themanyone/whisper_dictation",
|
| 101 |
+
"description": "Voice dictation tool",
|
| 102 |
+
"platforms": [
|
| 103 |
+
"cross-platform"
|
| 104 |
+
],
|
| 105 |
+
"usecases": [
|
| 106 |
+
"voice-typing"
|
| 107 |
+
],
|
| 108 |
+
"github_repo": "themanyone/whisper_dictation"
|
| 109 |
+
},
|
| 110 |
+
{
|
| 111 |
+
"name": "WhisperGUI",
|
| 112 |
+
"url": "https://github.com/ADT109119/WhisperGUI",
|
| 113 |
+
"description": "Simple GUI",
|
| 114 |
+
"platforms": [
|
| 115 |
+
"cross-platform"
|
| 116 |
+
],
|
| 117 |
+
"usecases": [
|
| 118 |
+
"developer"
|
| 119 |
+
],
|
| 120 |
+
"github_repo": "ADT109119/WhisperGUI"
|
| 121 |
+
},
|
| 122 |
+
{
|
| 123 |
+
"name": "froshine",
|
| 124 |
+
"url": "https://github.com/AdrianScott/froshine",
|
| 125 |
+
"description": " - Linux desktop app",
|
| 126 |
+
"platforms": [
|
| 127 |
+
"cross-platform"
|
| 128 |
+
],
|
| 129 |
+
"usecases": [
|
| 130 |
+
"developer"
|
| 131 |
+
],
|
| 132 |
+
"github_repo": "AdrianScott/froshine"
|
| 133 |
+
},
|
| 134 |
+
{
|
| 135 |
+
"name": "speak-to-ai",
|
| 136 |
+
"url": "https://github.com/AshBuk/speak-to-ai",
|
| 137 |
+
"description": " - Voice interaction app",
|
| 138 |
+
"platforms": [
|
| 139 |
+
"cross-platform"
|
| 140 |
+
],
|
| 141 |
+
"usecases": [
|
| 142 |
+
"voice-typing"
|
| 143 |
+
],
|
| 144 |
+
"github_repo": "AshBuk/speak-to-ai"
|
| 145 |
+
},
|
| 146 |
+
{
|
| 147 |
+
"name": "Whisper-Notepad-For-Linux",
|
| 148 |
+
"url": "https://github.com/danielrosehill/Whisper-Notepad-For-Linux",
|
| 149 |
+
"description": " - Notepad-style transcription",
|
| 150 |
+
"platforms": [
|
| 151 |
+
"cross-platform"
|
| 152 |
+
],
|
| 153 |
+
"usecases": [
|
| 154 |
+
"meetings"
|
| 155 |
+
],
|
| 156 |
+
"github_repo": "danielrosehill/Whisper-Notepad-For-Linux"
|
| 157 |
+
},
|
| 158 |
+
{
|
| 159 |
+
"name": "WhisperNow",
|
| 160 |
+
"url": "https://github.com/shinglyu/WhisperNow",
|
| 161 |
+
"description": " - Desktop application",
|
| 162 |
+
"platforms": [
|
| 163 |
+
"cross-platform"
|
| 164 |
+
],
|
| 165 |
+
"usecases": [
|
| 166 |
+
"model-variants"
|
| 167 |
+
],
|
| 168 |
+
"github_repo": "shinglyu/WhisperNow"
|
| 169 |
+
},
|
| 170 |
+
{
|
| 171 |
+
"name": "whisper.cpp-cli",
|
| 172 |
+
"url": "https://github.com/charliermarsh/whisper.cpp-cli",
|
| 173 |
+
"description": " - CLI for whisper.cpp",
|
| 174 |
+
"platforms": [
|
| 175 |
+
"cross-platform"
|
| 176 |
+
],
|
| 177 |
+
"usecases": [
|
| 178 |
+
"model-variants"
|
| 179 |
+
],
|
| 180 |
+
"github_repo": "charliermarsh/whisper.cpp-cli"
|
| 181 |
+
},
|
| 182 |
+
{
|
| 183 |
+
"name": "blurt",
|
| 184 |
+
"url": "https://github.com/QuantiusBenignus/blurt",
|
| 185 |
+
"description": " - Command-line transcription tool",
|
| 186 |
+
"platforms": [
|
| 187 |
+
"cross-platform"
|
| 188 |
+
],
|
| 189 |
+
"usecases": [
|
| 190 |
+
"developer"
|
| 191 |
+
],
|
| 192 |
+
"github_repo": "QuantiusBenignus/blurt"
|
| 193 |
+
},
|
| 194 |
+
{
|
| 195 |
+
"name": "nerd-dictation",
|
| 196 |
+
"url": "https://github.com/ideasman42/nerd-dictation",
|
| 197 |
+
"description": " - Hackable offline STT (VOSK-API)",
|
| 198 |
+
"platforms": [
|
| 199 |
+
"cross-platform"
|
| 200 |
+
],
|
| 201 |
+
"usecases": [
|
| 202 |
+
"voice-typing"
|
| 203 |
+
],
|
| 204 |
+
"github_repo": "ideasman42/nerd-dictation"
|
| 205 |
+
},
|
| 206 |
+
{
|
| 207 |
+
"name": "BlahST",
|
| 208 |
+
"url": "https://github.com/QuantiusBenignus/BlahST",
|
| 209 |
+
"description": " - Speech-to-text integration",
|
| 210 |
+
"platforms": [
|
| 211 |
+
"cross-platform"
|
| 212 |
+
],
|
| 213 |
+
"usecases": [
|
| 214 |
+
"developer"
|
| 215 |
+
],
|
| 216 |
+
"github_repo": "QuantiusBenignus/BlahST"
|
| 217 |
+
},
|
| 218 |
+
{
|
| 219 |
+
"name": "Linux-Dictation-Project",
|
| 220 |
+
"url": "https://github.com/wheeler01/Linux-Dictation-Project",
|
| 221 |
+
"description": " - Dictation system",
|
| 222 |
+
"platforms": [
|
| 223 |
+
"cross-platform"
|
| 224 |
+
],
|
| 225 |
+
"usecases": [
|
| 226 |
+
"voice-typing"
|
| 227 |
+
],
|
| 228 |
+
"github_repo": "wheeler01/Linux-Dictation-Project"
|
| 229 |
+
},
|
| 230 |
+
{
|
| 231 |
+
"name": "linux-stt-input",
|
| 232 |
+
"url": "https://github.com/fengwk/linux-stt-input",
|
| 233 |
+
"description": " - STT input method",
|
| 234 |
+
"platforms": [
|
| 235 |
+
"cross-platform"
|
| 236 |
+
],
|
| 237 |
+
"usecases": [
|
| 238 |
+
"developer"
|
| 239 |
+
],
|
| 240 |
+
"github_repo": "fengwk/linux-stt-input"
|
| 241 |
+
},
|
| 242 |
+
{
|
| 243 |
+
"name": "linux-voice-to-text-ai",
|
| 244 |
+
"url": "https://github.com/trebormc/linux-voice-to-text-ai",
|
| 245 |
+
"description": " - Voice-to-text AI",
|
| 246 |
+
"platforms": [
|
| 247 |
+
"cross-platform"
|
| 248 |
+
],
|
| 249 |
+
"usecases": [
|
| 250 |
+
"voice-typing"
|
| 251 |
+
],
|
| 252 |
+
"github_repo": "trebormc/linux-voice-to-text-ai"
|
| 253 |
+
},
|
| 254 |
+
{
|
| 255 |
+
"name": "LinuxWhisper",
|
| 256 |
+
"url": "https://github.com/vitali87/LinuxWhisper",
|
| 257 |
+
"description": " - Linux implementation",
|
| 258 |
+
"platforms": [
|
| 259 |
+
"cross-platform"
|
| 260 |
+
],
|
| 261 |
+
"usecases": [
|
| 262 |
+
"model-variants"
|
| 263 |
+
],
|
| 264 |
+
"github_repo": "vitali87/LinuxWhisper"
|
| 265 |
+
},
|
| 266 |
+
{
|
| 267 |
+
"name": "voice-typing-linux",
|
| 268 |
+
"url": "https://github.com/GitJuhb/voice-typing-linux",
|
| 269 |
+
"description": " - Voice typing integration",
|
| 270 |
+
"platforms": [
|
| 271 |
+
"cross-platform"
|
| 272 |
+
],
|
| 273 |
+
"usecases": [
|
| 274 |
+
"voice-typing"
|
| 275 |
+
],
|
| 276 |
+
"github_repo": "GitJuhb/voice-typing-linux"
|
| 277 |
+
},
|
| 278 |
+
{
|
| 279 |
+
"name": "Whisper-Dictation",
|
| 280 |
+
"url": "https://github.com/LumenYoung/Whisper-Dictation",
|
| 281 |
+
"description": " - Dictation system",
|
| 282 |
+
"platforms": [
|
| 283 |
+
"cross-platform"
|
| 284 |
+
],
|
| 285 |
+
"usecases": [
|
| 286 |
+
"voice-typing"
|
| 287 |
+
],
|
| 288 |
+
"github_repo": "LumenYoung/Whisper-Dictation"
|
| 289 |
+
},
|
| 290 |
+
{
|
| 291 |
+
"name": "whisper-flow-linux",
|
| 292 |
+
"url": "https://github.com/sapountzis/whisper-flow-linux",
|
| 293 |
+
"description": " - Workflow integration",
|
| 294 |
+
"platforms": [
|
| 295 |
+
"cross-platform"
|
| 296 |
+
],
|
| 297 |
+
"usecases": [
|
| 298 |
+
"model-variants"
|
| 299 |
+
],
|
| 300 |
+
"github_repo": "sapountzis/whisper-flow-linux"
|
| 301 |
+
},
|
| 302 |
+
{
|
| 303 |
+
"name": "whisper-hotkey-linux",
|
| 304 |
+
"url": "https://github.com/atkvishnu/whisper-hotkey-linux",
|
| 305 |
+
"description": " - Hotkey-based integration",
|
| 306 |
+
"platforms": [
|
| 307 |
+
"cross-platform"
|
| 308 |
+
],
|
| 309 |
+
"usecases": [
|
| 310 |
+
"model-variants"
|
| 311 |
+
],
|
| 312 |
+
"github_repo": "atkvishnu/whisper-hotkey-linux"
|
| 313 |
+
},
|
| 314 |
+
{
|
| 315 |
+
"name": "whispertrigger",
|
| 316 |
+
"url": "https://github.com/RetroTrigger/whispertrigger",
|
| 317 |
+
"description": " - System integration",
|
| 318 |
+
"platforms": [
|
| 319 |
+
"cross-platform"
|
| 320 |
+
],
|
| 321 |
+
"usecases": [
|
| 322 |
+
"model-variants"
|
| 323 |
+
],
|
| 324 |
+
"github_repo": "RetroTrigger/whispertrigger"
|
| 325 |
+
},
|
| 326 |
+
{
|
| 327 |
+
"name": "whisprd",
|
| 328 |
+
"url": "https://github.com/AgenticToaster/whisprd",
|
| 329 |
+
"description": " - Whisper daemon",
|
| 330 |
+
"platforms": [
|
| 331 |
+
"cross-platform"
|
| 332 |
+
],
|
| 333 |
+
"usecases": [
|
| 334 |
+
"model-variants"
|
| 335 |
+
],
|
| 336 |
+
"github_repo": "AgenticToaster/whisprd"
|
| 337 |
+
},
|
| 338 |
+
{
|
| 339 |
+
"name": "whisper-to-input",
|
| 340 |
+
"url": "https://github.com/j3soon/whisper-to-input",
|
| 341 |
+
"description": " - Transcription to keyboard input",
|
| 342 |
+
"platforms": [
|
| 343 |
+
"cross-platform"
|
| 344 |
+
],
|
| 345 |
+
"usecases": [
|
| 346 |
+
"model-variants"
|
| 347 |
+
],
|
| 348 |
+
"github_repo": "j3soon/whisper-to-input"
|
| 349 |
+
},
|
| 350 |
+
{
|
| 351 |
+
"name": "whispy",
|
| 352 |
+
"url": "https://github.com/daaku/whispy",
|
| 353 |
+
"description": " - Integration tool",
|
| 354 |
+
"platforms": [
|
| 355 |
+
"cross-platform"
|
| 356 |
+
],
|
| 357 |
+
"usecases": [
|
| 358 |
+
"developer"
|
| 359 |
+
],
|
| 360 |
+
"github_repo": "daaku/whispy"
|
| 361 |
+
},
|
| 362 |
+
{
|
| 363 |
+
"name": "dicti",
|
| 364 |
+
"url": "https://github.com/tksimson/dicti",
|
| 365 |
+
"description": " - Dictation tool",
|
| 366 |
+
"platforms": [
|
| 367 |
+
"cross-platform"
|
| 368 |
+
],
|
| 369 |
+
"usecases": [
|
| 370 |
+
"voice-typing"
|
| 371 |
+
],
|
| 372 |
+
"github_repo": "tksimson/dicti"
|
| 373 |
+
},
|
| 374 |
+
{
|
| 375 |
+
"name": "sonori",
|
| 376 |
+
"url": "https://github.com/0xPD33/sonori",
|
| 377 |
+
"description": " - Voice input system",
|
| 378 |
+
"platforms": [
|
| 379 |
+
"cross-platform"
|
| 380 |
+
],
|
| 381 |
+
"usecases": [
|
| 382 |
+
"voice-typing"
|
| 383 |
+
],
|
| 384 |
+
"github_repo": "0xPD33/sonori"
|
| 385 |
+
},
|
| 386 |
+
{
|
| 387 |
+
"name": "hushnote",
|
| 388 |
+
"url": "https://github.com/peteonrails/hushnote",
|
| 389 |
+
"description": " - Private note-taking",
|
| 390 |
+
"platforms": [
|
| 391 |
+
"cross-platform"
|
| 392 |
+
],
|
| 393 |
+
"usecases": [
|
| 394 |
+
"meetings"
|
| 395 |
+
],
|
| 396 |
+
"github_repo": "peteonrails/hushnote"
|
| 397 |
+
},
|
| 398 |
+
{
|
| 399 |
+
"name": "Local-Voice",
|
| 400 |
+
"url": "https://github.com/shashank2122/Local-Voice",
|
| 401 |
+
"description": " - Local voice processing",
|
| 402 |
+
"platforms": [
|
| 403 |
+
"cross-platform"
|
| 404 |
+
],
|
| 405 |
+
"usecases": [
|
| 406 |
+
"voice-typing"
|
| 407 |
+
],
|
| 408 |
+
"github_repo": "shashank2122/Local-Voice"
|
| 409 |
+
},
|
| 410 |
+
{
|
| 411 |
+
"name": "s2t",
|
| 412 |
+
"url": "https://github.com/franchesoni/s2t",
|
| 413 |
+
"description": " - Speech-to-text",
|
| 414 |
+
"platforms": [
|
| 415 |
+
"cross-platform"
|
| 416 |
+
],
|
| 417 |
+
"usecases": [
|
| 418 |
+
"developer"
|
| 419 |
+
],
|
| 420 |
+
"github_repo": "franchesoni/s2t"
|
| 421 |
+
},
|
| 422 |
+
{
|
| 423 |
+
"name": "Whisper-Notepad-Simple",
|
| 424 |
+
"url": "https://github.com/danielrosehill/Whisper-Notepad-Simple",
|
| 425 |
+
"description": " - Simple notepad app",
|
| 426 |
+
"platforms": [
|
| 427 |
+
"cross-platform"
|
| 428 |
+
],
|
| 429 |
+
"usecases": [
|
| 430 |
+
"meetings"
|
| 431 |
+
],
|
| 432 |
+
"github_repo": "danielrosehill/Whisper-Notepad-Simple"
|
| 433 |
+
},
|
| 434 |
+
{
|
| 435 |
+
"name": "Linux-AI-Assistant-scripts",
|
| 436 |
+
"url": "https://github.com/samoylenkodmitry/Linux-AI-Assistant-scripts",
|
| 437 |
+
"description": " - AI assistant scripts",
|
| 438 |
+
"platforms": [
|
| 439 |
+
"cross-platform"
|
| 440 |
+
],
|
| 441 |
+
"usecases": [
|
| 442 |
+
"developer"
|
| 443 |
+
],
|
| 444 |
+
"github_repo": "samoylenkodmitry/Linux-AI-Assistant-scripts"
|
| 445 |
+
},
|
| 446 |
+
{
|
| 447 |
+
"name": "SuperWhisper",
|
| 448 |
+
"url": "https://superwhisper.com/",
|
| 449 |
+
"description": "- Premium Mac voice-to-text app",
|
| 450 |
+
"platforms": [
|
| 451 |
+
"web"
|
| 452 |
+
],
|
| 453 |
+
"usecases": [
|
| 454 |
+
"voice-typing"
|
| 455 |
+
],
|
| 456 |
+
"github_repo": null
|
| 457 |
+
},
|
| 458 |
+
{
|
| 459 |
+
"name": "OpenSuperWhisper",
|
| 460 |
+
"url": "https://github.com/Starmel/OpenSuperWhisper",
|
| 461 |
+
"description": " - Open-source Mac app",
|
| 462 |
+
"platforms": [
|
| 463 |
+
"cross-platform"
|
| 464 |
+
],
|
| 465 |
+
"usecases": [
|
| 466 |
+
"model-variants"
|
| 467 |
+
],
|
| 468 |
+
"github_repo": "Starmel/OpenSuperWhisper"
|
| 469 |
+
},
|
| 470 |
+
{
|
| 471 |
+
"name": "WhisperKit",
|
| 472 |
+
"url": "https://github.com/argmaxinc/WhisperKit",
|
| 473 |
+
"description": " - Native macOS implementation",
|
| 474 |
+
"platforms": [
|
| 475 |
+
"cross-platform"
|
| 476 |
+
],
|
| 477 |
+
"usecases": [
|
| 478 |
+
"model-variants"
|
| 479 |
+
],
|
| 480 |
+
"github_repo": "argmaxinc/WhisperKit"
|
| 481 |
+
},
|
| 482 |
+
{
|
| 483 |
+
"name": "Careless Whisper",
|
| 484 |
+
"url": "https://carelesswhisper.app/",
|
| 485 |
+
"description": "- Lightweight transcription app",
|
| 486 |
+
"platforms": [
|
| 487 |
+
"web"
|
| 488 |
+
],
|
| 489 |
+
"usecases": [
|
| 490 |
+
"developer"
|
| 491 |
+
],
|
| 492 |
+
"github_repo": null
|
| 493 |
+
},
|
| 494 |
+
{
|
| 495 |
+
"name": "ollama-voice-mac",
|
| 496 |
+
"url": "https://github.com/apeatling/ollama-voice-mac",
|
| 497 |
+
"description": " - Voice interface for Ollama",
|
| 498 |
+
"platforms": [
|
| 499 |
+
"cross-platform"
|
| 500 |
+
],
|
| 501 |
+
"usecases": [
|
| 502 |
+
"voice-typing"
|
| 503 |
+
],
|
| 504 |
+
"github_repo": "apeatling/ollama-voice-mac"
|
| 505 |
+
},
|
| 506 |
+
{
|
| 507 |
+
"name": "whisperanywhere-js",
|
| 508 |
+
"url": "https://github.com/unclecode/whisperanywhere-js",
|
| 509 |
+
"description": " - System-wide transcription",
|
| 510 |
+
"platforms": [
|
| 511 |
+
"cross-platform"
|
| 512 |
+
],
|
| 513 |
+
"usecases": [
|
| 514 |
+
"model-variants"
|
| 515 |
+
],
|
| 516 |
+
"github_repo": "unclecode/whisperanywhere-js"
|
| 517 |
+
},
|
| 518 |
+
{
|
| 519 |
+
"name": "AI Transcription",
|
| 520 |
+
"url": "https://apps.microsoft.com/detail/9p7f1j2svk3g",
|
| 521 |
+
"description": "- Microsoft Store app",
|
| 522 |
+
"platforms": [
|
| 523 |
+
"web"
|
| 524 |
+
],
|
| 525 |
+
"usecases": [
|
| 526 |
+
"developer"
|
| 527 |
+
],
|
| 528 |
+
"github_repo": null
|
| 529 |
+
},
|
| 530 |
+
{
|
| 531 |
+
"name": "Whisper Typing for Windows",
|
| 532 |
+
"url": "https://whispertyping.com/download",
|
| 533 |
+
"description": "- Desktop voice typing",
|
| 534 |
+
"platforms": [
|
| 535 |
+
"web"
|
| 536 |
+
],
|
| 537 |
+
"usecases": [
|
| 538 |
+
"voice-typing"
|
| 539 |
+
],
|
| 540 |
+
"github_repo": null
|
| 541 |
+
},
|
| 542 |
+
{
|
| 543 |
+
"name": "WinWhisper",
|
| 544 |
+
"url": "https://github.com/GewoonJaap/WinWhisper",
|
| 545 |
+
"description": " - System-wide hotkey support",
|
| 546 |
+
"platforms": [
|
| 547 |
+
"cross-platform"
|
| 548 |
+
],
|
| 549 |
+
"usecases": [
|
| 550 |
+
"model-variants"
|
| 551 |
+
],
|
| 552 |
+
"github_repo": "GewoonJaap/WinWhisper"
|
| 553 |
+
},
|
| 554 |
+
{
|
| 555 |
+
"name": "whisperIME",
|
| 556 |
+
"url": "https://github.com/woheller69/whisperIME",
|
| 557 |
+
"description": " - Input method editor",
|
| 558 |
+
"platforms": [
|
| 559 |
+
"cross-platform"
|
| 560 |
+
],
|
| 561 |
+
"usecases": [
|
| 562 |
+
"model-variants"
|
| 563 |
+
],
|
| 564 |
+
"github_repo": "woheller69/whisperIME"
|
| 565 |
+
},
|
| 566 |
+
{
|
| 567 |
+
"name": "WhisperInput",
|
| 568 |
+
"url": "https://github.com/alex-vt/WhisperInput",
|
| 569 |
+
"description": " - Input app",
|
| 570 |
+
"platforms": [
|
| 571 |
+
"cross-platform"
|
| 572 |
+
],
|
| 573 |
+
"usecases": [
|
| 574 |
+
"model-variants"
|
| 575 |
+
],
|
| 576 |
+
"github_repo": "alex-vt/WhisperInput"
|
| 577 |
+
},
|
| 578 |
+
{
|
| 579 |
+
"name": "WhisperKitAndroid",
|
| 580 |
+
"url": "https://github.com/argmaxinc/WhisperKitAndroid",
|
| 581 |
+
"description": " - WhisperKit for Android",
|
| 582 |
+
"platforms": [
|
| 583 |
+
"cross-platform"
|
| 584 |
+
],
|
| 585 |
+
"usecases": [
|
| 586 |
+
"model-variants"
|
| 587 |
+
],
|
| 588 |
+
"github_repo": "argmaxinc/WhisperKitAndroid"
|
| 589 |
+
},
|
| 590 |
+
{
|
| 591 |
+
"name": "RTranslator",
|
| 592 |
+
"url": "https://github.com/niedev/RTranslator",
|
| 593 |
+
"description": " - Real-time translation app",
|
| 594 |
+
"platforms": [
|
| 595 |
+
"cross-platform"
|
| 596 |
+
],
|
| 597 |
+
"usecases": [
|
| 598 |
+
"real-time"
|
| 599 |
+
],
|
| 600 |
+
"github_repo": "niedev/RTranslator"
|
| 601 |
+
},
|
| 602 |
+
{
|
| 603 |
+
"name": "Dictate",
|
| 604 |
+
"url": "https://github.com/DevEmperor/Dictate",
|
| 605 |
+
"description": " - Voice dictation app",
|
| 606 |
+
"platforms": [
|
| 607 |
+
"cross-platform"
|
| 608 |
+
],
|
| 609 |
+
"usecases": [
|
| 610 |
+
"voice-typing"
|
| 611 |
+
],
|
| 612 |
+
"github_repo": "DevEmperor/Dictate"
|
| 613 |
+
},
|
| 614 |
+
{
|
| 615 |
+
"name": "whisper_android",
|
| 616 |
+
"url": "https://github.com/vilassn/whisper_android",
|
| 617 |
+
"description": " - Android integration",
|
| 618 |
+
"platforms": [
|
| 619 |
+
"cross-platform"
|
| 620 |
+
],
|
| 621 |
+
"usecases": [
|
| 622 |
+
"model-variants"
|
| 623 |
+
],
|
| 624 |
+
"github_repo": "vilassn/whisper_android"
|
| 625 |
+
},
|
| 626 |
+
{
|
| 627 |
+
"name": "Whisperboard",
|
| 628 |
+
"url": "https://github.com/Saik0s/Whisperboard",
|
| 629 |
+
"description": " - iOS keyboard with Whisper integration",
|
| 630 |
+
"platforms": [
|
| 631 |
+
"cross-platform"
|
| 632 |
+
],
|
| 633 |
+
"usecases": [
|
| 634 |
+
"model-variants"
|
| 635 |
+
],
|
| 636 |
+
"github_repo": "Saik0s/Whisperboard"
|
| 637 |
+
}
|
| 638 |
+
]
|
projects.md
ADDED
|
@@ -0,0 +1,632 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Awesome Whisper Apps
|
| 2 |
+
|
| 3 |
+
A curated collection of applications, tools, and resources built with [OpenAI Whisper](https://github.com/openai/whisper) - a robust automatic speech recognition (ASR) system trained on 680,000 hours of multilingual and multitask supervised data.
|
| 4 |
+
|
| 5 |
+
## Table of Contents
|
| 6 |
+
|
| 7 |
+
- [Quick Start Guide](#quick-start-guide)
|
| 8 |
+
- [Popular Picks](#popular-picks)
|
| 9 |
+
- [Getting Started](#getting-started)
|
| 10 |
+
- [By Use Case](#by-use-case)
|
| 11 |
+
- [By Platform](#by-platform)
|
| 12 |
+
- [For Developers](#for-developers)
|
| 13 |
+
- [Resources](#resources)
|
| 14 |
+
|
| 15 |
+
## Quick Start Guide
|
| 16 |
+
|
| 17 |
+
**Looking for something specific?**
|
| 18 |
+
|
| 19 |
+
- **Voice typing on Linux?** → [Linux System Integration](#linux-system-integration) or try [nerd-dictation](#nerd-dictation)
|
| 20 |
+
- **Voice typing on Mac?** → [macOS Apps](#macos) or try [SuperWhisper](#superwhisper)
|
| 21 |
+
- **Voice typing on Windows?** → [Windows Apps](#windows) or try [WinWhisper](#winwhisper)
|
| 22 |
+
- **Cross-platform desktop app?** → Try [Buzz](#buzz) or [whisper-writer](#whisper-writer)
|
| 23 |
+
- **Generate video subtitles?** → [Subtitles & Captioning](#srt--subtitles--captioning)
|
| 24 |
+
- **Real-time transcription?** → [Real-Time & Streaming](#real-time--streaming)
|
| 25 |
+
- **Meeting transcription?** → [Meeting & Productivity](#meeting--productivity)
|
| 26 |
+
- **Cloud/SaaS solution?** → [SaaS Platforms](#saas-platforms)
|
| 27 |
+
- **Self-hosted web interface?** → [Web UI](#web-ui)
|
| 28 |
+
- **Mobile app?** → [Android](#android) or [iOS](#ios)
|
| 29 |
+
- **Developer integration?** → [Libraries & APIs](#libraries--apis) or [Model Variants](#model-variants)
|
| 30 |
+
|
| 31 |
+
## Popular Picks
|
| 32 |
+
|
| 33 |
+
Top projects by community engagement and activity:
|
| 34 |
+
|
| 35 |
+
### Desktop Applications
|
| 36 |
+
| Project | Platform | Stars | Description |
|
| 37 |
+
|---------|----------|-------|-------------|
|
| 38 |
+
| [Buzz](#buzz) | Cross-platform |  | Feature-rich desktop transcription app |
|
| 39 |
+
| [whisper-writer](#whisper-writer) | Cross-platform |  | Voice-to-text for system-wide input |
|
| 40 |
+
| [SuperWhisper](#superwhisper) | macOS | N/A | Premium Mac app for voice-to-text |
|
| 41 |
+
| [WinWhisper](#winwhisper) | Windows |  | System-wide hotkey support for Windows |
|
| 42 |
+
|
| 43 |
+
### Model Variants & Performance
|
| 44 |
+
| Project | Stars | Description |
|
| 45 |
+
|---------|-------|-------------|
|
| 46 |
+
| [whisper.cpp](#whispercpp) |  | High-performance C/C++ implementation |
|
| 47 |
+
| [faster-whisper](#faster-whisper) |  | Faster implementation using CTranslate2 |
|
| 48 |
+
| [WhisperX](#whisperx) |  | Word-level timestamps + speaker diarization |
|
| 49 |
+
| [insanely-fast-whisper](#insanely-fast-whisper) |  | Speed-optimized implementation |
|
| 50 |
+
|
| 51 |
+
### Developer Tools
|
| 52 |
+
| Project | Stars | Description |
|
| 53 |
+
|---------|-------|-------------|
|
| 54 |
+
| [WhisperLive](#whisperlive) |  | Real-time transcription server |
|
| 55 |
+
| [whisper_streaming](#whisper_streaming) |  | Long-form streaming transcription |
|
| 56 |
+
| [Whisper-WebUI](#whisper-webui) |  | Self-hosted web interface |
|
| 57 |
+
|
| 58 |
+
## Getting Started
|
| 59 |
+
|
| 60 |
+
### Official Whisper & Models
|
| 61 |
+
|
| 62 |
+
**Official Repository:** [openai/whisper](https://github.com/openai/whisper) 
|
| 63 |
+
|
| 64 |
+
**Hugging Face Collection:** [Whisper Model Release](https://huggingface.co/collections/openai/whisper-release)
|
| 65 |
+
|
| 66 |
+
**Official Paper:** [Robust Speech Recognition via Large-Scale Weak Supervision](https://arxiv.org/abs/2212.04356)
|
| 67 |
+
|
| 68 |
+
### Official Model Sizes
|
| 69 |
+
|
| 70 |
+
Choose based on your accuracy/speed requirements:
|
| 71 |
+
|
| 72 |
+
| Model | Parameters | English-only | Multilingual | Relative Speed | Use Case |
|
| 73 |
+
|-------|------------|--------------|--------------|----------------|----------|
|
| 74 |
+
| [tiny](https://huggingface.co/openai/whisper-tiny) | 39M | ✓ | ✓ | Fastest | Minimal resource usage, real-time apps |
|
| 75 |
+
| [base](https://huggingface.co/openai/whisper-base) | 74M | ✓ | ✓ | Very Fast | Resource-constrained environments |
|
| 76 |
+
| [small](https://huggingface.co/openai/whisper-small) | 244M | ✓ | ✓ | Fast | Good balance for most use cases |
|
| 77 |
+
| [medium](https://huggingface.co/openai/whisper-medium) | 769M | ✓ | ✓ | Moderate | Better accuracy, moderate speed |
|
| 78 |
+
| [large](https://huggingface.co/openai/whisper-large) | 1550M | - | ✓ | Slower | Best accuracy, research use |
|
| 79 |
+
|
| 80 |
+
---
|
| 81 |
+
|
| 82 |
+
## By Use Case
|
| 83 |
+
|
| 84 |
+
### Voice Typing & Dictation
|
| 85 |
+
|
| 86 |
+
**Cross-Platform:**
|
| 87 |
+
- [Buzz](#buzz) - Feature-rich desktop app
|
| 88 |
+
- [whisper-writer](#whisper-writer) - System-wide voice-to-text
|
| 89 |
+
- [whisper-dictation](#whisper-dictation) - Dictation application
|
| 90 |
+
|
| 91 |
+
**Linux:**
|
| 92 |
+
- [nerd-dictation](#nerd-dictation) - Hackable offline speech-to-text
|
| 93 |
+
- [BlahST](#blahst) - Linux speech-to-text integration
|
| 94 |
+
- [whisper-to-input](#whisper-to-input) - Convert transcription to keyboard input
|
| 95 |
+
- [voice-typing-linux](#voice-typing-linux) - Voice typing integration
|
| 96 |
+
|
| 97 |
+
**macOS:**
|
| 98 |
+
- [SuperWhisper](#superwhisper) - Premium Mac voice-to-text app
|
| 99 |
+
- [OpenSuperWhisper](#opensuperwhisper) - Open-source Mac app
|
| 100 |
+
- [WhisperKit](#whisperkit) - Native macOS implementation
|
| 101 |
+
|
| 102 |
+
**Windows:**
|
| 103 |
+
- [WinWhisper](#winwhisper) - System-wide hotkey support
|
| 104 |
+
- [Whisper Typing for Windows](#whisper-typing-for-windows) - Desktop voice typing
|
| 105 |
+
|
| 106 |
+
**Mobile:**
|
| 107 |
+
- [whisperIME](#whisperime) (Android) - Input method editor
|
| 108 |
+
- [Whisperboard](#whisperboard) (iOS) - Keyboard with Whisper
|
| 109 |
+
|
| 110 |
+
### SaaS Platforms & Cloud Services
|
| 111 |
+
|
| 112 |
+
- [Whisper Transcribe](https://www.whispertranscribe.com/) - Online transcription platform
|
| 113 |
+
- [WhisperAI](https://whisperai.com) - Cloud-based transcription service
|
| 114 |
+
- [Whisper Typing](https://whispertyping.com/) - Online typing and transcription
|
| 115 |
+
- [Wisprflow](https://wisprflow.ai/) - Workflow automation with transcription
|
| 116 |
+
- [CleverType](https://www.clevertype.co/) - Smart typing assistant
|
| 117 |
+
- [SpeechPulse](https://speechpulse.com/) - Cross-platform speech-to-text
|
| 118 |
+
- [Blabby.ai](https://www.blabby.ai/) - Browser-based transcription
|
| 119 |
+
|
| 120 |
+
### Subtitles & Captioning
|
| 121 |
+
|
| 122 |
+
Generate subtitles and captions for videos:
|
| 123 |
+
|
| 124 |
+
- **[auto-subs](https://github.com/tmoroney/auto-subs)**  - Automatic subtitle generation
|
| 125 |
+
- **[TeroSubtitler](https://github.com/URUWorks/TeroSubtitler)**  - Professional subtitle editor
|
| 126 |
+
- **[whisper-youtube](https://github.com/ArthurFDLR/whisper-youtube)**  - YouTube subtitle generation
|
| 127 |
+
- **[yt-whisper](https://github.com/m1guelpf/yt-whisper)**  - YouTube transcription tool
|
| 128 |
+
- **[whisper-subs](https://github.com/GhostNaN/whisper-subs)**  - CLI for adding subtitles to videos
|
| 129 |
+
- **[whisply](https://github.com/tsmdt/whisply)**  - Automatic subtitle generation (Linux)
|
| 130 |
+
- **[template-tiktok](https://github.com/remotion-dev/template-tiktok)**  - TikTok-style captioning with Remotion
|
| 131 |
+
|
| 132 |
+
### Meeting & Productivity
|
| 133 |
+
|
| 134 |
+
Tools for transcribing meetings and generating notes:
|
| 135 |
+
|
| 136 |
+
- **[meeting-minutes](https://github.com/Zackriya-Solutions/meeting-minutes)**  - Generate meeting minutes
|
| 137 |
+
- **[ScribeWizard](https://github.com/Bklieger/ScribeWizard)**  - AI-powered note-taking
|
| 138 |
+
|
| 139 |
+
### Web Interfaces
|
| 140 |
+
|
| 141 |
+
**Self-Hosted:**
|
| 142 |
+
- **[Whisper-WebUI](https://github.com/jhj0517/Whisper-WebUI)**  - Web interface for transcription
|
| 143 |
+
- **[NeuroSandboxWebUI](https://github.com/Dartvauder/NeuroSandboxWebUI)**  - Comprehensive web UI for AI models
|
| 144 |
+
|
| 145 |
+
---
|
| 146 |
+
|
| 147 |
+
## By Platform
|
| 148 |
+
|
| 149 |
+
### Cross-Platform Desktop Applications
|
| 150 |
+
|
| 151 |
+
Applications that work on Linux, macOS, and Windows:
|
| 152 |
+
|
| 153 |
+
| Project | Stars | Description |
|
| 154 |
+
|---------|-------|-------------|
|
| 155 |
+
| [Buzz](https://github.com/chidiwilliams/buzz) |  | Feature-rich transcription app |
|
| 156 |
+
| [whisper-writer](https://github.com/savbell/whisper-writer) |  | Voice-to-text application |
|
| 157 |
+
| [faster-whisper-GUI](https://github.com/CheshireCC/faster-whisper-GUI) |  | GUI for faster-whisper |
|
| 158 |
+
| [SoftWhisper](https://github.com/NullMagic2/SoftWhisper) |  | User-friendly GUI |
|
| 159 |
+
| [speech-assistant](https://github.com/Mohamad-Hussein/speech-assistant) |  | Speech assistant GUI |
|
| 160 |
+
| [whisper-dictation](https://github.com/foges/whisper-dictation) |  | Dictation application |
|
| 161 |
+
| [whisper-realtime-gui](https://github.com/phongthanhbuiit/whisper-realtime-gui) |  | Real-time transcription GUI |
|
| 162 |
+
| [whisper-ui](https://github.com/schnoddelbotz/whisper-ui) |  | Cross-platform desktop UI |
|
| 163 |
+
| [whisper_dictation](https://github.com/themanyone/whisper_dictation) |  | Voice dictation tool |
|
| 164 |
+
| [WhisperGUI](https://github.com/ADT109119/WhisperGUI) |  | Simple GUI |
|
| 165 |
+
|
| 166 |
+
### Linux
|
| 167 |
+
|
| 168 |
+
#### Desktop Applications
|
| 169 |
+
- **[froshine](https://github.com/AdrianScott/froshine)**  - Linux desktop app
|
| 170 |
+
- **[speak-to-ai](https://github.com/AshBuk/speak-to-ai)**  - Voice interaction app
|
| 171 |
+
- **[Whisper-Notepad-For-Linux](https://github.com/danielrosehill/Whisper-Notepad-For-Linux)**  - Notepad-style transcription
|
| 172 |
+
- **[WhisperNow](https://github.com/shinglyu/WhisperNow)**  - Desktop application
|
| 173 |
+
|
| 174 |
+
#### CLI Tools
|
| 175 |
+
- **[whisper.cpp-cli](https://github.com/charliermarsh/whisper.cpp-cli)**  - CLI for whisper.cpp
|
| 176 |
+
- **[blurt](https://github.com/QuantiusBenignus/blurt)**  - Command-line transcription tool
|
| 177 |
+
|
| 178 |
+
#### System Integration
|
| 179 |
+
- **[nerd-dictation](https://github.com/ideasman42/nerd-dictation)**  - Hackable offline STT (VOSK-API)
|
| 180 |
+
- **[BlahST](https://github.com/QuantiusBenignus/BlahST)**  - Speech-to-text integration
|
| 181 |
+
- **[Linux-Dictation-Project](https://github.com/wheeler01/Linux-Dictation-Project)**  - Dictation system
|
| 182 |
+
- **[linux-stt-input](https://github.com/fengwk/linux-stt-input)**  - STT input method
|
| 183 |
+
- **[linux-voice-to-text-ai](https://github.com/trebormc/linux-voice-to-text-ai)**  - Voice-to-text AI
|
| 184 |
+
- **[LinuxWhisper](https://github.com/vitali87/LinuxWhisper)**  - Linux implementation
|
| 185 |
+
- **[voice-typing-linux](https://github.com/GitJuhb/voice-typing-linux)**  - Voice typing integration
|
| 186 |
+
- **[Whisper-Dictation](https://github.com/LumenYoung/Whisper-Dictation)**  - Dictation system
|
| 187 |
+
- **[whisper-flow-linux](https://github.com/sapountzis/whisper-flow-linux)**  - Workflow integration
|
| 188 |
+
- **[whisper-hotkey-linux](https://github.com/atkvishnu/whisper-hotkey-linux)**  - Hotkey-based integration
|
| 189 |
+
- **[whispertrigger](https://github.com/RetroTrigger/whispertrigger)**  - System integration
|
| 190 |
+
- **[whisprd](https://github.com/AgenticToaster/whisprd)**  - Whisper daemon
|
| 191 |
+
- **[whisper-to-input](https://github.com/j3soon/whisper-to-input)**  - Transcription to keyboard input
|
| 192 |
+
- **[whispy](https://github.com/daaku/whispy)**  - Integration tool
|
| 193 |
+
- **[dicti](https://github.com/tksimson/dicti)**  - Dictation tool
|
| 194 |
+
- **[sonori](https://github.com/0xPD33/sonori)**  - Voice input system
|
| 195 |
+
- **[hushnote](https://github.com/peteonrails/hushnote)**  - Private note-taking
|
| 196 |
+
- **[Local-Voice](https://github.com/shashank2122/Local-Voice)**  - Local voice processing
|
| 197 |
+
- **[s2t](https://github.com/franchesoni/s2t)**  - Speech-to-text
|
| 198 |
+
- **[Whisper-Notepad-Simple](https://github.com/danielrosehill/Whisper-Notepad-Simple)**  - Simple notepad app
|
| 199 |
+
- **[Linux-AI-Assistant-scripts](https://github.com/samoylenkodmitry/Linux-AI-Assistant-scripts)**  - AI assistant scripts
|
| 200 |
+
|
| 201 |
+
### macOS
|
| 202 |
+
|
| 203 |
+
#### Desktop Applications
|
| 204 |
+
- **[SuperWhisper](https://superwhisper.com/)** - Premium Mac voice-to-text app
|
| 205 |
+
- **[OpenSuperWhisper](https://github.com/Starmel/OpenSuperWhisper)**  - Open-source Mac app
|
| 206 |
+
- **[WhisperKit](https://github.com/argmaxinc/WhisperKit)**  - Native macOS implementation
|
| 207 |
+
- **[Careless Whisper](https://carelesswhisper.app/)** - Lightweight transcription app
|
| 208 |
+
|
| 209 |
+
#### System Integration
|
| 210 |
+
- **[ollama-voice-mac](https://github.com/apeatling/ollama-voice-mac)**  - Voice interface for Ollama
|
| 211 |
+
- **[whisperanywhere-js](https://github.com/unclecode/whisperanywhere-js)**  - System-wide transcription
|
| 212 |
+
|
| 213 |
+
---
|
| 214 |
+
|
| 215 |
+
### Windows
|
| 216 |
+
|
| 217 |
+
#### Desktop Applications
|
| 218 |
+
- **[AI Transcription](https://apps.microsoft.com/detail/9p7f1j2svk3g)** - Microsoft Store app
|
| 219 |
+
- **[Whisper Typing for Windows](https://whispertyping.com/download)** - Desktop voice typing
|
| 220 |
+
|
| 221 |
+
#### System Integration
|
| 222 |
+
- **[WinWhisper](https://github.com/GewoonJaap/WinWhisper)**  - System-wide hotkey support
|
| 223 |
+
|
| 224 |
+
---
|
| 225 |
+
|
| 226 |
+
### Android
|
| 227 |
+
|
| 228 |
+
- **[whisperIME](https://github.com/woheller69/whisperIME)**  - Input method editor
|
| 229 |
+
- **[WhisperInput](https://github.com/alex-vt/WhisperInput)**  - Input app
|
| 230 |
+
- **[WhisperKitAndroid](https://github.com/argmaxinc/WhisperKitAndroid)**  - WhisperKit for Android
|
| 231 |
+
- **[RTranslator](https://github.com/niedev/RTranslator)**  - Real-time translation app
|
| 232 |
+
- **[Dictate](https://github.com/DevEmperor/Dictate)**  - Voice dictation app
|
| 233 |
+
- **[whisper_android](https://github.com/vilassn/whisper_android)**  - Android integration
|
| 234 |
+
|
| 235 |
+
---
|
| 236 |
+
|
| 237 |
+
### iOS
|
| 238 |
+
|
| 239 |
+
- **[Whisperboard](https://github.com/Saik0s/Whisperboard)**  - iOS keyboard with Whisper integration
|
| 240 |
+
|
| 241 |
+
---
|
| 242 |
+
|
| 243 |
+
### Embedded / Raspberry Pi
|
| 244 |
+
|
| 245 |
+
- **[Local-Voice](https://github.com/shashank2122/Local-Voice)**  - Local voice processing for embedded systems
|
| 246 |
+
|
| 247 |
+
---
|
| 248 |
+
|
| 249 |
+
## For Developers
|
| 250 |
+
|
| 251 |
+
### Model Variants & Performance Optimizations
|
| 252 |
+
|
| 253 |
+
### pyannote-whisper
|
| 254 |
+
|
| 255 |
+
 
|
| 256 |
+
|
| 257 |
+
Integration of Whisper with pyannote for speaker diarization
|
| 258 |
+
|
| 259 |
+
**Repository:** [https://github.com/yinruiqing/pyannote-whisper](https://github.com/yinruiqing/pyannote-whisper)
|
| 260 |
+
|
| 261 |
+
---
|
| 262 |
+
|
| 263 |
+
### WhisperChain
|
| 264 |
+
|
| 265 |
+
 
|
| 266 |
+
|
| 267 |
+
Pipeline framework for Whisper-based workflows
|
| 268 |
+
|
| 269 |
+
**Repository:** [https://github.com/chrischoy/WhisperChain](https://github.com/chrischoy/WhisperChain)
|
| 270 |
+
|
| 271 |
+
---
|
| 272 |
+
## IDE & Editor Integrations
|
| 273 |
+
### VS Code
|
| 274 |
+
|
| 275 |
+
### Whisper Assistant
|
| 276 |
+
|
| 277 |
+
Whisper voice-to-text integration for VS Code
|
| 278 |
+
|
| 279 |
+
**Repository:** [https://marketplace.visualstudio.com/items?itemName=MartinOpenSky.whisper-assistant](https://marketplace.visualstudio.com/items?itemName=MartinOpenSky.whisper-assistant)
|
| 280 |
+
|
| 281 |
+
---
|
| 282 |
+
|
| 283 |
+
### Yap - Cursor Extension
|
| 284 |
+
|
| 285 |
+
Voice input extension for VS Code and Cursor editor
|
| 286 |
+
|
| 287 |
+
**Repository:** [https://marketplace.visualstudio.com/items?itemName=rishabhsai.yap-cursor-extension](https://marketplace.visualstudio.com/items?itemName=rishabhsai.yap-cursor-extension)
|
| 288 |
+
|
| 289 |
+
---
|
| 290 |
+
|
| 291 |
+
### WhisperX Assistant
|
| 292 |
+
|
| 293 |
+
WhisperX integration for VS Code with enhanced features
|
| 294 |
+
|
| 295 |
+
**Repository:** [https://marketplace.visualstudio.com/items?itemName=mwhesse.whisperx-assistant](https://marketplace.visualstudio.com/items?itemName=mwhesse.whisperx-assistant)
|
| 296 |
+
|
| 297 |
+
---
|
| 298 |
+
### Obsidian
|
| 299 |
+
|
| 300 |
+
### whisper-obsidian-plugin
|
| 301 |
+
|
| 302 |
+
 
|
| 303 |
+
|
| 304 |
+
Whisper integration for Obsidian note-taking app
|
| 305 |
+
|
| 306 |
+
**Repository:** [https://github.com/nikdanilov/whisper-obsidian-plugin](https://github.com/nikdanilov/whisper-obsidian-plugin)
|
| 307 |
+
|
| 308 |
+
---
|
| 309 |
+
### Note-Taking & Productivity
|
| 310 |
+
|
| 311 |
+
### ScribeWizard
|
| 312 |
+
|
| 313 |
+
 
|
| 314 |
+
|
| 315 |
+
AI-powered note-taking with Whisper transcription
|
| 316 |
+
|
| 317 |
+
**Repository:** [https://github.com/Bklieger/ScribeWizard](https://github.com/Bklieger/ScribeWizard)
|
| 318 |
+
|
| 319 |
+
---
|
| 320 |
+
## Game Engines & Development Platforms
|
| 321 |
+
### Unity
|
| 322 |
+
|
| 323 |
+
### whisper.unity
|
| 324 |
+
|
| 325 |
+
 
|
| 326 |
+
|
| 327 |
+
Whisper integration for Unity game engine
|
| 328 |
+
|
| 329 |
+
**Repository:** [https://github.com/Macoron/whisper.unity](https://github.com/Macoron/whisper.unity)
|
| 330 |
+
|
| 331 |
+
---
|
| 332 |
+
## Playgrounds & Demos
|
| 333 |
+
|
| 334 |
+
### whisper-playground
|
| 335 |
+
|
| 336 |
+
 
|
| 337 |
+
|
| 338 |
+
Interactive playground for experimenting with Whisper
|
| 339 |
+
|
| 340 |
+
**Repository:** [https://github.com/saharmor/whisper-playground](https://github.com/saharmor/whisper-playground)
|
| 341 |
+
|
| 342 |
+
---
|
| 343 |
+
## SRT / Subtitles & Captioning
|
| 344 |
+
|
| 345 |
+
### auto-subs
|
| 346 |
+
|
| 347 |
+
 
|
| 348 |
+
|
| 349 |
+
Automatic subtitle generation with Whisper
|
| 350 |
+
|
| 351 |
+
**Repository:** [https://github.com/tmoroney/auto-subs](https://github.com/tmoroney/auto-subs)
|
| 352 |
+
|
| 353 |
+
---
|
| 354 |
+
|
| 355 |
+
### template-tiktok
|
| 356 |
+
|
| 357 |
+
 
|
| 358 |
+
|
| 359 |
+
TikTok-style captioning with Whisper integration using Remotion
|
| 360 |
+
|
| 361 |
+
**Repository:** [https://github.com/remotion-dev/template-tiktok](https://github.com/remotion-dev/template-tiktok)
|
| 362 |
+
|
| 363 |
+
---
|
| 364 |
+
|
| 365 |
+
### TeroSubtitler
|
| 366 |
+
|
| 367 |
+
 
|
| 368 |
+
|
| 369 |
+
Professional subtitle editor with Whisper integration
|
| 370 |
+
|
| 371 |
+
**Repository:** [https://github.com/URUWorks/TeroSubtitler](https://github.com/URUWorks/TeroSubtitler)
|
| 372 |
+
|
| 373 |
+
---
|
| 374 |
+
|
| 375 |
+
### whisper-subs
|
| 376 |
+
|
| 377 |
+
 
|
| 378 |
+
|
| 379 |
+
CLI tool for adding subtitles to videos using Whisper
|
| 380 |
+
|
| 381 |
+
**Repository:** [https://github.com/GhostNaN/whisper-subs](https://github.com/GhostNaN/whisper-subs)
|
| 382 |
+
|
| 383 |
+
---
|
| 384 |
+
|
| 385 |
+
### whisper-youtube
|
| 386 |
+
|
| 387 |
+
 
|
| 388 |
+
|
| 389 |
+
Generate subtitles from YouTube videos using Whisper
|
| 390 |
+
|
| 391 |
+
**Repository:** [https://github.com/ArthurFDLR/whisper-youtube](https://github.com/ArthurFDLR/whisper-youtube)
|
| 392 |
+
|
| 393 |
+
---
|
| 394 |
+
|
| 395 |
+
### whisply
|
| 396 |
+
|
| 397 |
+
 
|
| 398 |
+
|
| 399 |
+
Linux tool for automatic subtitle generation
|
| 400 |
+
|
| 401 |
+
**Repository:** [https://github.com/tsmdt/whisply](https://github.com/tsmdt/whisply)
|
| 402 |
+
|
| 403 |
+
---
|
| 404 |
+
|
| 405 |
+
### yt-whisper
|
| 406 |
+
|
| 407 |
+
 
|
| 408 |
+
|
| 409 |
+
YouTube subtitle generation with Whisper
|
| 410 |
+
|
| 411 |
+
**Repository:** [https://github.com/m1guelpf/yt-whisper](https://github.com/m1guelpf/yt-whisper)
|
| 412 |
+
|
| 413 |
+
---
|
| 414 |
+
## Deployment & Containers
|
| 415 |
+
|
| 416 |
+
### cog-whisper
|
| 417 |
+
|
| 418 |
+
 
|
| 419 |
+
|
| 420 |
+
Cog container for deploying Whisper models
|
| 421 |
+
|
| 422 |
+
**Repository:** [https://github.com/replicate/cog-whisper](https://github.com/replicate/cog-whisper)
|
| 423 |
+
|
| 424 |
+
---
|
| 425 |
+
## Meeting & Productivity
|
| 426 |
+
|
| 427 |
+
### meeting-minutes
|
| 428 |
+
|
| 429 |
+
 
|
| 430 |
+
|
| 431 |
+
Generate meeting minutes using Whisper transcription
|
| 432 |
+
|
| 433 |
+
**Repository:** [https://github.com/Zackriya-Solutions/meeting-minutes](https://github.com/Zackriya-Solutions/meeting-minutes)
|
| 434 |
+
|
| 435 |
+
---
|
| 436 |
+
## Miscellaneous
|
| 437 |
+
|
| 438 |
+
### whisper-turbo
|
| 439 |
+
|
| 440 |
+
 
|
| 441 |
+
|
| 442 |
+
High-performance Whisper implementation
|
| 443 |
+
|
| 444 |
+
**Repository:** [https://github.com/FL33TW00D/whisper-turbo](https://github.com/FL33TW00D/whisper-turbo)
|
| 445 |
+
|
| 446 |
+
---
|
| 447 |
+
## Resources
|
| 448 |
+
### Official
|
| 449 |
+
- [OpenAI Whisper Paper](https://arxiv.org/abs/2212.04356)
|
| 450 |
+
|
| 451 |
+
### Tutorials & Guides
|
| 452 |
+
### Model Variants
|
| 453 |
+
|
| 454 |
+
### CrisperWhisper
|
| 455 |
+
|
| 456 |
+
 
|
| 457 |
+
|
| 458 |
+
Enhanced Whisper variant for improved accuracy
|
| 459 |
+
|
| 460 |
+
**Repository:** [https://github.com/nyrahealth/CrisperWhisper](https://github.com/nyrahealth/CrisperWhisper)
|
| 461 |
+
|
| 462 |
+
---
|
| 463 |
+
|
| 464 |
+
### distil-whisper
|
| 465 |
+
|
| 466 |
+
 
|
| 467 |
+
|
| 468 |
+
Distilled Whisper models from Hugging Face
|
| 469 |
+
|
| 470 |
+
**Repository:** [https://github.com/huggingface/distil-whisper](https://github.com/huggingface/distil-whisper)
|
| 471 |
+
|
| 472 |
+
---
|
| 473 |
+
|
| 474 |
+
### faster-whisper
|
| 475 |
+
|
| 476 |
+
 
|
| 477 |
+
|
| 478 |
+
Faster Whisper implementation using CTranslate2
|
| 479 |
+
|
| 480 |
+
**Repository:** [https://github.com/SYSTRAN/faster-whisper](https://github.com/SYSTRAN/faster-whisper)
|
| 481 |
+
|
| 482 |
+
---
|
| 483 |
+
|
| 484 |
+
### insanely-fast-whisper
|
| 485 |
+
|
| 486 |
+
 
|
| 487 |
+
|
| 488 |
+
Optimized Whisper implementation for speed
|
| 489 |
+
|
| 490 |
+
**Repository:** [https://github.com/Vaibhavs10/insanely-fast-whisper](https://github.com/Vaibhavs10/insanely-fast-whisper)
|
| 491 |
+
|
| 492 |
+
---
|
| 493 |
+
|
| 494 |
+
### whisper.cpp
|
| 495 |
+
|
| 496 |
+
 
|
| 497 |
+
|
| 498 |
+
High-performance C/C++ implementation
|
| 499 |
+
|
| 500 |
+
**Repository:** [https://github.com/ggerganov/whisper.cpp](https://github.com/ggerganov/whisper.cpp)
|
| 501 |
+
|
| 502 |
+
---
|
| 503 |
+
|
| 504 |
+
### whisper.net
|
| 505 |
+
|
| 506 |
+
 
|
| 507 |
+
|
| 508 |
+
.NET implementation of Whisper
|
| 509 |
+
|
| 510 |
+
**Repository:** [https://github.com/sandrohanea/whisper.net](https://github.com/sandrohanea/whisper.net)
|
| 511 |
+
|
| 512 |
+
---
|
| 513 |
+
|
| 514 |
+
### WhisperX
|
| 515 |
+
|
| 516 |
+
 
|
| 517 |
+
|
| 518 |
+
Whisper with word-level timestamps and speaker diarization
|
| 519 |
+
|
| 520 |
+
**Repository:** [https://github.com/m-bain/whisperX](https://github.com/m-bain/whisperX)
|
| 521 |
+
|
| 522 |
+
---
|
| 523 |
+
### Real-Time & Streaming
|
| 524 |
+
|
| 525 |
+
### whisper-flow
|
| 526 |
+
|
| 527 |
+
 
|
| 528 |
+
|
| 529 |
+
Real-time Whisper transcription flow
|
| 530 |
+
|
| 531 |
+
**Repository:** [https://github.com/dimastatz/whisper-flow](https://github.com/dimastatz/whisper-flow)
|
| 532 |
+
|
| 533 |
+
---
|
| 534 |
+
|
| 535 |
+
### whisper_real_time
|
| 536 |
+
|
| 537 |
+
 
|
| 538 |
+
|
| 539 |
+
Real-time Whisper transcription implementation
|
| 540 |
+
|
| 541 |
+
**Repository:** [https://github.com/davabase/whisper_real_time](https://github.com/davabase/whisper_real_time)
|
| 542 |
+
|
| 543 |
+
---
|
| 544 |
+
|
| 545 |
+
### whisper_streaming
|
| 546 |
+
|
| 547 |
+
 
|
| 548 |
+
|
| 549 |
+
Whisper for long-form streaming transcription
|
| 550 |
+
|
| 551 |
+
**Repository:** [https://github.com/ufal/whisper_streaming](https://github.com/ufal/whisper_streaming)
|
| 552 |
+
|
| 553 |
+
---
|
| 554 |
+
|
| 555 |
+
### WhisperLive
|
| 556 |
+
|
| 557 |
+
 
|
| 558 |
+
|
| 559 |
+
Real-time transcription using Whisper
|
| 560 |
+
|
| 561 |
+
**Repository:** [https://github.com/collabora/WhisperLive](https://github.com/collabora/WhisperLive)
|
| 562 |
+
|
| 563 |
+
---
|
| 564 |
+
### Diarization & Timestamps
|
| 565 |
+
|
| 566 |
+
### cog-whisper-diarization
|
| 567 |
+
|
| 568 |
+
 
|
| 569 |
+
|
| 570 |
+
Cog-wrapped Whisper with diarization
|
| 571 |
+
|
| 572 |
+
**Repository:** [https://github.com/thomasmol/cog-whisper-diarization](https://github.com/thomasmol/cog-whisper-diarization)
|
| 573 |
+
|
| 574 |
+
---
|
| 575 |
+
|
| 576 |
+
### whisper-diarization
|
| 577 |
+
|
| 578 |
+
 
|
| 579 |
+
|
| 580 |
+
Whisper with speaker diarization
|
| 581 |
+
|
| 582 |
+
**Repository:** [https://github.com/MahmoudAshraf97/whisper-diarization](https://github.com/MahmoudAshraf97/whisper-diarization)
|
| 583 |
+
|
| 584 |
+
---
|
| 585 |
+
|
| 586 |
+
### whisper-timestamped
|
| 587 |
+
|
| 588 |
+
 
|
| 589 |
+
|
| 590 |
+
Word-level timestamps for Whisper
|
| 591 |
+
|
| 592 |
+
**Repository:** [https://github.com/linto-ai/whisper-timestamped](https://github.com/linto-ai/whisper-timestamped)
|
| 593 |
+
|
| 594 |
+
---
|
| 595 |
+
|
| 596 |
+
### WhisperTimeSync
|
| 597 |
+
|
| 598 |
+
 
|
| 599 |
+
|
| 600 |
+
Time synchronization and diarization for Whisper
|
| 601 |
+
|
| 602 |
+
**Repository:** [https://github.com/EtienneAb3d/WhisperTimeSync](https://github.com/EtienneAb3d/WhisperTimeSync)
|
| 603 |
+
|
| 604 |
+
---
|
| 605 |
+
### Fine-Tuning
|
| 606 |
+
|
| 607 |
+
### Whisper-Finetune
|
| 608 |
+
|
| 609 |
+
 
|
| 610 |
+
|
| 611 |
+
Utilities for fine-tuning Whisper models
|
| 612 |
+
|
| 613 |
+
**Repository:** [https://github.com/yeyupiaoling/Whisper-Finetune](https://github.com/yeyupiaoling/Whisper-Finetune)
|
| 614 |
+
|
| 615 |
+
---
|
| 616 |
+
|
| 617 |
+
### whisper-finetuning
|
| 618 |
+
|
| 619 |
+
 
|
| 620 |
+
|
| 621 |
+
Fine-tuning framework for Whisper models
|
| 622 |
+
|
| 623 |
+
**Repository:** [https://github.com/jumon/whisper-finetuning](https://github.com/jumon/whisper-finetuning)
|
| 624 |
+
|
| 625 |
+
---
|
| 626 |
+
### Awesome Lists
|
| 627 |
+
- [awesome-openai-whisper (ancs21)](https://github.com/ancs21/awesome-openai-whisper)
|
| 628 |
+
- [awesome-whisper (saharmor)](https://github.com/saharmor/awesome-whisper)
|
| 629 |
+
- [awesome-whisper (oenu)](https://github.com/oenu/awesome-whisper)
|
| 630 |
+
|
| 631 |
+
|
| 632 |
+
|
script.js
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// Main application state
|
| 2 |
+
let allProjects = [];
|
| 3 |
+
let filteredProjects = [];
|
| 4 |
+
let currentPlatformFilter = 'all';
|
| 5 |
+
let currentUsecaseFilter = 'all';
|
| 6 |
+
let currentSearchQuery = '';
|
| 7 |
+
let currentSort = 'name';
|
| 8 |
+
|
| 9 |
+
// Load projects data
|
| 10 |
+
async function loadProjects() {
|
| 11 |
+
try {
|
| 12 |
+
const response = await fetch('projects.json');
|
| 13 |
+
allProjects = await response.json();
|
| 14 |
+
filteredProjects = [...allProjects];
|
| 15 |
+
renderProjects();
|
| 16 |
+
updateProjectCount();
|
| 17 |
+
} catch (error) {
|
| 18 |
+
console.error('Error loading projects:', error);
|
| 19 |
+
document.getElementById('projects-grid').innerHTML = `
|
| 20 |
+
<div class="no-results">
|
| 21 |
+
<h3>Error loading projects</h3>
|
| 22 |
+
<p>Unable to load the projects data. Please try refreshing the page.</p>
|
| 23 |
+
</div>
|
| 24 |
+
`;
|
| 25 |
+
}
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
+
// Apply all filters
|
| 29 |
+
function applyFilters() {
|
| 30 |
+
filteredProjects = allProjects.filter(project => {
|
| 31 |
+
// Platform filter
|
| 32 |
+
const platformMatch = currentPlatformFilter === 'all' ||
|
| 33 |
+
project.platforms.includes(currentPlatformFilter);
|
| 34 |
+
|
| 35 |
+
// Use case filter
|
| 36 |
+
const usecaseMatch = currentUsecaseFilter === 'all' ||
|
| 37 |
+
project.usecases.includes(currentUsecaseFilter);
|
| 38 |
+
|
| 39 |
+
// Search query
|
| 40 |
+
const searchMatch = currentSearchQuery === '' ||
|
| 41 |
+
project.name.toLowerCase().includes(currentSearchQuery.toLowerCase()) ||
|
| 42 |
+
project.description.toLowerCase().includes(currentSearchQuery.toLowerCase());
|
| 43 |
+
|
| 44 |
+
return platformMatch && usecaseMatch && searchMatch;
|
| 45 |
+
});
|
| 46 |
+
|
| 47 |
+
sortProjects();
|
| 48 |
+
renderProjects();
|
| 49 |
+
updateProjectCount();
|
| 50 |
+
}
|
| 51 |
+
|
| 52 |
+
// Sort projects
|
| 53 |
+
function sortProjects() {
|
| 54 |
+
switch (currentSort) {
|
| 55 |
+
case 'name':
|
| 56 |
+
filteredProjects.sort((a, b) => a.name.localeCompare(b.name));
|
| 57 |
+
break;
|
| 58 |
+
case 'platform':
|
| 59 |
+
filteredProjects.sort((a, b) => {
|
| 60 |
+
const platformA = a.platforms[0] || '';
|
| 61 |
+
const platformB = b.platforms[0] || '';
|
| 62 |
+
return platformA.localeCompare(platformB);
|
| 63 |
+
});
|
| 64 |
+
break;
|
| 65 |
+
case 'usecase':
|
| 66 |
+
filteredProjects.sort((a, b) => {
|
| 67 |
+
const usecaseA = a.usecases[0] || '';
|
| 68 |
+
const usecaseB = b.usecases[0] || '';
|
| 69 |
+
return usecaseA.localeCompare(usecaseB);
|
| 70 |
+
});
|
| 71 |
+
break;
|
| 72 |
+
}
|
| 73 |
+
}
|
| 74 |
+
|
| 75 |
+
// Render projects to the grid
|
| 76 |
+
function renderProjects() {
|
| 77 |
+
const grid = document.getElementById('projects-grid');
|
| 78 |
+
|
| 79 |
+
if (filteredProjects.length === 0) {
|
| 80 |
+
grid.innerHTML = `
|
| 81 |
+
<div class="no-results">
|
| 82 |
+
<h3>No projects found</h3>
|
| 83 |
+
<p>Try adjusting your filters or search query.</p>
|
| 84 |
+
</div>
|
| 85 |
+
`;
|
| 86 |
+
return;
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
grid.innerHTML = filteredProjects.map(project => createProjectCard(project)).join('');
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
// Create a project card HTML
|
| 93 |
+
function createProjectCard(project) {
|
| 94 |
+
const platformTags = project.platforms
|
| 95 |
+
.map(p => `<span class="meta-tag platform-tag">${formatTag(p)}</span>`)
|
| 96 |
+
.join('');
|
| 97 |
+
|
| 98 |
+
const usecaseTags = project.usecases
|
| 99 |
+
.map(u => `<span class="meta-tag usecase-tag">${formatTag(u)}</span>`)
|
| 100 |
+
.join('');
|
| 101 |
+
|
| 102 |
+
const githubLink = project.github_repo
|
| 103 |
+
? `<a href="https://github.com/${project.github_repo}" target="_blank" rel="noopener">GitHub �</a>`
|
| 104 |
+
: '';
|
| 105 |
+
|
| 106 |
+
return `
|
| 107 |
+
<div class="project-card">
|
| 108 |
+
<h3>
|
| 109 |
+
<a href="${project.url}" target="_blank" rel="noopener">${escapeHtml(project.name)}</a>
|
| 110 |
+
</h3>
|
| 111 |
+
<p class="project-description">${escapeHtml(project.description)}</p>
|
| 112 |
+
<div class="project-meta">
|
| 113 |
+
${platformTags}
|
| 114 |
+
${usecaseTags}
|
| 115 |
+
</div>
|
| 116 |
+
</div>
|
| 117 |
+
`;
|
| 118 |
+
}
|
| 119 |
+
|
| 120 |
+
// Format tag names for display
|
| 121 |
+
function formatTag(tag) {
|
| 122 |
+
return tag
|
| 123 |
+
.split('-')
|
| 124 |
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
| 125 |
+
.join(' ');
|
| 126 |
+
}
|
| 127 |
+
|
| 128 |
+
// Escape HTML to prevent XSS
|
| 129 |
+
function escapeHtml(text) {
|
| 130 |
+
const div = document.createElement('div');
|
| 131 |
+
div.textContent = text;
|
| 132 |
+
return div.innerHTML;
|
| 133 |
+
}
|
| 134 |
+
|
| 135 |
+
// Update project count display
|
| 136 |
+
function updateProjectCount() {
|
| 137 |
+
const count = document.getElementById('project-count');
|
| 138 |
+
count.textContent = `(${filteredProjects.length} of ${allProjects.length})`;
|
| 139 |
+
}
|
| 140 |
+
|
| 141 |
+
// Set up event listeners
|
| 142 |
+
function setupEventListeners() {
|
| 143 |
+
// Platform filter buttons
|
| 144 |
+
document.querySelectorAll('#platform-filters .filter-btn').forEach(btn => {
|
| 145 |
+
btn.addEventListener('click', () => {
|
| 146 |
+
// Remove active class from all platform buttons
|
| 147 |
+
document.querySelectorAll('#platform-filters .filter-btn').forEach(b => {
|
| 148 |
+
b.classList.remove('active');
|
| 149 |
+
});
|
| 150 |
+
|
| 151 |
+
// Add active class to clicked button
|
| 152 |
+
btn.classList.add('active');
|
| 153 |
+
|
| 154 |
+
// Update filter
|
| 155 |
+
currentPlatformFilter = btn.dataset.filter;
|
| 156 |
+
applyFilters();
|
| 157 |
+
});
|
| 158 |
+
});
|
| 159 |
+
|
| 160 |
+
// Use case filter buttons
|
| 161 |
+
document.querySelectorAll('#usecase-filters .filter-btn').forEach(btn => {
|
| 162 |
+
btn.addEventListener('click', () => {
|
| 163 |
+
// Remove active class from all usecase buttons
|
| 164 |
+
document.querySelectorAll('#usecase-filters .filter-btn').forEach(b => {
|
| 165 |
+
b.classList.remove('active');
|
| 166 |
+
});
|
| 167 |
+
|
| 168 |
+
// Add active class to clicked button
|
| 169 |
+
btn.classList.add('active');
|
| 170 |
+
|
| 171 |
+
// Update filter
|
| 172 |
+
currentUsecaseFilter = btn.dataset.filter;
|
| 173 |
+
applyFilters();
|
| 174 |
+
});
|
| 175 |
+
});
|
| 176 |
+
|
| 177 |
+
// Search input
|
| 178 |
+
const searchInput = document.getElementById('search-input');
|
| 179 |
+
searchInput.addEventListener('input', (e) => {
|
| 180 |
+
currentSearchQuery = e.target.value;
|
| 181 |
+
applyFilters();
|
| 182 |
+
});
|
| 183 |
+
|
| 184 |
+
// Sort select
|
| 185 |
+
const sortSelect = document.getElementById('sort-select');
|
| 186 |
+
sortSelect.addEventListener('change', (e) => {
|
| 187 |
+
currentSort = e.target.value;
|
| 188 |
+
sortProjects();
|
| 189 |
+
renderProjects();
|
| 190 |
+
});
|
| 191 |
+
}
|
| 192 |
+
|
| 193 |
+
// Initialize the application
|
| 194 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 195 |
+
setupEventListeners();
|
| 196 |
+
loadProjects();
|
| 197 |
+
});
|
style.css
CHANGED
|
@@ -1,28 +1,305 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
body {
|
| 2 |
-
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
}
|
| 5 |
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
}
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
|
|
|
| 16 |
}
|
| 17 |
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
border-radius: 16px;
|
| 24 |
}
|
| 25 |
|
| 26 |
-
.
|
| 27 |
-
|
|
|
|
| 28 |
}
|
|
|
|
| 1 |
+
* {
|
| 2 |
+
margin: 0;
|
| 3 |
+
padding: 0;
|
| 4 |
+
box-sizing: border-box;
|
| 5 |
+
}
|
| 6 |
+
|
| 7 |
body {
|
| 8 |
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
| 9 |
+
line-height: 1.6;
|
| 10 |
+
color: #333;
|
| 11 |
+
background-color: #f5f7fa;
|
| 12 |
+
}
|
| 13 |
+
|
| 14 |
+
.container {
|
| 15 |
+
max-width: 1400px;
|
| 16 |
+
margin: 0 auto;
|
| 17 |
+
padding: 0 20px;
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
/* Header */
|
| 21 |
+
header {
|
| 22 |
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
| 23 |
+
color: white;
|
| 24 |
+
padding: 3rem 0;
|
| 25 |
+
text-align: center;
|
| 26 |
+
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
header h1 {
|
| 30 |
+
font-size: 2.5rem;
|
| 31 |
+
margin-bottom: 0.5rem;
|
| 32 |
+
font-weight: 700;
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
.subtitle {
|
| 36 |
+
font-size: 1.1rem;
|
| 37 |
+
opacity: 0.95;
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
/* Main Content */
|
| 41 |
+
main {
|
| 42 |
+
padding: 2rem 0;
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
/* Filters Section */
|
| 46 |
+
.filters {
|
| 47 |
+
background: white;
|
| 48 |
+
padding: 2rem;
|
| 49 |
+
border-radius: 12px;
|
| 50 |
+
box-shadow: 0 2px 8px rgba(0,0,0,0.08);
|
| 51 |
+
margin-bottom: 2rem;
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
.filters h2 {
|
| 55 |
+
margin-bottom: 1.5rem;
|
| 56 |
+
color: #2d3748;
|
| 57 |
+
font-size: 1.5rem;
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
.filter-group {
|
| 61 |
+
display: flex;
|
| 62 |
+
flex-direction: column;
|
| 63 |
+
gap: 2rem;
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
.filter-section h3 {
|
| 67 |
+
margin-bottom: 1rem;
|
| 68 |
+
color: #4a5568;
|
| 69 |
+
font-size: 1.1rem;
|
| 70 |
+
}
|
| 71 |
+
|
| 72 |
+
.filter-buttons {
|
| 73 |
+
display: flex;
|
| 74 |
+
flex-wrap: wrap;
|
| 75 |
+
gap: 0.5rem;
|
| 76 |
+
}
|
| 77 |
+
|
| 78 |
+
.filter-btn {
|
| 79 |
+
padding: 0.5rem 1rem;
|
| 80 |
+
border: 2px solid #e2e8f0;
|
| 81 |
+
background: white;
|
| 82 |
+
border-radius: 6px;
|
| 83 |
+
cursor: pointer;
|
| 84 |
+
font-size: 0.9rem;
|
| 85 |
+
transition: all 0.2s;
|
| 86 |
+
color: #4a5568;
|
| 87 |
+
font-weight: 500;
|
| 88 |
+
}
|
| 89 |
+
|
| 90 |
+
.filter-btn:hover {
|
| 91 |
+
border-color: #667eea;
|
| 92 |
+
color: #667eea;
|
| 93 |
+
transform: translateY(-1px);
|
| 94 |
+
}
|
| 95 |
+
|
| 96 |
+
.filter-btn.active {
|
| 97 |
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
| 98 |
+
color: white;
|
| 99 |
+
border-color: transparent;
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
+
.search-section input {
|
| 103 |
+
width: 100%;
|
| 104 |
+
padding: 0.75rem 1rem;
|
| 105 |
+
border: 2px solid #e2e8f0;
|
| 106 |
+
border-radius: 8px;
|
| 107 |
+
font-size: 1rem;
|
| 108 |
+
transition: border-color 0.2s;
|
| 109 |
+
}
|
| 110 |
+
|
| 111 |
+
.search-section input:focus {
|
| 112 |
+
outline: none;
|
| 113 |
+
border-color: #667eea;
|
| 114 |
+
}
|
| 115 |
+
|
| 116 |
+
/* Results Section */
|
| 117 |
+
.results {
|
| 118 |
+
background: white;
|
| 119 |
+
padding: 2rem;
|
| 120 |
+
border-radius: 12px;
|
| 121 |
+
box-shadow: 0 2px 8px rgba(0,0,0,0.08);
|
| 122 |
+
}
|
| 123 |
+
|
| 124 |
+
.results-header {
|
| 125 |
+
display: flex;
|
| 126 |
+
justify-content: space-between;
|
| 127 |
+
align-items: center;
|
| 128 |
+
margin-bottom: 1.5rem;
|
| 129 |
+
flex-wrap: wrap;
|
| 130 |
+
gap: 1rem;
|
| 131 |
+
}
|
| 132 |
+
|
| 133 |
+
.results-header h2 {
|
| 134 |
+
color: #2d3748;
|
| 135 |
+
font-size: 1.5rem;
|
| 136 |
+
}
|
| 137 |
+
|
| 138 |
+
#project-count {
|
| 139 |
+
color: #667eea;
|
| 140 |
+
font-weight: 600;
|
| 141 |
+
}
|
| 142 |
+
|
| 143 |
+
.sort-controls {
|
| 144 |
+
display: flex;
|
| 145 |
+
align-items: center;
|
| 146 |
+
gap: 0.5rem;
|
| 147 |
}
|
| 148 |
|
| 149 |
+
.sort-controls label {
|
| 150 |
+
color: #4a5568;
|
| 151 |
+
font-weight: 500;
|
| 152 |
+
}
|
| 153 |
+
|
| 154 |
+
.sort-controls select {
|
| 155 |
+
padding: 0.5rem 1rem;
|
| 156 |
+
border: 2px solid #e2e8f0;
|
| 157 |
+
border-radius: 6px;
|
| 158 |
+
font-size: 0.9rem;
|
| 159 |
+
cursor: pointer;
|
| 160 |
+
background: white;
|
| 161 |
+
}
|
| 162 |
+
|
| 163 |
+
/* Projects Grid */
|
| 164 |
+
.projects-grid {
|
| 165 |
+
display: grid;
|
| 166 |
+
grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
|
| 167 |
+
gap: 1.5rem;
|
| 168 |
+
}
|
| 169 |
+
|
| 170 |
+
.project-card {
|
| 171 |
+
background: #f9fafb;
|
| 172 |
+
border: 2px solid #e2e8f0;
|
| 173 |
+
border-radius: 10px;
|
| 174 |
+
padding: 1.5rem;
|
| 175 |
+
transition: all 0.3s;
|
| 176 |
+
position: relative;
|
| 177 |
+
}
|
| 178 |
+
|
| 179 |
+
.project-card:hover {
|
| 180 |
+
transform: translateY(-4px);
|
| 181 |
+
box-shadow: 0 8px 16px rgba(0,0,0,0.1);
|
| 182 |
+
border-color: #667eea;
|
| 183 |
+
}
|
| 184 |
+
|
| 185 |
+
.project-card h3 {
|
| 186 |
+
color: #2d3748;
|
| 187 |
+
margin-bottom: 0.75rem;
|
| 188 |
+
font-size: 1.2rem;
|
| 189 |
+
}
|
| 190 |
+
|
| 191 |
+
.project-card h3 a {
|
| 192 |
+
color: #667eea;
|
| 193 |
+
text-decoration: none;
|
| 194 |
+
}
|
| 195 |
+
|
| 196 |
+
.project-card h3 a:hover {
|
| 197 |
+
text-decoration: underline;
|
| 198 |
+
}
|
| 199 |
+
|
| 200 |
+
.project-description {
|
| 201 |
+
color: #4a5568;
|
| 202 |
+
margin-bottom: 1rem;
|
| 203 |
+
font-size: 0.95rem;
|
| 204 |
+
}
|
| 205 |
+
|
| 206 |
+
.project-meta {
|
| 207 |
+
display: flex;
|
| 208 |
+
flex-wrap: wrap;
|
| 209 |
+
gap: 0.5rem;
|
| 210 |
+
margin-top: 1rem;
|
| 211 |
+
}
|
| 212 |
+
|
| 213 |
+
.meta-tag {
|
| 214 |
+
padding: 0.25rem 0.75rem;
|
| 215 |
+
border-radius: 20px;
|
| 216 |
+
font-size: 0.8rem;
|
| 217 |
+
font-weight: 500;
|
| 218 |
+
}
|
| 219 |
+
|
| 220 |
+
.platform-tag {
|
| 221 |
+
background: #e6f4ff;
|
| 222 |
+
color: #0066cc;
|
| 223 |
+
}
|
| 224 |
+
|
| 225 |
+
.usecase-tag {
|
| 226 |
+
background: #fff0e6;
|
| 227 |
+
color: #cc6600;
|
| 228 |
+
}
|
| 229 |
+
|
| 230 |
+
.github-stars {
|
| 231 |
+
display: inline-block;
|
| 232 |
+
margin-left: 0.5rem;
|
| 233 |
+
color: #718096;
|
| 234 |
+
font-size: 0.85rem;
|
| 235 |
+
}
|
| 236 |
+
|
| 237 |
+
/* Footer */
|
| 238 |
+
footer {
|
| 239 |
+
background: #2d3748;
|
| 240 |
+
color: white;
|
| 241 |
+
text-align: center;
|
| 242 |
+
padding: 2rem 0;
|
| 243 |
+
margin-top: 3rem;
|
| 244 |
+
}
|
| 245 |
+
|
| 246 |
+
footer p {
|
| 247 |
+
margin-bottom: 0.5rem;
|
| 248 |
+
}
|
| 249 |
+
|
| 250 |
+
footer a {
|
| 251 |
+
color: #90cdf4;
|
| 252 |
+
text-decoration: none;
|
| 253 |
+
}
|
| 254 |
+
|
| 255 |
+
footer a:hover {
|
| 256 |
+
text-decoration: underline;
|
| 257 |
+
}
|
| 258 |
+
|
| 259 |
+
/* Responsive Design */
|
| 260 |
+
@media (max-width: 768px) {
|
| 261 |
+
header h1 {
|
| 262 |
+
font-size: 2rem;
|
| 263 |
+
}
|
| 264 |
+
|
| 265 |
+
.subtitle {
|
| 266 |
+
font-size: 1rem;
|
| 267 |
+
}
|
| 268 |
+
|
| 269 |
+
.projects-grid {
|
| 270 |
+
grid-template-columns: 1fr;
|
| 271 |
+
}
|
| 272 |
+
|
| 273 |
+
.results-header {
|
| 274 |
+
flex-direction: column;
|
| 275 |
+
align-items: flex-start;
|
| 276 |
+
}
|
| 277 |
+
|
| 278 |
+
.filter-buttons {
|
| 279 |
+
flex-direction: column;
|
| 280 |
+
}
|
| 281 |
+
|
| 282 |
+
.filter-btn {
|
| 283 |
+
width: 100%;
|
| 284 |
+
}
|
| 285 |
}
|
| 286 |
|
| 287 |
+
/* Loading State */
|
| 288 |
+
.loading {
|
| 289 |
+
text-align: center;
|
| 290 |
+
padding: 3rem;
|
| 291 |
+
color: #718096;
|
| 292 |
+
font-size: 1.1rem;
|
| 293 |
}
|
| 294 |
|
| 295 |
+
/* No Results */
|
| 296 |
+
.no-results {
|
| 297 |
+
text-align: center;
|
| 298 |
+
padding: 3rem;
|
| 299 |
+
color: #718096;
|
|
|
|
| 300 |
}
|
| 301 |
|
| 302 |
+
.no-results h3 {
|
| 303 |
+
color: #4a5568;
|
| 304 |
+
margin-bottom: 0.5rem;
|
| 305 |
}
|