v52: транскрипция → фонетика последовательно, фонетика с таймаутом 10с

This commit is contained in:
“Naeel”
2026-05-22 17:23:32 +04:00
parent 0504c6009c
commit ff6eb0486c
+19 -11
View File
@@ -53,7 +53,7 @@ let mediaRecorder, audioChunks = [], userAudioBlob = null, ttsText = '';
let isRecording = false, isAnalyzing = false, micAnalyser = null, micAnimId = null; let isRecording = false, isAnalyzing = false, micAnalyser = null, micAnimId = null;
let recordStartTime = 0, recordDuration = 0; let recordStartTime = 0, recordDuration = 0;
// ---------- Версия ---------- // ---------- Версия ----------
const VERSION = 'v51'; const VERSION = 'v52';
document.getElementById('ver').textContent = VERSION; document.getElementById('ver').textContent = VERSION;
// ---------- Перевод на русский (Groq) ---------- // ---------- Перевод на русский (Groq) ----------
@@ -221,19 +221,28 @@ async function doCompare(blob, originalText, duration) {
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1); const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
setStatus('Анализ... ' + elapsed + 'с'); setStatus('Анализ... ' + elapsed + 'с');
}, 150); }, 150);
let whisperResult, phon;
// Шаг 1: транскрипция (быстро, ~0.5с)
let whisperResult = { text: '', error: null };
try { whisperResult = await transcribe(blob); }
catch(e) { console.log('[COMPARE] transcribe failed:', e); }
// Шаг 2: фонетика (может виснуть на decodeAudioData, таймаут 10с)
let phon = { pitchHz: 0, pitchStability: 0, voiceClarity: 0, phonScore: 0 };
try { try {
[whisperResult, phon] = await Promise.all([ phon = await Promise.race([
transcribe(blob), phoneticAnalysis(blob),
phoneticAnalysis(blob) new Promise(r => setTimeout(() => r({ pitchHz: 0, pitchStability: 0, voiceClarity: 0, phonScore: 0 }), 10000))
]); ]);
} catch(e) { } catch(e) { console.log('[COMPARE] phonetics failed:', e); }
clearInterval(timerId);
isAnalyzing = false; clearInterval(timerId);
setStatus('Ошибка анализа.'); isAnalyzing = false;
if (whisperResult.error && !whisperResult.text) {
setStatus('Ошибка: ' + (whisperResult.error || 'сеть'));
return ''; return '';
} }
clearInterval(timerId);
const phonEmoji = phon.phonScore >= 85 ? '🟢' : phon.phonScore >= 60 ? '🟡' : '🔴'; const phonEmoji = phon.phonScore >= 85 ? '🟢' : phon.phonScore >= 60 ? '🟡' : '🔴';
let recHTML = '', diffHTML = ''; let recHTML = '', diffHTML = '';
@@ -264,7 +273,6 @@ async function doCompare(blob, originalText, duration) {
'</div>'; '</div>';
setStatus('Готово.'); setStatus('Готово.');
isAnalyzing = false;
return whisperResult.text || ''; return whisperResult.text || '';
} }