v79: убран phoneticAnalysis — только Whisper + слоги
This commit is contained in:
Vendored
+7
-20
@@ -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> | 🗣 <i>' + whisperResult.text + '</i> | ';
|
recHTML = recEmoji + ' Распознание: <b>' + score + '%</b> | 🗣 <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%, красный <50%' +
|
'📋 Текст: зелёный ≥80%, жёлтый ≥50%, красный <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
@@ -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> | 🗣 <i>' + whisperResult.text + '</i> | ';
|
recHTML = recEmoji + ' Распознание: <b>' + score + '%</b> | 🗣 <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%, красный <50%' +
|
'📋 Текст: зелёный ≥80%, жёлтый ≥50%, красный <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
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user