No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Curso de Fundamentos de Node.js

Curso de Fundamentos de Node.js

Oscar Barajas Tavares

Oscar Barajas Tavares

Leer y escribir archivos en Node.js

9/20
Recursos

La manipulaci贸n de archivos es una habilidad fundamental para cualquier desarrollador de Node.js. En este art铆culo, exploraremos c贸mo crear un script robusto que se comunica con la API de OpenAI para transcribir archivos de audio utilizando el modelo Whisper. Este proceso no solo demuestra el poder del m贸dulo File System (FS) de Node.js, sino que tambi茅n ilustra c贸mo interactuar con APIs externas para crear aplicaciones pr谩cticas y 煤tiles.

驴C贸mo crear un script para transcribir audio con Node.js y OpenAI?

Antes de sumergirnos en el c贸digo, es importante entender que estaremos construyendo un script que realizar谩 las siguientes tareas:

  1. Leer un archivo de audio desde nuestro sistema de archivos.
  2. Enviar ese archivo a la API de Whisper de OpenAI.
  3. Recibir la transcripci贸n del audio.
  4. Guardar esa transcripci贸n en un archivo de texto.

Para comenzar, necesitar谩s registrarte en OpenAI y obtener una API key. Esta clave es esencial para autenticar tus solicitudes a la API de Whisper.

驴Qu茅 m贸dulos necesitamos importar?

Para nuestro script, necesitaremos dos m贸dulos principales:

const fs = require('fs');
const path = require('path');

El m贸dulo FS (File System) nos permite leer y escribir archivos, mientras que el m贸dulo Path nos proporciona utilidades para manejar rutas de archivos y directorios de forma independiente al sistema operativo. Esto es crucial para garantizar que nuestro script funcione correctamente en diferentes plataformas como Windows, macOS o Linux.

驴C贸mo estructurar la funci贸n principal de transcripci贸n?

Nuestra funci贸n principal ser谩 as铆ncrona y recibir谩 dos par谩metros: la ruta del archivo de audio y la API key de OpenAI.

async function transcriptAudio(audioFilePath, apiKey) {
  try {
    // Verificar si el archivo existe
    if (!fs.existsSync(audioFilePath)) {
      throw new Error('El archivo de audio no existe o no tienes un archivo de audio');
    }

    // Leer el archivo de audio
    const audioFile = fs.readFileSync(audioFilePath);

    // Crear FormData para la solicitud
    const formData = new FormData();
    
    // Crear un blob con el contenido del archivo
    const blob = new Blob([audioFile]);
    
    // A帽adir el archivo y el modelo a FormData
    formData.append('file', blob, audioFilePath);
    formData.append('model', 'whisper-1');

    // Realizar la solicitud a la API de Whisper
    const response = await fetch('https://api.openai.com/v1/audio/transcriptions', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${apiKey}`
      },
      body: formData
    });

    // Verificar si la respuesta es correcta
    if (!response.ok) {
      const errorData = await response.json();
      throw new Error(`Error en la API: ${JSON.stringify(errorData)}`);
    }

    // Obtener los datos de la respuesta
    const data = await response.json();
    const transcription = data.text;

    // Crear la ruta para el archivo de salida
    const outputFilePath = path.join(
      path.dirname(audioFilePath),
      path.basename(audioFilePath, path.extname(audioFilePath)) + '_transcription.txt'
    );

    // Guardar la transcripci贸n en un archivo
    fs.writeFileSync(outputFilePath, transcription);

    console.log(`Transcripci贸n guardada en ${outputFilePath}`);
    return transcription;

  } catch (error) {
    console.error('Error durante la transcripci贸n:', error.message);
  }
}

驴C贸mo verificamos la existencia del archivo de audio?

Antes de proceder con la transcripci贸n, es crucial verificar si el archivo de audio existe:

if (!fs.existsSync(audioFilePath)) {
  throw new Error('El archivo de audio no existe o no tienes un archivo de audio');
}

Esta verificaci贸n nos permite manejar errores de manera elegante y proporcionar informaci贸n 煤til al usuario.

驴C贸mo preparamos los datos para enviarlos a la API?

Para enviar el archivo de audio a la API de Whisper, necesitamos formatear los datos correctamente:

const audioFile = fs.readFileSync(audioFilePath);
const formData = new FormData();
const blob = new Blob([audioFile]);
    
formData.append('file', blob, audioFilePath);
formData.append('model', 'whisper-1');

Primero, leemos el archivo de audio utilizando fs.readFileSync(). Luego, creamos un objeto FormData y un Blob con el contenido del archivo. Finalmente, a帽adimos el archivo y especificamos el modelo de Whisper que queremos utilizar.

驴C贸mo realizamos la solicitud a la API de Whisper?

La solicitud a la API se realiza utilizando fetch:

const response = await fetch('https://api.openai.com/v1/audio/transcriptions', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${apiKey}`
  },
  body: formData
});

