Exemplo Whisper em Python: guia completo de transcrição de voz para texto

Exemplo Whisper em Python: guia completo de transcrição de voz para texto

Eric King

Eric King

Author


Exemplo Whisper em Python: guia completo de transcrição de voz para texto

OpenAI Whisper é um dos modelos de reconhecimento de voz open source mais poderosos disponíveis hoje. Neste guia completo, vai aprender a usar o Whisper com Python para transcrever ficheiros de áudio para texto com elevada precisão.
Este tutorial é ideal para:
  • Programadores que criam funcionalidades de voz para texto
  • Cientistas de dados que trabalham com áudio
  • Qualquer pessoa que procure um exemplo completo de Whisper em Python

O que é o OpenAI Whisper?

O Whisper é um sistema de reconhecimento automático de fala (ASR) treinado com 680 000 horas de áudio multilingue. Pode:
  • Transcrever fala em mais de 99 línguas
  • Detetar automaticamente a língua
  • Traduzir a fala para inglês
  • Lidar com áudio ruidoso e sotaques
  • Processar ficheiros de áudio longos

Pré-requisitos

Antes de começar, certifique-se de que tem:
  • Python 3.8+ instalado
  • o gestor de pacotes pip
  • FFmpeg instalado (para processamento de áudio)
  • (Opcional) GPU NVIDIA para processamento mais rápido

Passo 1: Instalar o Whisper

Instale o pacote OpenAI Whisper com pip:
pip install openai-whisper

Instalar o FFmpeg

macOS (com Homebrew):
brew install ffmpeg
Ubuntu/Debian:
sudo apt update
sudo apt install ffmpeg
Windows: Descarregue o FFmpeg em ffmpeg.org e adicione-o ao PATH.

Passo 2: Exemplo básico de Whisper em Python

Aqui está um script Python simples para transcrever um ficheiro de áudio:
import whisper

# Load the Whisper model
model = whisper.load_model("base")

# Transcribe audio file
result = model.transcribe("audio.mp3")

# Print the transcription
print(result["text"])
Saída:
Hello everyone, welcome to today's meeting. We will discuss the project timeline and upcoming milestones.

Passo 3: Exemplo completo em Python com tratamento de erros

Aqui está um exemplo mais robusto com tratamento adequado de erros:
import whisper
import os

def transcribe_audio(audio_path, model_size="base"):
    """
    Transcribe an audio file using Whisper.
    
    Args:
        audio_path (str): Path to the audio file
        model_size (str): Whisper model size (tiny, base, small, medium, large)
    
    Returns:
        dict: Transcription result with text and segments
    """
    try:
        # Check if audio file exists
        if not os.path.exists(audio_path):
            raise FileNotFoundError(f"Audio file not found: {audio_path}")
        
        # Load the Whisper model
        print(f"Loading Whisper model: {model_size}")
        model = whisper.load_model(model_size)
        
        # Transcribe the audio
        print(f"Transcribing: {audio_path}")
        result = model.transcribe(audio_path)
        
        return result
    
    except Exception as e:
        print(f"Error during transcription: {str(e)}")
        return None

# Example usage
if __name__ == "__main__":
    audio_file = "sample_audio.mp3"
    result = transcribe_audio(audio_file, model_size="base")
    
    if result:
        print("\nTranscription:")
        print(result["text"])

Passo 4: Exemplo avançado com deteção de língua

O Whisper pode detetar automaticamente a língua, mas também pode especificá-la:
import whisper

model = whisper.load_model("base")

# Auto-detect language
result = model.transcribe("audio.mp3")
print(f"Detected language: {result['language']}")
print(f"Transcription: {result['text']}")

# Specify language explicitly
result_en = model.transcribe("audio.mp3", language="en")
result_zh = model.transcribe("audio.mp3", language="zh")

Passo 5: Obter carimbos de data/hora e segmentos

O Whisper fornece informação detalhada por segmento com carimbos de data/hora:
import whisper

