15. Creating a method to set data to send it api

 

15. Creación de un método para preparar los datos a enviar a la API

¡Hola y bienvenido de nuevo!

En esta lección vamos a crear el método más importante - el que prepara los datos que enviaremos a la API de OpenAI. Imagina que ya tenemos la dirección (URL) y las credenciales (cabeceras), ahora necesitamos preparar el paquete que enviaremos.


🎯 ¿Qué vamos a crear?

Vamos a crear un método llamado getData() que prepara los datos según el tipo de operación:

Operación

¿Qué enviamos?

¿Cómo lo enviamos?

ASR (Audio → Texto)

Archivo de audio + Modelo

Formulario multipart

Traducción (Texto → Otro idioma)

Texto + Instrucciones

JSON estructurado


🔍 Analizando la documentación de OpenAI

1. Para ASR (Speech to Text):

bash

curl https://api.openai.com/v1/audio/transcriptions \

  -H "Authorization: Bearer $OPENAI_API_KEY" \

  -H "Content-Type: multipart/form-data" \

  -F file="@/path/to/file/audio.mp3" \

  -F model="whisper-1"

2. Para Traducción con ChatGPT:

json

{

  "model": "gpt-3.5-turbo",

  "messages": [

    {

      "role": "system",

      "content": "Traduce este texto a español"

    },

    {

      "role": "user",

      "content": "Texto a traducir aquí"

    }

  ]

}


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

php

/**

 * Método para preparar los datos según el tipo de operación

 * 

 * @return mixed Array para ASR, JSON string para traducción

 */

public function getData()

{

    // Si es ASR (Audio a Texto)

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

        return [

            'file' => $this->file,      // Archivo subido

            'model' => 'whisper-1'      // Modelo específico para audio

        ];

    }

    // Si es Traducción

    else{

        return json_encode([

            'model' => 'gpt-3.5-turbo',

            'messages' => [

                [

                    'role' => 'system',

                    'content' => 'You will be provided with a text, and your task is to translate it into '.$this->lang

                ],

                [

                    'role' => 'user',

                    'content' => $this->content

                ]

            ]

        ]);

    }

}


📝 Propiedades necesarias en la clase

Para que el método funcione, necesitamos estas propiedades en la clase:

php

class Whisper{

    // Propiedades existentes

    public $error;

    private $DB;

    

    // NUEVAS PROPIEDADES que necesitamos:

    public $dataType;    // "ASR" o "translation"

    public $file;        // Ruta del archivo subido

    public $content;     // Texto a traducir

    public $lang;        // Idioma destino (español, inglés, etc.)

    

    // ... resto del código

}


🎨 Analogía Visual: El Proceso Completo

text

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

│                    PROCESO COMPLETO                          │

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

│ 1. USUARIO SUBE ARCHIVO                                     │

│    └── audio.mp3                                            │

│                                                             │

│ 2. NUESTRA APLICACIÓN PREPARA:                              │

│    ├── 🔗 URL: getApiUrl()                                  │

│    ├── 📋 Cabeceras: getHeader()                            │

│    └── 📦 Datos: getData() ← ESTA LECCIÓN                  │

│                                                             │

│ 3. ENVÍO A OPENAI:                                          │

│    Si es ASR:                                               │

│      • Archivo: audio.mp3                                   │

│      • Modelo: whisper-1                                    │

│                                                             │

│    Si es Traducción:                                        │

│      • Modelo: gpt-3.5-turbo                                │

│      • Rol sistema: "Traduce a español"                     │

│      • Rol usuario: "Hola, ¿cómo estás?"                    │

│                                                             │

│ 4. RESPUESTA:                                               │

│    ASR → "Hola, ¿cómo estás?"                               │

│    Traducción → "Hello, how are you?"                       │

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


🔧 Ejemplo práctico completo

Clase Whisper actualizada:

php

class Whisper{

    // Propiedades

    public $error;

    public $dataType;

    public $file;

    public $content;

    public $lang;

    private $DB;

    

    public function __construct(){

        $db = new DB;

        $this->DB = $db->connect();

    }

    

    /**

     * Obtiene la URL correcta según el tipo de operación

     */

    public function getApiUrl(){

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

            return "https://api.openai.com/v1/audio/transcriptions";

        }else{

            return "https://api.openai.com/v1/chat/completions";

        }

    }

    

    /**

     * Obtiene las cabeceras HTTP correctas

     */

    public function getHeader(){

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

            return [

                'Authorization: Bearer ' . API_TOKEN,

                'Content-Type: multipart/form-data'

            ];

        }else{

            return [

                'Authorization: Bearer ' . API_TOKEN,

                'Content-Type: application/json'

            ];

        }

    }

    

    /**

     * Prepara los datos para enviar a la API

     * ¡ESTO ES LO NUEVO DE ESTA LECCIÓN!

     */

    public function getData(){

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

            // Para ASR: Array simple con archivo y modelo

            return [

                'file' => $this->file,

                'model' => 'whisper-1'

            ];

        }else{

            // Para traducción: JSON estructurado para ChatGPT

            return json_encode([

                'model' => 'gpt-3.5-turbo',

                'messages' => [

                    [

                        'role' => 'system',

                        'content' => 'You will be provided with a text, and your task is to translate it into '.$this->lang

                    ],

                    [

                        'role' => 'user',

                        'content' => $this->content

                    ]

                ]

            ]);

        }

    }

    

    // ... resto de métodos (upload, etc.)

}


