v52: транскрипция → фонетика последовательно, фонетика с таймаутом 10с
This commit is contained in:
+19
-11
@@ -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 || '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user