Skip to main content

🗣️ Whisper Fine-Tuning (WFT)

WFT is a 🐍 Python library designed to streamline the fine-tuning process of 🤖 OpenAI's Whisper models on custom datasets. It simplifies 📦 dataset preparation, model 🛠️ fine-tuning, and result 💾 saving.

✨ Features

  • 🤗 Hugging Face Integration: Set your organization (or user) name, and everything syncs automatically to the 🤗 Hugging Face hub.
  • 📄 Easy Dataset Preparation and Preprocessing: Quickly prepare and preprocess datasets for 🛠️ fine-tuning.
  • 🔧 Fine-Tuning Using LoRA (Low-Rank Adaptation): Fine-tune Whisper models with efficient LoRA techniques.
  • ⚙️ Flexible Configuration Options: Customize various aspects of the fine-tuning process.
  • 📊 Evaluation Metrics: Supports Character Error Rate (CER) or Word Error Rate (WER) for model evaluation.
  • 📈 TensorBoard Logging: Track your training progress in real-time with TensorBoard.
  • 🤖 Automatic Model Merging and Saving: Automatically merge fine-tuned weights and save the final model.
  • 🔄 Resume Training: Resume training seamlessly from interrupted runs.

🛠️ Installation

Install WFT using 🐍 pip:

pip install wft

🚀 Quick Start

Fine-tune a Whisper model on a custom dataset with just a few steps:

  1. 🧩 Select a Baseline Model: Choose a pre-trained Whisper model.
  2. 🎵 Select a Dataset: Use a dataset that includes 🎧 audio and ✍️ transcription columns.
  3. 🏋️‍♂️ Start Training: Use default training arguments to quickly fine-tune the model.

Here's an example:

from wft import WhisperFineTuner

id = "whisper-large-v3-turbo-zh-TW-test-1"

ft = (
    WhisperFineTuner(id)
    .set_baseline("openai/whisper-large-v3-turbo", language="zh", task="transcribe")
    .prepare_dataset(
        "mozilla-foundation/common_voice_16_1",
        src_subset="zh-TW",
        src_audio_column="audio",
        src_transcription_column="sentence",
    )
    .train()  # Use default training arguments
)

That's it! 🎉 You can now fine-tune your Whisper model easily.

To enable 🤗 Hugging Face integration and push your training log and model to Hugging Face, set the org parameter when initializing WhisperFineTuner:

id = "whisper-large-v3-turbo-zh-TW-test-1"
org = "JacobLinCool"  # Organization to push the model to Hugging Face

ft = (
    WhisperFineTuner(id, org)
    .set_baseline("openai/whisper-large-v3-turbo", language="zh", task="transcribe")
    .prepare_dataset(
        "mozilla-foundation/common_voice_16_1",
        src_subset="zh-TW",
        src_audio_column="audio",
        src_transcription_column="sentence",
    )
    .train()  # Use default training arguments
    .merge_and_push()  # Merge the model and push it to Hugging Face
)

This will automatically push your training logs 📜 and the fine-tuned model 🤖 to your Hugging Face account under the specified organization.

📚 Usage Guide

1️⃣ Set Baseline Model and Prepare Dataset

You can use a local dataset or a dataset from 🤗 Hugging Face:

ft = (
    WhisperFineTuner(id)
    .set_baseline("openai/whisper-large-v3-turbo", language="zh", task="transcribe")
    .prepare_dataset(
        "mozilla-foundation/common_voice_16_1",
        src_subset="zh-TW",
        src_audio_column="audio",
        src_transcription_column="sentence",
    )
)

To upload the preprocessed dataset to Hugging Face:

ft.push_dataset("username/dataset_name")

You can also prepare or load an already processed dataset:

ft = (
    WhisperFineTuner(id)
    .set_baseline("openai/whisper-large-v3-turbo", language="zh", task="transcribe")
    .prepare_dataset(
        "username/preprocessed_dataset",
        "mozilla-foundation/common_voice_16_1",
        src_subset="zh-TW",
        src_audio_column="audio",
        src_transcription_column="sentence",
    )
)

2️⃣ Configure Fine-Tuning

Set the evaluation metric and 🔧 LoRA configuration:

ft.set_metric("cer")  # Use CER (Character Error Rate) for evaluation

# Custom LoRA configuration to fine-tune different parts of the model
from peft import LoraConfig

custom_lora_config = LoraConfig(
    r=32,
    lora_alpha=16,
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.05,
    bias="none",
)

ft.set_lora_config(custom_lora_config)