model = whisper.load_model("base")
result = model.transcribe("audio.mp3")

# Print full transcription
print("Full Text:")
print(result["text"])

# Print segments with timestamps
print("\nSegments with Timestamps:")
for segment in result["segments"]:
    start = segment["start"]
    end = segment["end"]
    text = segment["text"]
    print(f"[{start:.2f}s - {end:.2f}s] {text}")
Saída:
Full Text:
Hello everyone, welcome to today's meeting. We will discuss the project timeline.

Segments with Timestamps:
[0.00s - 2.50s] Hello everyone, welcome to today's meeting.
[2.50s - 5.80s] We will discuss the project timeline.

Passo 6: Traduzir áudio para inglês

O Whisper pode traduzir diretamente para inglês a fala que não está em inglês:
import whisper

model = whisper.load_model("base")

# Translate to English
result = model.transcribe("spanish_audio.mp3", task="translate")

print("Translated text:")
print(result["text"])

Passo 7: Processar vários ficheiros de áudio

Assim pode transcrever vários ficheiros em lote:
import whisper
import os
from pathlib import Path

def batch_transcribe(audio_directory, model_size="base", output_dir="transcriptions"):
    """
    Transcribe all audio files in a directory.
    
    Args:
        audio_directory (str): Directory containing audio files
        model_size (str): Whisper model size
        output_dir (str): Directory to save transcriptions
    """
    # Create output directory
    os.makedirs(output_dir, exist_ok=True)
    
    # Load model once
    model = whisper.load_model(model_size)
    
    # Supported audio formats
    audio_extensions = ['.mp3', '.wav', '.m4a', '.flac', '.ogg']
    
    # Process each audio file
    audio_files = [
        f for f in os.listdir(audio_directory)
        if any(f.lower().endswith(ext) for ext in audio_extensions)
    ]
    
    for audio_file in audio_files:
        audio_path = os.path.join(audio_directory, audio_file)
        print(f"\nProcessing: {audio_file}")
        
        try:
            result = model.transcribe(audio_path)
            
            # Save transcription to file
            output_file = os.path.join(
                output_dir,
                Path(audio_file).stem + ".txt"
            )
            
            with open(output_file, "w", encoding="utf-8") as f:
                f.write(result["text"])
            
            print(f"✓ Saved: {output_file}")
            
        except Exception as e:
            print(f"✗ Error processing {audio_file}: {str(e)}")

# Example usage
batch_transcribe("audio_files/", model_size="base")

Passo 8: Exportar para o formato de legendas SRT

Crie ficheiros de legendas SRT a partir das transcrições:
import whisper

def transcribe_to_srt(audio_path, output_path, model_size="base"):
    """
    Transcribe audio and save as SRT subtitle file.
    
    Args:
        audio_path (str): Path to audio file
        output_path (str): Path to save SRT file
        model_size (str): Whisper model size
    """
    model = whisper.load_model(model_size)
    result = model.transcribe(audio_path)
    
    # Generate SRT content
    srt_content = ""
    for i, segment in enumerate(result["segments"], start=1):
        start_time = format_timestamp(segment["start"])
        end_time = format_timestamp(segment["end"])
        text = segment["text"].strip()
        
        srt_content += f"{i}\n"
        srt_content += f"{start_time} --> {end_time}\n"
        srt_content += f"{text}\n\n"
    
    # Save SRT file
    with open(output_path, "w", encoding="utf-8") as f:
        f.write(srt_content)
    
    print(f"SRT file saved: {output_path}")

def format_timestamp(seconds):
    """Convert seconds to SRT timestamp format (HH:MM:SS,mmm)."""
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    secs = int(seconds % 60)
    millis = int((seconds % 1) * 1000)
    return f"{hours:02d}:{minutes:02d}:{secs:02d},{millis:03d}"

# Example usage
transcribe_to_srt("video.mp4", "subtitles.srt", model_size="base")

