82 lines
2.4 KiB
JavaScript
82 lines
2.4 KiB
JavaScript
/**
|
|
* Say — минимальная версия (только Whisper).
|
|
* Работает: загрузка аудио → транскрибация → текст.
|
|
*/
|
|
|
|
const express = require('express');
|
|
const multer = require('multer');
|
|
const fetch = require('node-fetch');
|
|
const FormData = require('form-data');
|
|
const path = require('path');
|
|
|
|
const PORT = parseInt(process.env.PORT, 10) || 3000;
|
|
|
|
// --- Конфигурация Whisper ---
|
|
const WHISPER_URL = process.env.WHISPER_URL || 'https://api.aillm.ru/v1/audio/transcriptions';
|
|
const WHISPER_MODEL = process.env.WHISPER_MODEL || 'whisper-large-v3';
|
|
const API_KEY = process.env.API_KEY || '';
|
|
|
|
const upload = multer({ storage: multer.memoryStorage() });
|
|
const app = express();
|
|
|
|
// --- Статика ---
|
|
app.use(express.static(path.join(__dirname, 'public')));
|
|
|
|
// --- Роуты ---
|
|
|
|
// Главная
|
|
app.get('/', (_req, res) => {
|
|
res.sendFile(path.join(__dirname, 'public', 'index.html'));
|
|
});
|
|
|
|
// Health
|
|
app.get('/health', (_req, res) => {
|
|
res.json({ status: 'ok' });
|
|
});
|
|
|
|
// Whisper: аудио → текст
|
|
app.post('/api/speech', upload.single('audio'), async (req, res) => {
|
|
try {
|
|
if (!req.file || !req.file.buffer || req.file.size === 0) {
|
|
return res.status(400).json({ error: 'Нет аудио' });
|
|
}
|
|
|
|
const form = new FormData();
|
|
form.append('file', req.file.buffer, {
|
|
filename: 'audio.webm',
|
|
contentType: req.file.mimetype || 'audio/webm',
|
|
});
|
|
form.append('model', WHISPER_MODEL);
|
|
form.append('language', 'ru');
|
|
|
|
console.log(`Whisper: отправка ${req.file.size} байт`);
|
|
|
|
const resp = await fetch(WHISPER_URL, {
|
|
method: 'POST',
|
|
headers: { Authorization: `Bearer ${API_KEY}` },
|
|
body: form,
|
|
});
|
|
|
|
if (!resp.ok) {
|
|
const errText = await resp.text();
|
|
console.error(`Whisper error ${resp.status}: ${errText}`);
|
|
return res.status(500).json({ error: `Whisper: ${resp.status}` });
|
|
}
|
|
|
|
const data = await resp.json();
|
|
const text = (data.text || '').trim();
|
|
|
|
console.log(`Whisper: распознано "${text}"`);
|
|
res.json({ transcription: text });
|
|
|
|
} catch (err) {
|
|
console.error('ERROR:', err.message);
|
|
res.status(500).json({ error: err.message });
|
|
}
|
|
});
|
|
|
|
// --- Запуск ---
|
|
app.listen(PORT, () => {
|
|
console.log(`Say (Whisper only) listening on :${PORT}`);
|
|
});
|