🚀 Cómo usar nuestro método

Ejemplo 1: Para ASR (Audio a Texto)

php

require 'init.php';


// Configuramos para ASR

$whisperObj->dataType = "ASR";

$whisperObj->file = "files/audio_123456.mp3";


// Obtenemos los datos preparados

$datosParaEnviar = $whisperObj->getData();


echo "URL: " . $whisperObj->getApiUrl() . "\n";

print_r($whisperObj->getHeader());

print_r($datosParaEnviar);


// Resultado:

// Array

// (

//     [file] => files/audio_123456.mp3

//     [model] => whisper-1

// )

Ejemplo 2: Para Traducción

php

require 'init.php';


// Configuramos para traducción

$whisperObj->dataType = "translation";

$whisperObj->content = "Hola, ¿cómo estás?";

$whisperObj->lang = "English";


// Obtenemos los datos preparados

$datosParaEnviar = $whisperObj->getData();


echo "URL: " . $whisperObj->getApiUrl() . "\n";

print_r($whisperObj->getHeader());

echo $datosParaEnviar;


// Resultado (JSON):

// {

//     "model": "gpt-3.5-turbo",

//     "messages": [

//         {

//             "role": "system",

//             "content": "You will be provided with a text, and your task is to translate it into English"

//         },

//         {

//             "role": "user",

//             "content": "Hola, ¿cómo estás?"

//         }

//     ]

// }


💡 Entendiendo json_encode()

¿Por qué usamos json_encode() para traducción pero no para ASR?

text

ASR → multipart/form-data → Array PHP

    • cURL convierte automáticamente el array

    • Ideal para enviar archivos


TRADUCCIÓN → application/json → String JSON

    • Necesitamos convertir manualmente

    • ChatGPT espera JSON estructurado

Analogía:

  • ASR = Enviar un paquete físico (no necesita etiqueta especial)

  • Traducción = Enviar una carta (necesita formato específico JSON)


🔍 Correcciones importantes en el código

Noté algunos errores en el código proporcionado:

php

// ERROR en el código original:

'Authorication: Bearer ' . API_TOKEN,  // ← Mal escrito


// CORRECTO:

'Authorization: Bearer ' . API_TOKEN,  // ← Bien escrito


// ERROR en el código original:

'Content-Type: mutlipart/form-data'    // ← Mal escrito


// CORRECTO:

'Content-Type: multipart/form-data'    // ← Bien escrito


// ERROR en el código original:

'messsages' => [                       // ← 3 's'


// CORRECTO:

'messages' => [                        // ← 2 's'


📊 Esquema de Diferencias: ASR vs Traducción

text

ASR (Audio → Texto):

├── URL: /v1/audio/transcriptions

├── Cabeceras: multipart/form-data

├── Datos: Array PHP

│   ├── file: ruta_del_archivo

│   └── model: whisper-1

└── Respuesta: Texto transcrito


TRADUCCIÓN (Texto → Otro idioma):

├── URL: /v1/chat/completions

├── Cabeceras: application/json  

├── Datos: JSON string

│   ├── model: gpt-3.5-turbo

│   └── messages: [

│       ├── {role: system, content: instrucción}

│       └── {role: user, content: texto}

│     ]

└── Respuesta: Texto traducido


🎯 Puntos Clave para Recordar

  1. getData() prepara los datos según el tipo de operación

  2. ASR usa array simple con file y model

  3. Traducción usa JSON estructurado con messages

  4. json_encode() convierte arrays PHP a JSON

  5. Las propiedades $file, $content, $lang deben establecerse antes


📋 Cuestionario de Repaso

Pregunta 1:

¿Qué devuelve getData() cuando dataType es "ASR"?
a) Un string JSON
b) Un array PHP con 'file' y 'model'
c) Un objeto de archivo
d) Una URL

Pregunta 2:

¿Por qué usamos json_encode() para traducción pero no para ASR?
a) Porque ASR no soporta JSON
b) Porque ASR usa multipart/form-data y traducción usa application/json
c) Porque es más rápido
d) Porque OpenAI lo requiere así

Pregunta 3:

¿Cuál es el modelo correcto para ASR?
a) gpt-3.5-turbo
b) davinci-003
c) whisper-1
d) curie-001

Pregunta 4:

En el array de mensajes para traducción, ¿qué rol tiene la instrucción "traduce a español"?
a) user
b) assistant
c) system
d) admin

Pregunta 5:

¿Qué propiedad necesitamos establecer para ASR antes de llamar a getData()?
a) $content y $lang
b) $file
c) $error
d) $DB


📝 Respuestas del Cuestionario

  1. b) Para ASR, getData() devuelve un array PHP simple con las claves 'file' y 'model'.

  2. b) ASR usa multipart/form-data donde cURL maneja el array automáticamente. Traducción necesita JSON string porque usa application/json.

  3. c) whisper-1 es el modelo específico de OpenAI para conversión de audio a texto.

  4. c) El rol system se usa para dar instrucciones al asistente sobre cómo comportarse.

  5. b) Para ASR necesitamos establecer $file con la ruta del archivo subido.


🚀 Lo que viene después

¡Perfecto! Ahora tenemos:
✅ URL de la API (getApiUrl())
✅ Cabeceras (getHeader())
✅ Datos preparados (getData())

En la próxima lección vamos a enviar todo esto realmente usando cURL para comunicarnos con la API de OpenAI y recibir las respuestas.


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