Comparação dos tamanhos de modelo Whisper

Escolha o tamanho de modelo adequado às suas necessidades:
ModeloParâmetrosVelocidadePrecisãoMemóriaCaso de uso
tiny39M⭐⭐⭐⭐⭐⭐⭐~1GBTestes rápidos, áudio simples
base74M⭐⭐⭐⭐⭐⭐⭐~1GBUso geral
small244M⭐⭐⭐⭐⭐⭐⭐~2GBEquilíbrio
medium769M⭐⭐⭐⭐⭐⭐⭐~5GBQuando precisa de alta precisão
large1550M⭐⭐⭐⭐⭐⭐~10GBMáxima precisão, áudio ruidoso

Boas práticas com Whisper em Python

1. Escolher o tamanho de modelo certo

# Fast and lightweight
model = whisper.load_model("tiny")  # Good for testing

# Balanced
model = whisper.load_model("base")  # Good for most cases

# High accuracy
model = whisper.load_model("medium")  # For important transcriptions

2. Lidar com ficheiros de áudio longos

Para ficheiros de áudio muito longos, considere dividir em segmentos:
import whisper
from pydub import AudioSegment

def transcribe_long_audio(audio_path, chunk_length_ms=60000):
    """
    Transcribe long audio by splitting into chunks.
    
    Args:
        audio_path: Path to audio file
        chunk_length_ms: Length of each chunk in milliseconds
    """
    model = whisper.load_model("base")
    
    # Load audio
    audio = AudioSegment.from_file(audio_path)
    
    # Split into chunks
    chunks = []
    for i in range(0, len(audio), chunk_length_ms):
        chunks.append(audio[i:i + chunk_length_ms])
    
    # Transcribe each chunk
    full_text = []
    for i, chunk in enumerate(chunks):
        chunk_path = f"chunk_{i}.wav"
        chunk.export(chunk_path, format="wav")
        
        result = model.transcribe(chunk_path)
        full_text.append(result["text"])
        
        # Clean up chunk file
        os.remove(chunk_path)
    
    return " ".join(full_text)

3. Utilizar a GPU para maior velocidade

Se tiver uma GPU NVIDIA:
import whisper

# Whisper will automatically use GPU if available
model = whisper.load_model("base", device="cuda")

4. Especificar a língua para maior precisão

# If you know the language, specify it
result = model.transcribe("audio.mp3", language="en")

Casos de uso comuns

Transcrição de podcasts

import whisper

model = whisper.load_model("medium")
result = model.transcribe("podcast_episode.mp3")

# Save transcript
with open("podcast_transcript.txt", "w") as f:
    f.write(result["text"])

Notas de reunião

import whisper
from datetime import datetime

model = whisper.load_model("base")
result = model.transcribe("meeting_recording.mp3")

# Create formatted meeting notes
notes = f"""
Meeting Notes - {datetime.now().strftime('%Y-%m-%d')}
========================================

{result["text"]}
"""

with open("meeting_notes.txt", "w") as f:
    f.write(notes)

Legendas de vídeo

import whisper

model = whisper.load_model("base")
result = model.transcribe("video.mp4")

# Generate VTT subtitle file
vtt_content = "WEBVTT\n\n"
for segment in result["segments"]:
    start = format_vtt_timestamp(segment["start"])
    end = format_vtt_timestamp(segment["end"])
    text = segment["text"].strip()
    vtt_content += f"{start} --> {end}\n{text}\n\n"

with open("subtitles.vtt", "w") as f:
    f.write(vtt_content)

Resolução de problemas comuns

Problema 1: FFmpeg não encontrado

Erro: FileNotFoundError: ffmpeg
Solução:
# Install FFmpeg
# macOS
brew install ffmpeg

# Ubuntu/Debian
sudo apt install ffmpeg

# Windows
# Download from ffmpeg.org and add to PATH

Problema 2: memória insuficiente

