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.

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.mp3to Google Cloud Storage - Set
GOOGLE_APPLICATION_CREDENTIALSto 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.mp3para o Google Cloud Storage - Configure
GOOGLE_APPLICATION_CREDENTIALScom 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.mp3a Google Cloud Storage - Configura
GOOGLE_APPLICATION_CREDENTIALScon 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(APIv1p1beta1)
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(APIv1p1beta1)
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(APIv1p1beta1)

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.