16. Creating method to send request

 

16. Creación del método para enviar la solicitud a la API

¡Hola y bienvenido de nuevo!

En esta lección vamos a hacer la parte más emocionante - ¡enviar realmente nuestra solicitud a la API de OpenAI! Hasta ahora hemos preparado todo: la URL, las cabeceras y los datos. Ahora es el momento de conectar todo y recibir la respuesta.


🎯 ¿Qué vamos a crear?

Vamos a crear el método convert() que:

  1. Inicia una sesión cURL

  2. Configura todas las opciones

  3. Envía la solicitud HTTP

  4. Recibe y procesa la respuesta

  5. Cierra la conexión


🔍 ¿Qué es cURL?

cURL (Client URL) es una herramienta de línea de comandos y biblioteca para transferir datos usando varios protocolos (HTTP, HTTPS, FTP, etc.).

Analogía simple:

cURL es como un cartero digital que:

  • Va a una dirección (URL)

  • Lleva un paquete (datos)

  • Muestra su identificación (cabeceras)

  • Trae de vuelta la respuesta


🛠️ Vamos a crear el método convert()

php

/**

 * Método principal para enviar la solicitud a la API de OpenAI

 * 

 * @return array|bool Respuesta de la API o false si falla

 */

public function convert()

{

    // 1. Obtenemos la URL correcta

    $apiUrl = $this->getApiUrl();

    

    // 2. Inicializamos cURL

    $ch = curl_init($apiUrl);

    

    // 3. Configuramos que será una solicitud POST

    curl_setopt($ch, CURLOPT_POST, true);

    

    // 4. Preparamos el archivo si es necesario

    $this->getFile();

    

    // 5. Establecemos los datos a enviar

    curl_setopt($ch, CURLOPT_POSTFIELDS, $this->getData());

    

    // 6. Agregamos las cabeceras HTTP

    curl_setopt($ch, CURLOPT_HTTPHEADER, $this->getHeader());

    

    // 7. Decimos que queremos recibir la respuesta como string

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    

    // 8. Ejecutamos la solicitud

    $response = curl_exec($ch);

    

    // 9. Cerramos la conexión cURL

    curl_close($ch);

    

    // 10. Procesamos la respuesta

    if($response){

        return json_decode($response, true); // Convertimos JSON a array

    }else{

        $this->error = "API REQUEST FAILED";

        return false;

    }

}


🔧 Método auxiliar: getFile()

php

/**

 * Prepara el archivo para cURL (solo para ASR)

 */

public function getFile()

{

    if($this->dataType === 'ASR'){

        // curl_file_create() crea un objeto especial para enviar archivos

        $this->file = curl_file_create($this->file);

    }

}

¿Por qué necesitamos esto?

  • Para ASR: Necesitamos enviar un archivo real

  • curl_file_create() prepara el archivo para enviarlo correctamente vía POST

  • Para traducción: Solo enviamos texto, no archivos


📊 Proceso completo visualizado

text

┌─────────────────────────────────────────────────────────────┐

│                    PROCESO DE ENVÍO cURL                     │

├─────────────────────────────────────────────────────────────┤

│ PASO 1: curl_init($apiUrl)                                  │

│         → Crea una nueva sesión cURL                        │

│                                                             │

│ PASO 2: curl_setopt() CONFIGURACIONES:                      │

│         ├── CURLOPT_POST: true                             │

│         ├── CURLOPT_POSTFIELDS: $this->getData()           │

│         ├── CURLOPT_HTTPHEADER: $this->getHeader()         │

│         └── CURLOPT_RETURNTRANSFER: true                   │

│                                                             │

│ PASO 3: $this->getFile() (solo para ASR)                   │

│         → Prepara el archivo con curl_file_create()         │

│                                                             │

│ PASO 4: curl_exec($ch)                                     │

│         → Ejecuta la solicitud y obtiene respuesta         │

│                                                             │

│ PASO 5: curl_close($ch)                                    │

│         → Cierra la sesión cURL                            │

│                                                             │

│ PASO 6: json_decode($response, true)                       │

│         → Convierte JSON a array PHP                       │

└─────────────────────────────────────────────────────────────┘


🎨 Analogía: La Fábrica de Transformación

Imagina que tenemos una fábrica mágica (OpenAI API):

text

TU APLICACIÓN                        FÁBRICA OPENAI

══════════════════════════════       ════════════════════════════