Erro: RuntimeError: CUDA out of memory
Solução:
# Use a smaller model
model = whisper.load_model("tiny")  # Instead of "large"

# Or use CPU
model = whisper.load_model("base", device="cpu")

Problema 3: processamento lento

Soluções:
  • Utilize um modelo mais pequeno (tiny ou base)
  • Ative a aceleração por GPU
  • Processe o áudio em segmentos
  • Utilize multiprocessing para trabalhos em lote

Dicas de desempenho

  1. Utilize a GPU quando disponível — 10-50× mais rápido do que a CPU
  2. Escolha um tamanho de modelo adequado — não use "large" para tarefas simples
  3. Pré-processe o áudio — remova silêncio, normalize o volume
  4. Processe em lote — carregue o modelo uma vez e processe vários ficheiros
  5. Utilize threading — para operações limitadas por I/O

Whisper Python face a outras soluções

FuncionalidadeWhisper PythonGoogle Speech-to-TextAssemblyAI
CustoGratuito (local)Pago por minutoPago por minuto
Offline
PrecisãoElevadaElevadaElevada
ConfiguraçãoMédiaFácilFácil
Áudio longo
Multilingue

Exemplo completo: script pronto para produção

Aqui está um exemplo completo e pronto para produção:
#!/usr/bin/env python3
"""
Production-ready Whisper transcription script.
"""

import whisper
import argparse
import os
import json
from pathlib import Path
from datetime import datetime

def transcribe_file(
    audio_path,
    model_size="base",
    language=None,
    output_format="txt",
    output_dir=None
):
    """
    Transcribe an audio file with comprehensive output options.
    
    Args:
        audio_path: Path to audio file
        model_size: Whisper model size
        language: Language code (optional, auto-detected if None)
        output_format: Output format (txt, json, srt, vtt)
        output_dir: Output directory (default: same as audio file)
    """
    # Validate input file
    if not os.path.exists(audio_path):
        raise FileNotFoundError(f"Audio file not found: {audio_path}")
    
    # Set output directory
    if output_dir is None:
        output_dir = os.path.dirname(audio_path)
    os.makedirs(output_dir, exist_ok=True)
    
    # Load model
    print(f"Loading Whisper model: {model_size}")
    model = whisper.load_model(model_size)
    
    # Transcribe
    print(f"Transcribing: {audio_path}")
    transcribe_kwargs = {}
    if language:
        transcribe_kwargs["language"] = language
    
    result = model.transcribe(audio_path, **transcribe_kwargs)
    
    # Generate output filename
    base_name = Path(audio_path).stem
    output_path = os.path.join(output_dir, base_name)
    
    # Save based on format
    if output_format == "txt":
        with open(f"{output_path}.txt", "w", encoding="utf-8") as f:
            f.write(result["text"])
    
    elif output_format == "json":
        with open(f"{output_path}.json", "w", encoding="utf-8") as f:
            json.dump(result, f, indent=2, ensure_ascii=False)
    
    elif output_format == "srt":
        srt_content = generate_srt(result["segments"])
        with open(f"{output_path}.srt", "w", encoding="utf-8") as f:
            f.write(srt_content)
    
    elif output_format == "vtt":
        vtt_content = generate_vtt(result["segments"])
        with open(f"{output_path}.vtt", "w", encoding="utf-8") as f:
            f.write(vtt_content)
    
    print(f"✓ Transcription saved: {output_path}.{output_format}")
    print(f"  Language: {result['language']}")
    print(f"  Duration: {result['segments'][-1]['end']:.2f}s")
    
    return result

def generate_srt(segments):
    """Generate SRT subtitle content."""
    srt = ""
    for i, segment in enumerate(segments, start=1):
        start = format_timestamp(segment["start"])
        end = format_timestamp(segment["end"])
        text = segment["text"].strip()
        srt += f"{i}\n{start} --> {end}\n{text}\n\n"
    return srt

