Skip to main content

Donwload audio from a youtube video and use Gemini LLM for cleaner and smarter transcibes

Project description

minyt

PyPI version License: Apache 2.0 Python 3.9+

minyt (WIP) is a Python package that simplifies the process of downloading YouTube audio and generating high-quality transcripts using Google’s Gemini AI. It intelligently splits long audio files at natural silence points and processes chunks in parallel for optimal performance.

Features

  • YouTube Audio Download: Extract audio from any YouTube video using yt-dlp
  • Smart Audio Splitting: Automatically detect silence and split audio at natural break points
  • AI-Powered Transcription: Use Google’s Gemini 2.0 Flash for accurate, context-aware transcriptions
  • Parallel Processing: Process multiple audio chunks concurrently for faster results
  • Customizable: Configure chunk sizes, silence detection, and transcription prompts
  • Clean Output: Generate well-formatted transcripts ready for analysis

Quick Start

Installation

pip install minyt

Prerequisites

  1. FFmpeg: Required for audio processing

    # macOS
    brew install ffmpeg
    
    # Ubuntu/Debian
    sudo apt update && sudo apt install ffmpeg
    
    # Windows
    # Download from https://ffmpeg.org/download.html
    
  2. Google Gemini API Key: Get your API key from Google AI Studio

    export GEMINI_API_KEY="your-api-key-here"
    

Basic Usage

import asyncio
from pathlib import Path
from minyt.core import *

# Download audio from a YouTube video
video_id = "dQw4w9WgXcQ"  # Replace with your video ID
audio_file = download_audio(video_id, Path("_audio"))

# Detect silence and find optimal split points
_, silence_data = detect_silence(audio_file)
silence_ends = parse_silence_ends(silence_data)
total_duration = get_audio_duration(audio_file)
split_points = find_split_points(silence_ends, total_duration, chunk_len=600)

# Split audio into manageable chunks
chunks = split_audio(audio_file, split_points, dest_dir="_audio_chunks")

# Transcribe all chunks using Gemini AI
async def main():
    transcript = await transcribe_audio(
        chunks_dir="_audio_chunks",
        dest_file="_transcripts/transcript.txt",
        prompt="Please transcribe this audio file verbatim, maintaining speaker clarity and context."
    )
    print(f"Transcript saved to: _transcripts/transcript.txt")

asyncio.run(main())

Detailed Usage

Step 1: Download YouTube Audio

from minyt.core import download_audio
from pathlib import Path

# Download audio from a YouTube video
video_id = "your-video-id-here"
audio_file = download_audio(video_id, Path("downloads"))
print(f"Audio downloaded to: {audio_file}")

Step 2: Process Audio with Smart Splitting

from minyt.core import detect_silence, parse_silence_ends, find_split_points, split_audio

# Detect silence in the audio file
_, silence_data = detect_silence(audio_file)

# Parse silence end points
silence_ends = parse_silence_ends(silence_data)

# Find optimal split points (aiming for 10-minute chunks)
total_duration = get_audio_duration(audio_file)
split_points = find_split_points(silence_ends, total_duration, chunk_len=600)

# Split audio into chunks
chunks = split_audio(audio_file, split_points, dest_dir="audio_chunks")
print(f"Created {len(chunks)} audio chunks")

Step 3: Transcribe with Gemini AI

import asyncio
from minyt.core import transcribe_audio

async def transcribe_video():
    transcript = await transcribe_audio(
        chunks_dir="audio_chunks",
        dest_file="transcripts/final_transcript.txt",
        model="gemini-2.0-flash-001",  # Default model
        max_concurrent=3,  # Process 3 chunks simultaneously
        prompt="Please transcribe this audio accurately, preserving speaker names and technical terms."
    )
    return transcript

# Run transcription
transcript = asyncio.run(transcribe_video())
print("Transcription completed!")

Configuration

Environment Variables

# Required
export GEMINI_API_KEY="your-gemini-api-key"

# Optional: Configure logging level
export LOG_LEVEL="INFO"

Customization Options

# Custom silence detection (adjust sensitivity)
_, silence_data = detect_silence(audio_file)  # Uses -30dB threshold, 0.5s duration

# Custom chunk size (in seconds)
split_points = find_split_points(silence_ends, total_duration, chunk_len=300)  # 5-minute chunks

# Custom transcription settings
transcript = await transcribe_audio(
    chunks_dir="chunks",
    dest_file="output.txt",
    model="gemini-2.0-flash-001",  # Different Gemini model
    max_concurrent=5,  # More parallel processing
    prompt="Custom transcription instructions here..."
)

Project Structure

minyt/
├── audio/ # Downloaded audio files
├── audio_chunks/ # Split audio chunks
├── transcripts/ # Generated transcripts
├── minyt/
│ ├── init.py
│ └── core.py # Main functionality
└── nbs/ # Jupyter notebooks (development)

Development

Install in Development Mode

# Clone the repository
git clone https://github.com/franckalbinet/minyt.git
cd minyt

# Install in development mode
pip install -e .

# Make changes in the nbs/ directory
# ...

# Compile changes to apply to minyt package
nbdev_prepare

Dependencies

  • fastcore: Core utilities
  • google-genai: Google Gemini AI client
  • yt-dlp: YouTube video downloader
  • ffmpeg-python: Audio processing
  • tqdm: Progress bars
  • rich: Enhanced console output

Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

License

This project is licensed under the Apache License 2.0 - see the LICENSE file for details.

Acknowledgments

Support

If you encounter any issues or have questions:

  1. Check the documentation
  2. Open an issue
  3. Contact the maintainer: franckalbinet@gmail.com

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

minyt-0.0.2.tar.gz (12.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

minyt-0.0.2-py3-none-any.whl (11.1 kB view details)

Uploaded Python 3

File details

Details for the file minyt-0.0.2.tar.gz.

File metadata

  • Download URL: minyt-0.0.2.tar.gz
  • Upload date:
  • Size: 12.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.16

File hashes

Hashes for minyt-0.0.2.tar.gz
Algorithm Hash digest
SHA256 3c269d750da8971c8a034141eb0f4bac4810cd89db0aac890b5824cdfb5512cb
MD5 e35624f411cb2e201ae6c4fb2930f1a8
BLAKE2b-256 12182278e377739e5f3a40f3a00990ad9612bd4bb3113616eaf88384aa3e0c73

See more details on using hashes here.

File details

Details for the file minyt-0.0.2-py3-none-any.whl.

File metadata

  • Download URL: minyt-0.0.2-py3-none-any.whl
  • Upload date:
  • Size: 11.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.16

File hashes

Hashes for minyt-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 6bb516d2826b10db4405642536231336b90b5f97a58a0a2392c46a003f03d26f
MD5 780f7fae9d717920b8973dbabeee0e1c
BLAKE2b-256 7d3f1a2b108919b5fb9a350f4d71af7ca1063cbb71a3ac0a37fcb1b3d63f22b7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page