Capítulo 14 · el círculo se cierra — hablar adentro, hablar afuera
Sintetiza una oración → transcríbela de vuelta. Si regresa intacta, las dos mitades funcionan.
spoke: The quick brown fox jumps over the lazy dog.
transcript: The quick brown fox jumps over the lazy dog.
Ten a la mano una verificación de viaje redondo — los bugs de audio son miserables de oído.
def speak(text, path):
r = client.audio.speech.create(
model="gpt-4o-mini-tts", voice="alloy", input=text)
open(path, "wb").write(r.content) # MP3
def transcribe(path):
return client.audio.transcriptions.create(
model="gpt-4o-mini-transcribe", file=open(path, "rb")).textGemini regresa PCM crudo — sin header. Nada lo reproduce hasta que lo envuelvas:
with wave.open(path, "wb") as w:
w.setnchannels(1); w.setsampwidth(2)
w.setframerate(24000); w.writeframes(pcm)
¿Audio en silencio? Sospecha del header antes que del modelo.
El mismo resultado, distinta puerta.
Dos regresan texto; una regresa audio que la página reproduce.
Dos direcciones de una llamada cierran el círculo. La lección es el formato, no la API: envuelve el PCM antes de que se reproduzca. Y la mayoría de las features de audio son STT + un paso de texto — todo lo que sabes sigue aplicando. Sigue: contexto largo, y lo que un millón de tokens cuesta de verdad.