def generate_vtt(segments):
    """Generate VTT subtitle content."""
    vtt = "WEBVTT\n\n"
    for segment in segments:
        start = format_vtt_timestamp(segment["start"])
        end = format_vtt_timestamp(segment["end"])
        text = segment["text"].strip()
        vtt += f"{start} --> {end}\n{text}\n\n"
    return vtt

def format_timestamp(seconds):
    """Format timestamp for SRT."""
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    secs = int(seconds % 60)
    millis = int((seconds % 1) * 1000)
    return f"{hours:02d}:{minutes:02d}:{secs:02d},{millis:03d}"

def format_vtt_timestamp(seconds):
    """Format timestamp for VTT."""
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    secs = int(seconds % 60)
    millis = int((seconds % 1) * 1000)
    return f"{hours:02d}:{minutes:02d}:{secs:02d}.{millis:03d}"

def main():
    parser = argparse.ArgumentParser(
        description="Transcribe audio files using OpenAI Whisper"
    )
    parser.add_argument("audio", help="Path to audio file")
    parser.add_argument(
        "--model",
        default="base",
        choices=["tiny", "base", "small", "medium", "large"],
        help="Whisper model size"
    )
    parser.add_argument(
        "--language",
        default=None,
        help="Language code (e.g., 'en', 'zh', 'es')"
    )
    parser.add_argument(
        "--output-format",
        default="txt",
        choices=["txt", "json", "srt", "vtt"],
        help="Output format"
    )
    parser.add_argument(
        "--output-dir",
        default=None,
        help="Output directory"
    )
    
    args = parser.parse_args()
    
    transcribe_file(
        args.audio,
        model_size=args.model,
        language=args.language,
        output_format=args.output_format,
        output_dir=args.output_dir
    )

if __name__ == "__main__":
    main()
Utilização:
# Basic usage
python transcribe.py audio.mp3

# With options
python transcribe.py audio.mp3 --model medium --language en --output-format srt

# Save to specific directory
python transcribe.py audio.mp3 --output-dir ./transcriptions

Conclusão

Este guia completo de exemplos Whisper em Python cobre o que precisa para começar com a transcrição de voz para texto usando o OpenAI Whisper. Quer esteja a transcrever podcasts, reuniões ou a criar legendas, o Whisper oferece uma solução poderosa e gratuita para converter áudio em texto.
Pontos-chave:
  • O Whisper é gratuito e open source
  • Suporta mais de 99 línguas
  • Funciona offline (sem chamadas API)
  • Elevada precisão na maioria dos casos
  • Fácil de integrar em projetos Python
Para casos de produção que exijam transcrição em tempo real ou acesso por API, considere soluções na nuvem como o SayToWords, que oferece transcrição baseada em Whisper via API.

Pronto para começar? Instale o Whisper e transcreva hoje o seu primeiro ficheiro de áudio.

Experimente grátis agora

Experimente agora o nosso serviço de voz, áudio e vídeo com IA. Você terá não só transcrição de voz para texto de alta precisão, tradução multilíngue e diarização inteligente de falantes, como também geração automática de legendas para vídeos, edição inteligente de conteúdo audiovisual e análise sincronizada de áudio e imagem. Cobrimos cenários como atas de reunião, criação de vídeos curtos e produção de podcasts — comece hoje mesmo o seu teste gratuito!

