Seeking insights from a recording using Google Cloud Speech-to-Text, Google Colab, and ChatGPT


Why record mentorship calls?

A mentor I follow runs sessions on Topmate. After my call the platform emailed me the MP4. I wanted the transcript: there were three pieces of advice I half-heard and one URL I missed entirely.

Por que gravar chamadas de mentoria?

Uma mentora que eu sigo dá sessões no Topmate. Depois da minha sessão a plataforma me mandou o MP4 por email. Eu queria a transcrição: tinham três conselhos que eu ouvi pela metade e uma URL que perdi inteira.

Por qué grabar las llamadas de mentoría?

Una mentora a la que sigo da sesiones en Topmate. Después de mi sesión la plataforma me mandó el MP4 por email. Quería la transcripción: había tres consejos que oí a medias y una URL que se me escapó entera.

Mentorship recording workflow diagram

Fig 1. Mentorship recording workflow diagram from call to insights.

Quick note on etiquette: make sure everyone on the call knows it’s being recorded.

From MP4 to MP3

To simplify transcription, I pull down the video and extract the audio. This version streams the download (safer for large files) and uses MoviePy to write an MP3.

Nota rápida sobre etiqueta: certifique-se de que todos na chamada sabem que está sendo gravada.

De MP4 para MP3

Para simplificar a transcrição, baixo o vídeo e extraio o áudio. Esta versão faz o download em streaming (mais seguro para arquivos grandes) e usa o MoviePy para gerar o MP3.

Nota rápida sobre protocolo: asegúrate de que todos en la llamada saben que se está grabando.

De MP4 a MP3

Para simplificar la transcripción, descargo el vídeo y extraigo el audio. Esta versión hace la descarga en streaming (más seguro para archivos grandes) y usa MoviePy para generar el MP3.

import requests
from moviepy.editor import VideoFileClip

def download_video(url: str, output_path: str) -> None:
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(output_path, "wb") as f:
            for chunk in r.iter_content(chunk_size=8192):
                if chunk:
                    f.write(chunk)

def convert_mp4_to_mp3(mp4_file: str, mp3_file: str) -> None:
    with VideoFileClip(mp4_file) as clip:
        clip.audio.write_audiofile(mp3_file)

# usage
video_url = "https://topmate-call-recordings.s3.ap-south-1.amazonaws.com/recording_recording_123456-imagine-like-a-guid.mp4"
mp4_file = "mentorship.mp4"
mp3_file = "mentorship.mp3"

download_video(video_url, mp4_file)
convert_mp4_to_mp3(mp4_file, mp3_file)

For best accuracy with Speech-to-Text, FLAC or LINEAR16 usually beats MP3. I kept MP3 here to match the original workflow.

Transcribing with Google Cloud Speech-to-Text

Setup (once):

  • Create a GCP project and enable the Speech-to-Text API
  • Upload mentorship.mp3 to Google Cloud Storage
  • Set GOOGLE_APPLICATION_CREDENTIALS to your service account JSON

Here’s a minimal long-audio transcription (31-minute files need the long-running API). I also enabled punctuation and confidence scores.

Para melhor precisão com o Speech-to-Text, FLAC ou LINEAR16 costumam superar o MP3. Mantive MP3 aqui para seguir o fluxo original.

Transcrevendo com o Google Cloud Speech-to-Text

Configuração (uma vez):

  • Crie um projeto no GCP e ative a Speech-to-Text API
  • Faça upload de mentorship.mp3 para o Google Cloud Storage
  • Configure GOOGLE_APPLICATION_CREDENTIALS com o JSON da sua conta de serviço

Aqui está uma transcrição mínima de áudio longo (arquivos de 31 minutos precisam da API long-running). Também habilitei pontuação automática e scores de confiança.

Para mayor precisión con Speech-to-Text, FLAC o LINEAR16 suelen superar al MP3. Mantuve MP3 aquí para seguir el flujo original.

Transcribiendo con Google Cloud Speech-to-Text

Configuración (una sola vez):

  • Crea un proyecto en GCP y activa la Speech-to-Text API
  • Sube mentorship.mp3 a Google Cloud Storage
  • Configura GOOGLE_APPLICATION_CREDENTIALS con el JSON de tu cuenta de servicio

Aquí va una transcripción mínima de audio largo (archivos de 31 minutos necesitan la API long-running). También activé la puntuación automática y los scores de confianza.

from google.cloud import speech_v1p1beta1 as speech