📦 Paquete a enviar:                 🏭 Proceso en la fábrica:

  • Dirección: getApiUrl()            1. Verifica credenciales

  • Credenciales: getHeader()         2. Revisa qué tipo de trabajo

  • Contenido: getData()              3. Procesa según instrucciones

                                      4. Empaca resultado


🚚 Camión cURL:                     📬 Respuesta que recibes:

  1. Inicia viaje: curl_init()        • Para ASR: {"text": "Hola mundo"}

  2. Configura carga                  • Para traducción: {"choices": [...]}

  3. Entrega paquete: curl_exec()

  4. Vuelve con respuesta

  5. Cierra viaje: curl_close()


🔍 Explicación detallada de cada paso

1. Inicializar cURL: curl_init()

php

$ch = curl_init($apiUrl);

  • Crea un nuevo "viaje" cURL

  • $ch = "cURL handle" (manejador de la sesión)

  • Es como abrir una nueva pestaña en el navegador

2. Configurar como POST: CURLOPT_POST

php

curl_setopt($ch, CURLOPT_POST, true);

  • Le decimos: "Vamos a ENVIAR datos" (no solo a pedir)

3. Enviar datos: CURLOPT_POSTFIELDS

php

curl_setopt($ch, CURLOPT_POSTFIELDS, $this->getData());

  • Adjuntamos nuestro "paquete" (datos preparados)

4. Agregar cabeceras: CURLOPT_HTTPHEADER

php

curl_setopt($ch, CURLOPT_HTTPHEADER, $this->getHeader());

  • Agregamos nuestras "credenciales e instrucciones"

5. Recibir respuesta: CURLOPT_RETURNTRANSFER

php

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

  • IMPORTANTE: Sin esto, cURL mostraría la respuesta directamente

  • Con true: Guarda la respuesta en una variable

6. Ejecutar: curl_exec()

php

$response = curl_exec($ch);

  • ¡Aquí ocurre la magia! Se envía todo y se recibe respuesta

  • Puede tomar unos segundos según el tamaño del archivo

7. Cerrar conexión: curl_close()

php

curl_close($ch);

  • Buena práctica: Liberar recursos

  • Como cerrar la pestaña del navegador


🚀 Cómo usar el método en index.php

php

// En tu index.php, después de subir el archivo:

if(isset($_FILES['file'])){

    if(!empty($_FILES['file']['name'][0])){

        // 1. Subir archivo

        $file = $whisperObj->upload($_FILES['file']);

        

        if($file){

            // 2. Configurar para ASR

            $whisperObj->dataType = 'ASR';

            $whisperObj->file = $file;

            

            // 3. ENVIAR A LA API (¡NUEVO!)

            $resultado = $whisperObj->convert();

            

            // 4. Mostrar resultado

            echo "<pre>";

            print_r($resultado);

            echo "</pre>";

            

            // Resultado típico:

            // Array

            // (

            //     [text] => "Hola, esto es una prueba de audio"

            // )

        }

    }

}


📝 Ejemplo completo en acción

Archivo de audio: "saludo.mp3"

Contiene: "Hola mundo, esto es una prueba"

Proceso:

php

// 1. Usuario sube saludo.mp3

// 2. upload() guarda el archivo

// 3. convert() envía a OpenAI


$respuesta = $whisperObj->convert();


// Respuesta recibida:

Array

(

    [text] => "Hola mundo, esto es una prueba"

)


// 4. Podemos usar el texto:

echo $respuesta['text']; // Muestra: Hola mundo, esto es una prueba


🔍 Correcciones importantes

En el código original hay que corregir:

php

// ERROR común (typos):

'Authorication: Bearer ' . API_TOKEN  // ← MAL

'Content-Type: mutlipart/form-data'   // ← MAL


// CORRECTO:

'Authorization: Bearer ' . API_TOKEN  // ← BIEN

'Content-Type: multipart/form-data'   // ← BIEN


💡 Consejos para depuración

Si algo falla, puedes agregar:

php

public function convert()

{

    $apiUrl = $this->getApiUrl();

    echo "URL: $apiUrl<br>"; // Debug

    

    $ch = curl_init($apiUrl);

    

    // Si hay error:

    curl_setopt($ch, CURLOPT_VERBOSE, true); // Muestra detalles

    curl_setopt($ch, CURLOPT_FAILONERROR, true); // Falla si hay error HTTP

    

    // ... resto del código

    

    if(curl_errno($ch)){

        echo 'cURL Error: ' . curl_error($ch); // Muestra error cURL

    }

}