Es importante incluir la API key en el encabezado de autorizaci贸n y enviar el FormData como cuerpo de la solicitud.

驴C贸mo guardamos la transcripci贸n en un archivo?

Una vez que recibimos la transcripci贸n de la API, la guardamos en un archivo de texto:

const outputFilePath = path.join(
  path.dirname(audioFilePath),
  path.basename(audioFilePath, path.extname(audioFilePath)) + '_transcription.txt'
);

fs.writeFileSync(outputFilePath, transcription);

Utilizamos el m贸dulo path para construir una ruta de archivo que sea independiente del sistema operativo. La transcripci贸n se guarda en un archivo con el mismo nombre que el archivo de audio original, pero con el sufijo "_transcription.txt".

驴C贸mo manejar errores en nuestro script?

El manejo de errores es una parte crucial de cualquier aplicaci贸n robusta. En nuestro script, utilizamos un bloque try-catch para capturar y manejar cualquier error que pueda ocurrir durante el proceso de transcripci贸n:

try {
  // C贸digo para la transcripci贸n
} catch (error) {
  console.error('Error durante la transcripci贸n:', error.message);
}

Tambi茅n incluimos verificaciones espec铆ficas para manejar errores de la API:

if (!response.ok) {
  const errorData = await response.json();
  throw new Error(`Error en la API: ${JSON.stringify(errorData)}`);
}

驴Por qu茅 es importante el m贸dulo Path?

El m贸dulo path es esencial para garantizar que nuestro script funcione correctamente en diferentes sistemas operativos. Proporciona m茅todos para trabajar con rutas de archivos de manera consistente:

  • path.dirname(): Obtiene el directorio de una ruta de archivo.
  • path.basename(): Obtiene el nombre base de un archivo (sin la ruta).
  • path.extname(): Obtiene la extensi贸n de un archivo.
  • path.join(): Une segmentos de ruta en una sola ruta.

Estos m茅todos nos permiten construir rutas de archivo que funcionar谩n correctamente en Windows, macOS y Linux.

La combinaci贸n del m贸dulo File System (FS) y el m贸dulo Path nos proporciona herramientas poderosas para trabajar con archivos en Node.js. En este art铆culo, hemos visto c贸mo utilizar estas herramientas para crear un script que transcribe archivos de audio utilizando la API de Whisper de OpenAI. Este ejemplo demuestra c贸mo los conceptos b谩sicos de Node.js pueden aplicarse para crear aplicaciones pr谩cticas y 煤tiles. 驴Has utilizado alguna vez estas t茅cnicas en tus proyectos? Comparte tu experiencia en los comentarios.

Aportes 2

Preguntas 0

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

Cuando intente usar la api de openai, estaba caido el sitio, entonces utilice otra AI, y funciona bastante bien, adjunto codigo ```js const fs = require('fs'); const path = require('path'); const { createClient } = require('@deepgram/sdk'); const SECRET_KEY = ""; async function speechToText(fileName) { const filePath = path.join(__dirname, fileName); const deepgram = createClient(SECRET_KEY); const { error, result } = await deepgram.listen.prerecorded.transcribeFile( fs.readFileSync(filePath), { model: 'nova-3', smart_format: true, } ); if (error) throw new Error(error); if (result) { console.log('Successfully transcribed the audio file:'); fs.writeFileSync(path.join(__dirname, 'output.txt'), JSON.stringify(result)); }; } speechToText("[yout_local_file]"); ```const fs = require('fs');const path = require('path');const { createClient } = require('@deepgram/sdk');const SECRET\_KEY = "a27a612658ed5c34c1dd0499d81a19337acda96a"; async function speechToText(fileName) {聽 聽 const filePath = path.join(\_\_dirname, fileName); 聽 聽 const deepgram = createClient(SECRET\_KEY);聽 聽 const { error, result } = await deepgram.listen.prerecorded.transcribeFile(聽 聽 聽 聽 fs.readFileSync(filePath),聽 聽 聽 聽 {聽 聽 聽 聽 聽 聽 model: 'nova-3',聽 聽 聽 聽 聽 聽 smart\_format: true,聽 聽 聽 聽 }聽 聽 ); 聽 聽 if (error) throw new Error(error);聽 聽 if (result) {聽 聽 聽 聽 console.log('Successfully transcribed the audio file:');聽 聽 聽 聽 fs.writeFileSync(path.join(\_\_dirname, 'output.txt'), JSON.stringify(result));聽 聽 };} speechToText("sound-file.wav");
como sugerencia, deber铆an ocultar la API Key en el c贸digo del repositorio p煤blico por motivos de seguridad