v79: убран phoneticAnalysis — только Whisper + слоги

This commit is contained in:
“Naeel”
2026-05-23 05:57:46 +04:00
parent 80cee77afc
commit 689fa78734
3 changed files with 14 additions and 40 deletions
+7 -20
View File
@@ -666,15 +666,9 @@ 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; let whisperResult;
try { try {
const phonTimeout = new Promise(resolve => whisperResult = await transcribe(blob);
setTimeout(() => resolve({ pitchHz: 0, pitchStability: 0, voiceClarity: 0, phonScore: 0 }), 15000)
);
[whisperResult, phon] = await Promise.all([
transcribe(blob),
Promise.race([phoneticAnalysis(blob), phonTimeout])
]);
} catch(e) { } catch(e) {
clearInterval(timerId); clearInterval(timerId);
isAnalyzing = false; isAnalyzing = false;
@@ -683,33 +677,26 @@ async function doCompare(blob, originalText, duration) {
} }
clearInterval(timerId); clearInterval(timerId);
const phonEmoji = phon.phonScore >= 85 ? '🟢' : phon.phonScore >= 60 ? '🟡' : '🔴';
let recHTML = '', diffHTML = ''; let recHTML = '', diffHTML = '';
if (whisperResult.text) { if (whisperResult.text) {
const _transcribed = whisperResult.text; const _transcribed = whisperResult.text;
const { score, words } = compareTexts(originalText, whisperResult.text); const { score, words } = compareTexts(originalText, whisperResult.text);
const recEmoji = score >= 90 ? '🟢' : score >= 70 ? '🟡' : '🔴'; const recEmoji = score >= 90 ? '🟢' : score >= 70 ? '🟡' : '🔴';
recHTML = recEmoji + ' Распознание: <b>' + score + '%</b> &nbsp;|  🗣 <i>' + whisperResult.text + '</i> &nbsp;|  '; recHTML = recEmoji + ' Распознание: <b>' + score + '%</b> &nbsp;|  🗣 <i>' + whisperResult.text + '</i>';
diffHTML = diffHTML =
'<div style="margin:6px 0;font-size:0.8em;color:#999">' + '<div style="margin:6px 0;font-size:0.8em;color:#999">' +
'📋 Текст: зелёный ≥80%, жёлтый ≥50%, красный &lt;50%' + '📋 Текст: зелёный ≥80%, жёлтый ≥50%, красный &lt;50%' +
'</div>' + '</div>' +
renderDiff(words); renderDiff(words);
} else { } else {
recHTML = ''; recHTML = '⚠️ Не распознано';
diffHTML = ''; diffHTML = '';
} }
document.getElementById('score').innerHTML = document.getElementById('score').innerHTML = recHTML;
recHTML + phonEmoji + ' Произношение: <b>' + phon.phonScore + '%</b>';
document.getElementById('diff').innerHTML = diffHTML + document.getElementById('diff').innerHTML = diffHTML;
'<div class="phonetics">' +
'<span>🎵 Тон: ' + phon.pitchHz + ' Hz</span>' +
'<span>📏 Стабильность: ' + phon.pitchStability + '%</span>' +
'<span>🗣 Артикуляция: ' + phon.voiceClarity + '%</span>' +
'</div>';
// Слоги — в отдельный div, не в diff (diff перезаписывается) // Слоги — в отдельный div, не в diff (diff перезаписывается)
_currentBlob = blob; _currentBlob = blob;
@@ -748,7 +735,7 @@ async function doCompare(blob, originalText, duration) {
<script> <script>
// ---------- Глобальные переменные и инициализация ---------- // ---------- Глобальные переменные и инициализация ----------
const GROQ_API_KEY = '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'; const GROQ_API_KEY = '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';
const VERSION = 'v78'; const VERSION = 'v79';
let mediaRecorder, audioChunks = [], userAudioBlob = null, ttsText = ''; let mediaRecorder, audioChunks = [], userAudioBlob = null, ttsText = '';
let isRecording = false, isAnalyzing = false, micAnalyser = null, micAnimId = null; let isRecording = false, isAnalyzing = false, micAnalyser = null, micAnimId = null;
+6 -19
View File
@@ -54,15 +54,9 @@ 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; let whisperResult;
try { try {
const phonTimeout = new Promise(resolve => whisperResult = await transcribe(blob);
setTimeout(() => resolve({ pitchHz: 0, pitchStability: 0, voiceClarity: 0, phonScore: 0 }), 15000)
);
[whisperResult, phon] = await Promise.all([
transcribe(blob),
Promise.race([phoneticAnalysis(blob), phonTimeout])
]);
} catch(e) { } catch(e) {
clearInterval(timerId); clearInterval(timerId);
isAnalyzing = false; isAnalyzing = false;
@@ -71,33 +65,26 @@ async function doCompare(blob, originalText, duration) {
} }
clearInterval(timerId); clearInterval(timerId);
const phonEmoji = phon.phonScore >= 85 ? '🟢' : phon.phonScore >= 60 ? '🟡' : '🔴';
let recHTML = '', diffHTML = ''; let recHTML = '', diffHTML = '';
if (whisperResult.text) { if (whisperResult.text) {
const _transcribed = whisperResult.text; const _transcribed = whisperResult.text;
const { score, words } = compareTexts(originalText, whisperResult.text); const { score, words } = compareTexts(originalText, whisperResult.text);
const recEmoji = score >= 90 ? '🟢' : score >= 70 ? '🟡' : '🔴'; const recEmoji = score >= 90 ? '🟢' : score >= 70 ? '🟡' : '🔴';
recHTML = recEmoji + ' Распознание: <b>' + score + '%</b> &nbsp;|  🗣 <i>' + whisperResult.text + '</i> &nbsp;|  '; recHTML = recEmoji + ' Распознание: <b>' + score + '%</b> &nbsp;|  🗣 <i>' + whisperResult.text + '</i>';
diffHTML = diffHTML =
'<div style="margin:6px 0;font-size:0.8em;color:#999">' + '<div style="margin:6px 0;font-size:0.8em;color:#999">' +
'📋 Текст: зелёный ≥80%, жёлтый ≥50%, красный &lt;50%' + '📋 Текст: зелёный ≥80%, жёлтый ≥50%, красный &lt;50%' +
'</div>' + '</div>' +
renderDiff(words); renderDiff(words);
} else { } else {
recHTML = ''; recHTML = '⚠️ Не распознано';
diffHTML = ''; diffHTML = '';
} }
document.getElementById('score').innerHTML = document.getElementById('score').innerHTML = recHTML;
recHTML + phonEmoji + ' Произношение: <b>' + phon.phonScore + '%</b>';
document.getElementById('diff').innerHTML = diffHTML + document.getElementById('diff').innerHTML = diffHTML;
'<div class="phonetics">' +
'<span>🎵 Тон: ' + phon.pitchHz + ' Hz</span>' +
'<span>📏 Стабильность: ' + phon.pitchStability + '%</span>' +
'<span>🗣 Артикуляция: ' + phon.voiceClarity + '%</span>' +
'</div>';
// Слоги — в отдельный div, не в diff (diff перезаписывается) // Слоги — в отдельный div, не в diff (diff перезаписывается)
_currentBlob = blob; _currentBlob = blob;
+1 -1
View File
@@ -1,6 +1,6 @@
// ---------- Глобальные переменные и инициализация ---------- // ---------- Глобальные переменные и инициализация ----------
const GROQ_API_KEY = ''; const GROQ_API_KEY = '';
const VERSION = 'v78'; const VERSION = 'v79';
let mediaRecorder, audioChunks = [], userAudioBlob = null, ttsText = ''; let mediaRecorder, audioChunks = [], userAudioBlob = null, ttsText = '';
let isRecording = false, isAnalyzing = false, micAnalyser = null, micAnimId = null; let isRecording = false, isAnalyzing = false, micAnalyser = null, micAnimId = null;