Som para Texto OnlineSom para Texto GratuitoConversor de Som para TextoSom para Texto MP3Som para Texto WAVSom para Texto com Carimbos de TempoSom em texto para reuniõesSound to Text Multi LanguageSom para Texto LegendasConverter WAV para textoVoz para TextoVoz para Texto OnlineFala para TextoConverter MP3 para TextoConverter gravação de voz em textoDigitação por Voz OnlineVoz para Texto com Carimbos de TempoVoz para Texto em Tempo RealVoz para Texto para Áudio LongoVoz para Texto para VídeoVoz para Texto para YouTubeVoz para Texto para Edição de VídeoVoz para Texto para LegendasVoz para Texto para PodcastsVoz para Texto para EntrevistasÁudio de Entrevista para TextoVoz para Texto para GravaçõesVoz para Texto para ReuniõesVoz para Texto para AulasVoz para Texto para NotasVoz para Texto MultilíngueVoz para Texto PrecisoVoz para Texto RápidoAlternativa Premiere Pro Voz para TextoAlternativa DaVinci Voz para TextoAlternativa VEED Voz para TextoAlternativa InVideo Voz para TextoAlternativa Otter.ai Voz para TextoAlternativa Descript Voz para TextoAlternativa Trint Voz para TextoAlternativa Rev Voz para TextoAlternativa Sonix Voz para TextoAlternativa Happy Scribe Voz para TextoAlternativa Zoom Voz para TextoAlternativa Google Meet Voz para TextoAlternativa Microsoft Teams Voz para TextoAlternativa Fireflies.ai Voz para TextoAlternativa Fathom Voz para TextoAlternativa FlexClip Voz para TextoAlternativa Kapwing Voz para TextoAlternativa Canva Voz para TextoVoz para Texto para Áudio LongoVoz IA para TextoVoz para Texto GrátisVoz para Texto sem AnúnciosVoz para Texto para Áudio RuidosoVoz para Texto com TempoGerar Legendas de ÁudioTranscrição de Podcast OnlineTranscrever Chamadas de ClientesVoz do TikTok para TextoÁudio do TikTok para TextoVoz do YouTube para TextoÁudio do YouTube para TextoNota de Voz para TextoMensagem de Voz do WhatsApp para TextoMensagem de Voz do Telegram para TextoTranscrição de Chamada DiscordVoz do Twitch para TextoVoz do Skype para TextoVoz do Messenger para TextoMensagem de Voz do LINE para TextoTranscrever Vlogs para TextoConverter Áudio de Sermão em TextoConverter Fala em EscritaTraduzir Áudio para TextoConverter Notas de Áudio em TextoDigitação por VozDigitação por Voz para ReuniõesDigitação por Voz para YouTubeFalar para DigitarDigitação Sem MãosVoz para PalavrasFala para PalavrasFala para Texto OnlineOnline Transcription SoftwareFala para Texto para ReuniõesFala para Texto RápidoReal Time Speech to TextLive Transcription AppFala para Texto para TikTokSom para Texto para TikTokFalando para PalavrasFalar para TextoTalk to Text FreeTalk to Text OnlineTalk to Text for YouTubeTalk to Text for SubtitlesTalk to Text for Content CreatorsTalk to Text for MeetingsÁudio para DigitaçãoSom para TextoFerramenta de Escrita por VozFerramenta de Escrita por FalaDitado por VozFerramenta de Transcrição LegalFerramenta de Ditado MédicoTranscrição de Áudio JaponêsTranscrição de Reuniões em CoreanoFerramenta de Transcrição de ReuniõesÁudio de Reunião para TextoConversor de Aulas para TextoÁudio de Aula para TextoTranscrição de Vídeo para TextoGerador de Legendas para TikTokTranscrição de Call CenterFerramenta de Áudio Reels para TextoTranscrever MP3 para TextoTranscrever arquivo WAV para textoCapCut Voz para TextoCapCut Voz para TextoVoice to Text in EnglishÁudio para Texto em InglêsVoice to Text in SpanishVoice to Text in FrenchÁudio para Texto em FrancêsVoice to Text in GermanÁudio para Texto em AlemãoVoice to Text in JapaneseÁudio para Texto em JaponêsVoice to Text in KoreanÁudio para Texto em CoreanoVoice to Text in PortugueseVoice to Text in ArabicVoice to Text in ChineseVoice to Text in HindiVoice to Text in RussianWeb Voice Typing ToolVoice Typing Website