def transcribe_gcs(gcs_uri: str, output_path: str) -> None:
    client = speech.SpeechClient()

    audio = speech.RecognitionAudio(uri=gcs_uri)
    config = speech.RecognitionConfig(
        encoding=speech.RecognitionConfig.AudioEncoding.MP3,
        sample_rate_hertz=44100,         # match your file
        language_code="en-US",
        model="long",
        audio_channel_count=2,
        enable_automatic_punctuation=True,
        enable_word_confidence=True,
        # optional diarization (speakers):
        # enable_speaker_diarization=True,
        # diarization_speaker_count=2,
    )

    operation = client.long_running_recognize(config=config, audio=audio)
    response = operation.result(timeout=3600)

    with open(output_path, "w", encoding="utf-8") as f:
        for result in response.results:
            f.write(result.alternatives[0].transcript + "\n")

# run
gcs_uri = "gs://bucket-name/mentorship.mp3"
transcribe_gcs(gcs_uri, "audio.txt")

My run (for context):

  • Audio: MP3, 44,100 Hz, 2 channels
  • Billed audio time: 31:57
  • Transcription time: ~11:43
  • Automatic punctuation + word confidence on
  • Model: long (API v1p1beta1)

Minha execução (para contexto):

  • Áudio: MP3, 44.100 Hz, 2 canais
  • Tempo de áudio cobrado: 31:57
  • Tempo de transcrição: ~11:43
  • Pontuação automática + confiança por palavra ativados
  • Modelo: long (API v1p1beta1)

Mi ejecución (para contexto):

  • Audio: MP3, 44.100 Hz, 2 canales
  • Tiempo de audio facturado: 31:57
  • Tiempo de transcripción: ~11:43
  • Puntuación automática + confianza por palabra activados
  • Modelo: long (API v1p1beta1)

GCP transcription result

Fig 2. Google Cloud Speech-to-Text transcription result output.

Example raw line:

Exemplo de linha bruta:

Ejemplo de línea sin procesar:

if you... good afternoon, I don't know where exactly you are based on but ...

Asking ChatGPT for the good stuff

Once I have audio.txt, I pass the transcript to a prompt that asks for a short summary, key decisions, and action items. For long transcripts, chunk first (tokens are a thing), then merge the summaries.

Pedindo ao ChatGPT o que interessa

Com o áudio.txt em mãos, passo a transcrição para um prompt que pede um resumo curto, decisões-chave e próximos passos. Para transcrições longas, divida primeiro (tokens são limitados) e depois junte os resumos.

Pidiéndole a ChatGPT lo importante

Con el audio.txt en mano, paso la transcripción a un prompt que pide un resumen breve, decisiones clave y próximos pasos. Para transcripciones largas, divide primero (los tokens tienen límite) y luego combina los resúmenes.

def get_chatgpt_insights(prompt: str) -> str:
    """
    placeholder for your chatgpt call.
    recommend: split transcript into ~2–3k word chunks,
    ask for structured bullets (summary / decisions / actions),
    then ask for a final synthesis across chunks.
    """
    ...

with open("audio.txt", "r", encoding="utf-8") as f:
    transcript = f.read()

prompt = (
    "you are extracting practical insights from a mentorship transcript.\n\n"
    "return three sections:\n"
    "1) summary (5 bullets max)\n"
    "2) decisions agreed (bulleted)\n"
    "3) next actions (who/what/when)\n\n"
    f"transcript:\n{transcript}\n"
)

insights = get_chatgpt_insights(prompt)
print(insights)

A tiny diagram with Mermaid

Visuals make sprawling conversations easier to digest. Here’s a compact Mermaid map you can tweak to your session:

Um pequeno diagrama com Mermaid

Visualizações tornam conversas longas mais fáceis de digerir. Aqui vai um mapa Mermaid compacto que você pode adaptar a sua sessão:

Un pequeño diagrama con Mermaid

Las visualizaciones hacen que las conversaciones extensas sean más fáciles de digerir. Aquí va un mapa Mermaid compacto que puedes adaptar a tu sesión:

graph TD
    A[session start] --> B[topic 1]
    B --> C[key insight 1]
    B --> D[key insight 2]
    A --> E[topic 2]
    E --> F[key insight 3]
    E --> G[key insight 4]
    A --> H[wrap-up]

This workflow turned a one-off call into reusable notes and clear next steps. If you’re experimenting, the two dials that matter most are audio encoding (FLAC/LINEAR16 if you can) and diarization (when multiple voices overlap). Tuning those pays off quickly.

Esse fluxo transformou uma chamada avulsa em anotações reutilizáveis e próximos passos claros. Se você está experimentando, os dois ajustes que mais importam são a codificação do áudio (FLAC/LINEAR16 se possível) e a diarização (quando várias vozes se sobrepõem). Ajustar esses dois dá retorno rápido.

Este flujo convirtió una llamada puntual en apuntes reutilizables y próximos pasos claros. Si estás experimentando, los dos ajustes que más importan son la codificación del audio (FLAC/LINEAR16 si puedes) y la diarización (cuando varias voces se solapan). Afinar esos dos da resultados rápido.