Voz con Vosk-micro
Explicación del Código de Reconocimiento de Voz con Vosk
http://localhost:3000/index1.html
node server.js
Este código HTML/JavaScript implementa una interfaz web para reconocimiento de voz utilizando el motor Vosk a través de una conexión con un servidor local.
Estructura Principal
HTML Básico:
Define una página web con dos botones (Comenzar/Detener) y dos áreas para mostrar resultados.
Incluye estilos CSS básicos para la presentación.
Conexión WebSocket:
const socket = io('http://localhost:3000');Establece conexión con un servidor Socket.IO en localhost puerto 3000.
Funcionalidad de Audio
Configuración de Audio (
setupAudio()):Crea un contexto de audio del navegador
Solicita acceso al micrófono del usuario
Configura un procesador de audio que:
Captura datos de audio en formato Float32
Los convierte a Int16 (formato esperado por Vosk)
Envía los datos al servidor a través de WebSocket
Conversión de Formatos (
convertFloat32ToInt16()):Convierte los datos de audio de Float32 (usado por el navegador) a Int16 (necesario para Vosk)
Control de Flujo
Botones:
Comenzar: Inicia la captura de audio, habilita el procesamiento y notifica al servidor
Detener: Detiene la captura y notifica al servidor
Manejo de Resultados:
result: Muestra resultados parciales del reconocimiento (mientras el usuario habla)final: Muestra el resultado final cuando se completa una frase
Comunicación con el Servidor
Eventos enviados:
start: Notifica al servidor que comienza la captura (con la tasa de muestreo)audio: Envía los datos de audio en chunksstop: Notifica que se detuvo la captura
Eventos recibidos:
result: Resultados parciales del reconocimientofinal: Resultado final procesado
Este código es el frontend que se complementa con un backend (que no se muestra) que utiliza el motor Vosk para convertir el audio en texto. El backend debe estar corriendo en localhost:3000 para que funcione.
<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <title>Reconocimiento de Voz con Vosk</title> <style> body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; } #result { border: 1px solid #ccc; padding: 10px; min-height: 50px; margin: 20px 0; } button { padding: 10px 15px; font-size: 16px; cursor: pointer; } </style> </head> <body> <h1>Reconocimiento de Voz con Vosk</h1> <button id="startBtn">Comenzar</button> <button id="stopBtn" disabled>Detener</button> <div id="result"></div> <div id="finalResult"></div> <script src="https://cdn.socket.io/4.5.4/socket.io.min.js"></script> <script> const socket = io('http://localhost:3000'); const startBtn = document.getElementById('startBtn'); const stopBtn = document.getElementById('stopBtn'); const resultDiv = document.getElementById('result'); const finalResultDiv = document.getElementById('finalResult'); let audioContext; let processor; let microphone; // Configuración del audio async function setupAudio() { audioContext = new (window.AudioContext || window.webkitAudioContext)(); const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); microphone = audioContext.createMediaStreamSource(stream); processor = audioContext.createScriptProcessor(4096, 1, 1); processor.onaudioprocess = (e) => { const audioData = e.inputBuffer.getChannelData(0); const raw = convertFloat32ToInt16(audioData); socket.emit('audio', raw); }; microphone.connect(processor); processor.connect(audioContext.destination); } // Convertir Float32 a Int16 function convertFloat32ToInt16(buffer) { const l = buffer.length; const buf = new Int16Array(l); for (let i = 0; i < l; i++) { buf[i] = Math.min(1, buffer[i]) * 0x7FFF; } return buf.buffer; } // Eventos de los botones startBtn.addEventListener('click', async () => { try { await setupAudio(); socket.emit('start', audioContext.sampleRate); startBtn.disabled = true; stopBtn.disabled = false; resultDiv.textContent = "Escuchando..."; } catch (err) { console.error("Error al iniciar:", err); } }); stopBtn.addEventListener('click', () => { if (processor) { processor.disconnect(); microphone.disconnect(); socket.emit('stop'); startBtn.disabled = false; stopBtn.disabled = true; } }); // Escuchar resultados socket.on('result', (data) => { const result = JSON.parse(data); if (result.text) { resultDiv.textContent = result.text; } }); socket.on('final', (data) => { const finalResult = JSON.parse(data); if (finalResult.text) { finalResultDiv.textContent = "Resultado final: " + finalResult.text; } }); </script> </body> </html>

Comentarios
Publicar un comentario