Fixed audio - using Google Translate TTS for Arabic pronunciation
This commit is contained in:
parent
7819a7f097
commit
f1e4776b33
153
index.html
153
index.html
@ -1258,34 +1258,64 @@ function renderAlphabet() {
|
||||
`).join('');
|
||||
}
|
||||
|
||||
let currentAudio = null;
|
||||
|
||||
function speakLetter(idx) {
|
||||
const letter = alphabetData[idx].letter;
|
||||
if ('speechSynthesis' in window) {
|
||||
window.speechSynthesis.cancel();
|
||||
const utterance = new SpeechSynthesisUtterance(letter);
|
||||
utterance.lang = 'ar-SA';
|
||||
utterance.rate = 0.5;
|
||||
utterance.pitch = 1;
|
||||
window.speechSynthesis.speak(utterance);
|
||||
const name = alphabetData[idx].name;
|
||||
playArabicAudio(letter, name);
|
||||
}
|
||||
|
||||
function playArabicAudio(text, label) {
|
||||
// Stop any currently playing audio
|
||||
if (currentAudio) {
|
||||
currentAudio.pause();
|
||||
currentAudio = null;
|
||||
}
|
||||
showToast('Произношение: ' + alphabetData[idx].name, 'info');
|
||||
|
||||
// Use Google Translate TTS (free, public API)
|
||||
const encoded = encodeURIComponent(text);
|
||||
const url = `https://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&q=${encoded}&tl=ar`;
|
||||
|
||||
currentAudio = new Audio(url);
|
||||
currentAudio.crossOrigin = 'anonymous';
|
||||
|
||||
currentAudio.onplay = () => {
|
||||
showToast('🔊 ' + (label || text), 'info');
|
||||
};
|
||||
|
||||
currentAudio.onerror = () => {
|
||||
// Fallback to Web Speech API
|
||||
if ('speechSynthesis' in window) {
|
||||
window.speechSynthesis.cancel();
|
||||
const utterance = new SpeechSynthesisUtterance(text);
|
||||
utterance.lang = 'ar-SA';
|
||||
utterance.rate = 0.5;
|
||||
window.speechSynthesis.speak(utterance);
|
||||
}
|
||||
showToast('🔊 ' + (label || text), 'info');
|
||||
};
|
||||
|
||||
currentAudio.play().catch(() => {
|
||||
// Fallback to Web Speech API
|
||||
if ('speechSynthesis' in window) {
|
||||
window.speechSynthesis.cancel();
|
||||
const utterance = new SpeechSynthesisUtterance(text);
|
||||
utterance.lang = 'ar-SA';
|
||||
utterance.rate = 0.5;
|
||||
window.speechSynthesis.speak(utterance);
|
||||
}
|
||||
showToast('🔊 ' + (label || text), 'info');
|
||||
});
|
||||
}
|
||||
|
||||
function playAllLetters() {
|
||||
if (!('speechSynthesis' in window)) {
|
||||
showToast('Ваш браузер не поддерживает аудио', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
window.speechSynthesis.cancel();
|
||||
let index = 0;
|
||||
|
||||
function speakNext() {
|
||||
function playNext() {
|
||||
if (index < alphabetData.length) {
|
||||
const utterance = new SpeechSynthesisUtterance(alphabetData[index].letter);
|
||||
utterance.lang = 'ar-SA';
|
||||
utterance.rate = 0.5;
|
||||
utterance.pitch = 1;
|
||||
const letter = alphabetData[index].letter;
|
||||
const name = alphabetData[index].name;
|
||||
|
||||
// Highlight current letter
|
||||
const cards = document.querySelectorAll('.letter-card');
|
||||
@ -1295,13 +1325,28 @@ function playAllLetters() {
|
||||
cards[index].scrollIntoView({ behavior: 'smooth', block: 'center' });
|
||||
}
|
||||
|
||||
utterance.onend = () => {
|
||||
showToast('Буква ' + name + ' (' + (index + 1) + '/28)', 'info');
|
||||
|
||||
const encoded = encodeURIComponent(letter);
|
||||
const url = `https://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&q=${encoded}&tl=ar`;
|
||||
|
||||
const audio = new Audio(url);
|
||||
audio.crossOrigin = 'anonymous';
|
||||
|
||||
audio.onended = () => {
|
||||
index++;
|
||||
setTimeout(speakNext, 300);
|
||||
setTimeout(playNext, 500);
|
||||
};
|
||||
|
||||
window.speechSynthesis.speak(utterance);
|
||||
showToast('Буква ' + alphabetData[index].name + ' (' + (index + 1) + '/28)', 'info');
|
||||
audio.onerror = () => {
|
||||
index++;
|
||||
setTimeout(playNext, 500);
|
||||
};
|
||||
|
||||
audio.play().catch(() => {
|
||||
index++;
|
||||
setTimeout(playNext, 500);
|
||||
});
|
||||
} else {
|
||||
showToast('Все буквы прослушаны!', 'success');
|
||||
const cards = document.querySelectorAll('.letter-card');
|
||||
@ -1309,7 +1354,7 @@ function playAllLetters() {
|
||||
}
|
||||
}
|
||||
|
||||
speakNext();
|
||||
playNext();
|
||||
}
|
||||
|
||||
function learnLetter(idx) {
|
||||
@ -1360,14 +1405,7 @@ function renderHarakaat() {
|
||||
}
|
||||
|
||||
function speakHaraka(text, name) {
|
||||
if ('speechSynthesis' in window) {
|
||||
window.speechSynthesis.cancel();
|
||||
const utterance = new SpeechSynthesisUtterance(text);
|
||||
utterance.lang = 'ar-SA';
|
||||
utterance.rate = 0.5;
|
||||
window.speechSynthesis.speak(utterance);
|
||||
}
|
||||
showToast('Произношение: ' + name, 'info');
|
||||
playArabicAudio(text, name);
|
||||
}
|
||||
|
||||
function learnHaraka(idx) {
|
||||
@ -1456,12 +1494,7 @@ function toggleFav(arabic) {
|
||||
}
|
||||
|
||||
function speak(text) {
|
||||
if ('speechSynthesis' in window) {
|
||||
const utterance = new SpeechSynthesisUtterance(text);
|
||||
utterance.lang = 'ar-SA';
|
||||
utterance.rate = 0.7;
|
||||
speechSynthesis.speak(utterance);
|
||||
}
|
||||
playArabicAudio(text, '');
|
||||
}
|
||||
|
||||
function selectQuizType(type) {
|
||||
@ -1617,24 +1650,38 @@ function speakFullSurah(name) {
|
||||
ikhlas: 'قُلْ هُوَ اللَّهُ أَحَدٌ. اللَّهُ الصَّمَدُ. لَمْ يَلِدْ وَلَمْ يُولَدْ. وَلَمْ يَكُن لَّهُ كُفُوًا أَحَدٌ'
|
||||
};
|
||||
|
||||
if ('speechSynthesis' in window) {
|
||||
window.speechSynthesis.cancel();
|
||||
const text = surahs[name];
|
||||
const parts = text.split('. ');
|
||||
let index = 0;
|
||||
const text = surahs[name];
|
||||
const parts = text.split('. ');
|
||||
let index = 0;
|
||||
|
||||
function speakNext() {
|
||||
if (index < parts.length) {
|
||||
const utterance = new SpeechSynthesisUtterance(parts[index]);
|
||||
utterance.lang = 'ar-SA';
|
||||
utterance.rate = 0.6;
|
||||
utterance.pitch = 0.9;
|
||||
utterance.onend = () => { index++; speakNext(); };
|
||||
window.speechSynthesis.speak(utterance);
|
||||
}
|
||||
function playNext() {
|
||||
if (index < parts.length) {
|
||||
const encoded = encodeURIComponent(parts[index]);
|
||||
const url = `https://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&q=${encoded}&tl=ar`;
|
||||
|
||||
const audio = new Audio(url);
|
||||
audio.crossOrigin = 'anonymous';
|
||||
|
||||
audio.onended = () => {
|
||||
index++;
|
||||
setTimeout(playNext, 400);
|
||||
};
|
||||
|
||||
audio.onerror = () => {
|
||||
index++;
|
||||
setTimeout(playNext, 400);
|
||||
};
|
||||
|
||||
audio.play().catch(() => {
|
||||
index++;
|
||||
setTimeout(playNext, 400);
|
||||
});
|
||||
} else {
|
||||
showToast('Сура прослушана!', 'success');
|
||||
}
|
||||
speakNext();
|
||||
}
|
||||
|
||||
playNext();
|
||||
}
|
||||
|
||||
function markSurahPracticed(id) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user