This guide covers common issues and solutions when developing, deploying, or using OmniTranscripts.
No. YouTube is just one of many supported sources. OmniTranscripts supports:
- Local audio/video files - Upload
.mp3,.mp4,.wav, and more directly via file upload - Direct media URLs - Any publicly accessible audio/video URL
- 1000+ streaming platforms - YouTube, Vimeo, SoundCloud, Twitter/X, TikTok, and many more via yt-dlp
File Upload Example:
curl -X POST http://localhost:3000/transcribe \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@/path/to/recording.mp4"Go Library Example (Local Files):
result, err := engine.Transcribe(
"/path/to/local/video.mp4",
"job-123",
engine.DefaultOptions(),
)Audio: .mp3, .wav, .m4a, .flac, .ogg, .aac
Video: .mp4, .mkv, .webm, .avi, .mov
Maximum upload size: 500MB (configurable via MAX_UPLOAD_SIZE environment variable)
| Feature | URL-based | File Upload |
|---|---|---|
| Content Type | application/json |
multipart/form-data |
| Input | HTTP/HTTPS URL | Local file |
| Processing | Uses yt-dlp for download | Skips download stage |
| Short media (<2min) | Sync (immediate result) | Async (job ID) |
| Long media (>2min) | Async (job ID) | Async (job ID) |
Problem: The whisper.cpp binary is not found in the system PATH.
Solutions:
-
Install whisper.cpp properly:
git clone https://github.com/ggerganov/whisper.cpp.git cd whisper.cpp make sudo cp main /usr/local/bin/whisper.cpp -
Verify installation:
which whisper.cpp whisper.cpp --help
-
Alternative: Update PATH:
export PATH=$PATH:/path/to/whisper.cpp/directory echo 'export PATH=$PATH:/path/to/whisper.cpp' >> ~/.bashrc
-
Set custom path in environment:
WHISPER_PATH=/custom/path/to/whisper.cpp
Problem: The whisper.cpp model file is missing.
Solutions:
-
Download the model:
cd whisper.cpp bash ./models/download-ggml-model.sh base.en -
Copy to standard location:
sudo mkdir -p /usr/local/share/whisper sudo cp models/ggml-base.en.bin /usr/local/share/whisper/
-
Verify model path:
ls -la /usr/local/share/whisper/ggml-base.en.bin
-
Alternative models:
# Download different model sizes bash ./models/download-ggml-model.sh tiny.en # Fastest, least accurate bash ./models/download-ggml-model.sh small.en # Good balance bash ./models/download-ggml-model.sh medium.en # Better accuracy bash ./models/download-ggml-model.sh large # Best accuracy, slowest
Problem: YouTube downloader is missing or outdated.
Solutions:
-
Install/update yt-dlp:
# Using pip (recommended) pip install --upgrade yt-dlp # Using package manager brew install yt-dlp # macOS sudo apt install yt-dlp # Ubuntu/Debian
-
Verify installation:
yt-dlp --version yt-dlp --help
-
Test with a video:
yt-dlp --get-title "https://www.youtube.com/watch?v=dQw4w9WgXcQ" -
Common yt-dlp issues:
# Update to latest version (YouTube changes frequently) pip install --upgrade yt-dlp # Clear cache if downloads fail yt-dlp --rm-cache-dir # Use different extractor if needed yt-dlp --extractor-args "youtube:player_client=android"
Problem: FFmpeg is not installed or not in PATH.
Solutions:
-
Install FFmpeg:
# macOS brew install ffmpeg # Ubuntu/Debian sudo apt update && sudo apt install ffmpeg # CentOS/RHEL sudo yum install ffmpeg # Windows (using Chocolatey) choco install ffmpeg
-
Verify installation:
ffmpeg -version
-
Test audio processing:
ffmpeg -i input.mp4 -ar 16000 -ac 1 output.wav
Problem: The specified port is already occupied.
Solutions:
-
Find process using the port:
# Find process on port 3000 lsof -i :3000 netstat -tulpn | grep :3000
-
Kill the process:
sudo kill -9 <PID>
-
Use a different port:
PORT=3001
-
Auto-find available port (web-dashboard.go does this automatically):
func findAvailablePort(startPort int) int { for port := startPort; port < startPort+100; port++ { // Try to bind to port } }
Problem: Cannot connect to PostgreSQL database (Encore.dev deployments).
Solutions:
-
Check database status:
# Local PostgreSQL sudo systemctl status postgresql pg_isready -h localhost -p 5432 # Encore.dev encore db status
-
Verify connection string:
# Test connection psql "postgresql://user:pass@host:5432/dbname"
-
Reset Encore.dev database:
encore db reset encore db migrate
-
Check firewall/network:
telnet database-host 5432 nmap -p 5432 database-host
Problem: Authentication failures.
Solutions:
-
Verify environment variable:
echo $API_KEY grep API_KEY .env
-
Check API key format:
# Should be a non-empty string curl -H "Authorization: Bearer your-api-key" http://localhost:3000/health
-
Test with curl:
curl -X POST http://localhost:3000/transcribe \ -H "Authorization: Bearer dev-api-key-12345" \ -H "Content-Type: application/json" \ -d '{"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"}'
Problem: Jobs are not being processed.
Solutions:
-
Check worker status:
# Look for processing logs tail -f /var/log/videotranscript.log -
Verify external tools:
which yt-dlp ffmpeg whisper.cpp
-
Check disk space:
df -h $WORK_DIR du -sh $WORK_DIR/*
-
Restart job processing:
# For systemd service sudo systemctl restart videotranscript # For Docker docker restart videotranscript-container
-
Clear job queue (development only):
# Delete jobs.json file rm jobs.json # Or reset database encore db reset
Problem: Cannot download videos from YouTube.
Solutions:
-
Check video accessibility:
yt-dlp --get-title "https://www.youtube.com/watch?v=VIDEO_ID" -
Common video issues:
- Private videos: Not supported
- Age-restricted: May require authentication
- Geo-blocked: Use VPN or different region
- Copyright-protected: May be blocked
- Live streams: Only supported after stream ends
-
Update yt-dlp:
pip install --upgrade yt-dlp
-
Use alternative extractors:
yt-dlp --extractor-args "youtube:player_client=android" URL -
Check network connectivity:
curl -I https://www.youtube.com/ ping youtube.com
Problem: FFmpeg cannot process the downloaded audio.
Solutions:
-
Check audio file:
ffprobe downloaded_file.webm file downloaded_file.webm
-
Test FFmpeg manually:
ffmpeg -i input.webm -ar 16000 -ac 1 output.wav
-
Try different audio format:
yt-dlp --audio-format wav --extract-audio URL
-
Check available codecs:
ffmpeg -codecs | grep -i audio
Problem: whisper.cpp cannot process the audio file.
Solutions:
-
Check audio file format:
ffprobe -v quiet -print_format json -show_format audio.wav
-
Test whisper.cpp manually:
whisper.cpp -m models/ggml-base.en.bin -f audio.wav
-
Try different model:
# Download and try tiny model (faster, less accurate) bash ./models/download-ggml-model.sh tiny.en whisper.cpp -m models/ggml-tiny.en.bin -f audio.wav -
Check audio duration:
# Very long files may timeout ffprobe -v quiet -show_entries format=duration -of csv=p=0 audio.wav
Problem: Transcription takes too long.
Solutions:
-
Use faster model:
# tiny.en: ~32x faster than large, less accurate # small.en: ~6x faster than large, good accuracy # base.en: ~4x faster than large, good accuracy
-
Optimize server resources:
# Check CPU usage top htop # Check memory usage free -h
-
Enable CPU optimizations:
# Build whisper.cpp with optimizations cd whisper.cpp make clean make CFLAGS="-O3 -march=native"
-
Parallel processing:
// Increase worker count for multiple jobs const MaxWorkers = 4 // Adjust based on CPU cores
Problem: Application consumes too much memory.
Solutions:
-
Monitor memory usage:
# Check process memory ps aux | grep videotranscript top -p $(pgrep videotranscript)
-
Optimize Go garbage collection:
export GOGC=100 # Default GC target export GOMEMLIMIT=2GiB # Set memory limit
-
Clean temporary files:
# Set up automatic cleanup find $WORK_DIR -type f -mtime +1 -delete
-
Limit concurrent jobs:
const MaxConcurrentJobs = 2 // Reduce if memory constrained
Problem: Running out of disk space.
Solutions:
-
Check disk usage:
df -h du -sh $WORK_DIR -
Clean old files:
# Clean files older than 1 day find $WORK_DIR -type f -mtime +1 -delete # Clean specific file types find $WORK_DIR -name "*.wav" -mtime +1 -delete find $WORK_DIR -name "*.mp4" -mtime +1 -delete
-
Set up automated cleanup:
# Add to crontab 0 2 * * * find /tmp/videotranscript -type f -mtime +1 -delete
-
Use different storage location:
WORK_DIR=/mnt/large-disk/videotranscript
Problem: Network timeouts during video download.
Solutions:
-
Increase timeout values:
const DownloadTimeout = 300 * time.Second // 5 minutes
-
Check network connectivity:
ping google.com curl -I https://www.youtube.com/
-
Test download speed:
wget --progress=bar --show-progress https://www.youtube.com/watch?v=dQw4w9WgXcQ -
Use proxy if needed:
export HTTP_PROXY=http://proxy:8080 export HTTPS_PROXY=http://proxy:8080
Problem: Too many requests to YouTube.
Solutions:
-
Implement request throttling:
time.Sleep(1 * time.Second) // Wait between requests
-
Use different IP addresses:
# Rotate through multiple servers # or use VPN
-
Respect YouTube's rate limits:
const MaxRequestsPerMinute = 30
Problem: Docker container won't start.
Solutions:
-
Check container logs:
docker logs videotranscript-container docker logs --follow videotranscript-container
-
Verify image build:
docker build -t videotranscript-app . docker run --rm -it videotranscript-app /bin/sh -
Check resource limits:
# Increase memory limit docker run -m 2g videotranscript-app -
Test dependencies in container:
docker run --rm -it videotranscript-app which yt-dlp ffmpeg whisper.cpp
Problem: File permission errors in containers.
Solutions:
-
Check file ownership:
ls -la $WORK_DIR -
Fix permissions:
sudo chown -R $(whoami):$(whoami) $WORK_DIR chmod 755 $WORK_DIR
-
Run container as user:
USER 1001:1001 -
Mount volumes correctly:
docker run -v /host/path:/container/path:rw videotranscript-app
# Environment variable
DEBUG=1 go run main.go
# Or in .env file
echo "DEBUG=1" >> .env// Set log level
log.SetLevel(log.DebugLevel)
// Enable structured logging
log.WithFields(log.Fields{
"job_id": jobID,
"stage": "download",
}).Debug("Starting video download")# Basic health check
curl http://localhost:3000/health
# Detailed status (if implemented)
curl http://localhost:3000/status
# Check all dependencies
curl http://localhost:3000/debug/dependencies# Enable profiling
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
# Memory profiling
go tool pprof http://localhost:6060/debug/pprof/heap
# View profiles
go tool pprof -http=:8080 profile.pb.gz- Application logs: Check for error messages and stack traces
- System logs: Check
/var/log/for system-level issues - Service logs:
journalctl -u videotranscriptfor systemd services
- GitHub Issues: Report bugs and feature requests
- Discussions: Ask questions in GitHub Discussions
- Documentation: Check the docs folder for detailed guides
For enterprise deployments or complex issues:
- Encore.dev Support: For production deployments
- Custom Consulting: Available for specific requirements
Remember to include relevant log outputs, error messages, and system information when seeking help.