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:
🔍 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
getData() prepara los datos según el tipo de operación
ASR usa array simple con file y model
Traducción usa JSON estructurado con messages
json_encode() convierte arrays PHP a JSON
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
b) Para ASR, getData() devuelve un array PHP simple con las claves 'file' y 'model'.
b) ASR usa multipart/form-data donde cURL maneja el array automáticamente. Traducción necesita JSON string porque usa application/json.
c) whisper-1 es el modelo específico de OpenAI para conversión de audio a texto.
c) El rol system se usa para dar instrucciones al asistente sobre cómo comportarse.
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
Publicar un comentario