📊 Diagrama de flujo del proceso completo

text

┌─────────────────────────────────────────────────────┐

│          PROCESO COMPLETO: USUARIO → API → RESPUESTA │

├─────────────────────────────────────────────────────┤

│ 1. USUARIO: Sube archivo audio/video                │

│    ↓                                                │

│ 2. upload(): Guarda archivo en servidor             │

│    ↓                                                │

│ 3. dataType = 'ASR'                                 │

│    file = 'ruta/del/archivo'                        │

│    ↓                                                │

│ 4. convert():                                       │

│    ├── getApiUrl() → URL correcta                   │

│    ├── getHeader() → Cabeceras con API Key          │

│    ├── getFile() → Prepara archivo para cURL        │

│    ├── getData() → {'file':..., 'model':'whisper-1'}│

│    ├── curl_init() → Inicia sesión                  │

│    ├── curl_setopt() → Configura todo               │

│    ├── curl_exec() → ¡ENVÍA!                        │

│    └── curl_close() → Cierra conexión               │

│    ↓                                                │

│ 5. Respuesta JSON → Array PHP                       │

│    ↓                                                │

│ 6. Mostrar texto transcrito al usuario              │

└─────────────────────────────────────────────────────┘


🎯 Puntos Clave para Recordar

  1. curl_init() → Inicia una nueva sesión cURL

  2. curl_setopt() → Configura las opciones (POST, datos, cabeceras)

  3. CURLOPT_RETURNTRANSFER → ESENCIAL para guardar respuesta en variable

  4. curl_exec() → Ejecuta la solicitud (puede ser lento)

  5. curl_close() → Siempre cerrar la sesión

  6. json_decode() → Convierte JSON de OpenAI a array PHP


📋 Cuestionario de Repaso

Pregunta 1:

¿Qué hace la función curl_file_create()?
a) Crea un nuevo archivo en el disco
b) Prepara un archivo existente para enviarlo vía cURL
c) Convierte texto a archivo de audio
d) Codifica archivos en base64

Pregunta 2:

¿Por qué es importante CURLOPT_RETURNTRANSFER = true?
a) Para que cURL sea más rápido
b) Para enviar archivos más grandes
c) Para que la respuesta se guarde en una variable en vez de mostrarse
d) Para habilitar la compresión de datos

Pregunta 3:

¿Qué método llamamos para preparar el archivo antes de enviarlo?
a) upload()
b) getData()
c) getFile()
d) prepareFile()

Pregunta 4:

¿Qué hace json_decode($response, true)?
a) Codifica un array a JSON
b) Decodifica JSON a array asociativo PHP
c) Valida si un string es JSON válido
d) Comprime datos JSON

Pregunta 5:

¿Cuál es el ORDEN CORRECTO de operaciones cURL?
a) curl_exec → curl_setopt → curl_init → curl_close
b) curl_init → curl_close → curl_setopt → curl_exec
c) curl_init → curl_setopt → curl_exec → curl_close
d) curl_setopt → curl_init → curl_exec → curl_close


📝 Respuestas del Cuestionario

  1. b) curl_file_create() toma un archivo existente y lo prepara para ser enviado correctamente mediante cURL con multipart/form-data.

  2. c) Sin CURLOPT_RETURNTRANSFER = true, cURL imprimiría la respuesta directamente en lugar de guardarla en una variable para procesarla.

  3. c) getFile() es el método específico que prepara el archivo con curl_file_create() cuando es una operación ASR.

  4. b) json_decode($response, true) convierte el string JSON recibido de la API en un array asociativo PHP (el true es clave para array, no objeto).

  5. c) El orden correcto es: 1) Inicializar, 2) Configurar opciones, 3) Ejecutar, 4) Cerrar.


🚀 Lo que viene después

¡Increíble! Ahora podemos:
✅ Subir archivos
✅ Enviarlos a OpenAI
✅ Recibir el texto transcrito

En la próxima lección vamos a:

  1. Guardar los resultados en la base de datos

  2. Mostrar archivos recientes

  3. Crear la página para ver transcripciones

✨ ¡Felicidades! Has creado el corazón de tu aplicación. Ahora los archivos de audio realmente se convierten en texto gracias a la IA.


Comentarios

Entradas más populares de este blog

1-7. Transforma tu audio a texto

10. Haz que tu asistente hable

8. NUEVO - Solución si tu micrófono no está captando tu audio