You can also set custom 🛠️ training arguments:

from transformers import Seq2SeqTrainingArguments

custom_training_args = Seq2SeqTrainingArguments(
    output_dir=ft.dir,
    per_device_train_batch_size=8,
    gradient_accumulation_steps=2,
    learning_rate=1e-4,
    num_train_epochs=3,
)

ft.set_training_args(custom_training_args)

3️⃣ Train the Model

To begin 🏋️‍♂️ fine-tuning:

ft.train()

4️⃣ Save or Push the Fine-Tuned Model

Merge 🔧 LoRA weights with the baseline model and save it:

ft.merge_and_save(f"{ft.dir}/merged_model")

# Or push to Hugging Face
ft.merge_and_push("username/merged_model")

🔬 Advanced Usage

🔧 Custom LoRA Configuration

Adjust the LoRA configuration to fine-tune different model parts:

custom_lora_config = LoraConfig(
    r=32,
    lora_alpha=16,
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.05,
    bias="none",
)

ft.set_lora_config(custom_lora_config)

⚙️ Custom Training Arguments

Specify custom 🛠️ training settings:

from transformers import Seq2SeqTrainingArguments

custom_training_args = Seq2SeqTrainingArguments(
    output_dir=ft.dir,
    per_device_train_batch_size=8,
    gradient_accumulation_steps=2,
    learning_rate=1e-4,
    num_train_epochs=3,
)

ft.set_training_args(custom_training_args)

🔁 Run Custom Actions After Steps Using .then()

Add actions to be executed after each step:

ft = (
    WhisperFineTuner(id)
    .set_baseline("openai/whisper-large-v3-turbo", language="zh", task="transcribe")
    .then(lambda ft: print(f"{ft.baseline_model=}"))
    .prepare_dataset(
        "mozilla-foundation/common_voice_16_1",
        src_subset="zh-TW",
        src_audio_column="audio",
        src_transcription_column="sentence",
    )
    .then(lambda ft: print(f"{ft.dataset=}"))
    .set_metric("cer")
    .then(lambda ft: setattr(ft.training_args, "num_train_epochs", 5))
    .train()
)

🔄 Resume Training From a Checkpoint

If training is interrupted, you can resume:

ft = (
    WhisperFineTuner(id)
    .set_baseline("openai/whisper-large-v3-turbo", language="zh", task="transcribe")
    .prepare_dataset(
        "mozilla-foundation/common_voice_16_1",
        src_subset="zh-TW",
        src_audio_column="audio",
        src_transcription_column="sentence",
    )
    .set_metric("cer")
    .train(resume=True)
)

ℹ️ Note: If no checkpoint is found, training will start from scratch without failure.

🤝 Contributing

We welcome contributions! 🎉 Feel free to submit a pull request.

📜 License

This project is licensed under the MIT License.

Why there are so many emojis in this README?

Because ChatGPT told me to do so. 🤖📝

Download files

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

Source Distribution

wft-0.0.8.tar.gz (11.0 kB view details)

Uploaded Source

Built Distribution

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

wft-0.0.8-py3-none-any.whl (11.4 kB view details)

Uploaded Python 3

File details

Details for the file wft-0.0.8.tar.gz.

File metadata

  • Download URL: wft-0.0.8.tar.gz
  • Upload date:
  • Size: 11.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for wft-0.0.8.tar.gz
Algorithm Hash digest
SHA256 5e111ce1776a2e100cb6512b34209b43016124007994303a6de4533bdd760ad9
MD5 ccd9f167ff7adb1c6c552f12e0a187b5
BLAKE2b-256 e5a65419ad41069241e12cc420b0352acc14165a5e5ea5365d70549b699b6f47

See more details on using hashes here.

File details

Details for the file wft-0.0.8-py3-none-any.whl.

File metadata

  • Download URL: wft-0.0.8-py3-none-any.whl
  • Upload date:
  • Size: 11.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for wft-0.0.8-py3-none-any.whl
Algorithm Hash digest
SHA256 18a655e79466797622dbbd312e6d5711a13d5098f25d12e9922c69c078438b51
MD5 3f38dd7d933865d195a77010b9d37f42
BLAKE2b-256 491870a632033b9b454c9e594e400db7e65920ee83f5f09fab01cf611b8b3612

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.0.8 This release

2 files

0.0.7

2 files

0.0.6

2 files

0.0.5

2 files

0.0.4

2 files

0.0.3

2 files

0.0.2

2 files

0.0.1

2 files

Supported by

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