Преобразование текста в речь в Web Speech API: как получить один код JavaScript, который работает для чтения нескольких текстов? - PullRequest
1 голос
/ 13 июля 2020

Возможно ли иметь один код JavaScript (с помощью PHP или чего-то еще) для чтения всех разных текстов вместо того, чтобы иметь код для каждого текста, который нужно читать, как в моем текущем коде ? В этом примере нужно прочитать только 4 текста, но у меня есть одна веб-страница, на которой их около 130.

Вот код HTML на 4 PHP разных страницах (я использую include php для добавьте эти кнопки там, где это необходимо):

<div class="read"><button id="lectureObjectif">Écoutez</button>&nbsp<button id="pauseObjectif">Pause</button>&nbsp<button id="reprendreObjectif">Reprendre</button>&nbsp<button id="arretObjectif">Arrêtter</button></div>

<div class="read"><button id="lecturePourquoi">Écoutez</button>&nbsp<button id="pausePourquoi">Pause</button>&nbsp<button id="reprendrePourquoi">Reprendre</button>&nbsp<button id="arretPourquoi">Arrêtter</button></div>

<div class="read"><button id="lectureNouvelles">Écoutez</button>&nbsp<button id="pauseNouvelles">Pause</button>&nbsp<button id="reprendreNouvelles">Reprendre</button>&nbsp<button id="arretNouvelles">Arrêtter</button></div>

<div class="read"><button id="lectureDissonance">Écoutez</button>&nbsp<button id="pauseDissonance">Pause</button>&nbsp<button id="reprendreDissonance">Reprendre</button>&nbsp<button id="arretDissonance">Arrêtter</button></div>

Вот код JavasCript на 1 странице (я не хочу использовать сторонние JavaScript). Я новичок в программировании и очень новичок в JavaScript.

    //////////////////////////////// Obectif /////////////////////////////////////////  
    // pointer vers nos éléments
    let btnLectureObjectif = document.getElementById("lectureObjectif");
    let btnPauseObjectif = document.getElementById("pauseObjectif");
    let btnReprendreObjectif = document.getElementById("reprendreObjectif");
    let btnArretObjectif = document.getElementById("arretObjectif");
    let divObjectif = document.getElementById("objectif");

    btnArretObjectif.onclick = function () {
        speechSynthesis.cancel();
    }
    btnLectureObjectif.onclick = function () {
        speechSynthesis.cancel();
        /*let texte = "Coucou";*/
        let texteObjectif = divObjectif.textContent;
        // instancier un objet d'énonciation
        let parole = new SpeechSynthesisUtterance();
        parole.lang = 'fr-Fr'; // language, default is 'en-US'
        parole.text = texteObjectif;
        parole.pitch = 1; // 0 à 2 = hauteur
        parole.rate = 1.3; // 0.1 à 10 = vitesse
        parole.volume = 1; // 0 à 1 = volume
        // fair parler
        speechSynthesis.speak(parole);
    }
    btnPauseObjectif.onclick = function () {
        let texteObjectif = divObjectif.textContent;
        // instancier un objet d'énonciation
        let parole = new SpeechSynthesisUtterance();
        parole.text = texteObjectif;
        // fair une pause
        speechSynthesis.pause(parole);
    }
    btnReprendreObjectif.onclick = function () {
        let texteObjectif = divObjectif.textContent;
        // instancier un objet d'énonciation
        let parole = new SpeechSynthesisUtterance();
        parole.text = texteObjectif;
        // reprendre la lecture
        speechSynthesis.resume(parole);
    }

    ////////////////////////////// Pourquoi ///////////////////////////////////////////     
    // pointer vers nos éléments
    let btnLecturePourquoi = document.getElementById("lecturePourquoi");
    let btnPausePourquoi = document.getElementById("pausePourquoi");
    let btnReprendrePourquoi = document.getElementById("reprendrePourquoi");
    let btnArretPourquoi = document.getElementById("arretPourquoi");
    let divPourquoi = document.getElementById("pourquoi");

    btnArretPourquoi.onclick = function () {
        speechSynthesis.cancel();
    }
    btnLecturePourquoi.onclick = function () {
        speechSynthesis.cancel();
        /*let texte = "Coucou";*/
        let textePourquoi = divPourquoi.textContent;
        // instancier un objet d'énonciation
        let parole = new SpeechSynthesisUtterance();
        parole.text = textePourquoi;
        parole.pitch = 1; // 0 à 2 = hauteur
        parole.rate = 1; // 0.5 à 2 = vitesse
        parole.volume = 1; // 0 à 1 = volume
        // fair parler
        speechSynthesis.speak(parole);
    }
    btnPausePourquoi.onclick = function () {
        let textePourquoi = divPourquoi.textContent;
        // instancier un objet d'énonciation
        let parole = new SpeechSynthesisUtterance();
        parole.text = textePourquoi;
        // fair une pause
        speechSynthesis.pause(parole);
    }
    btnReprendrePourquoi.onclick = function () {
        let textePourquoi = divPourquoi.textContent;
        // instancier un objet d'énonciation
        let parole = new SpeechSynthesisUtterance();
        parole.text = textePourquoi;
        // reprendre la lecture
        speechSynthesis.resume(parole);
    }

    //////////////////////////////// Nouvelles /////////////////////////////////////////        
    // pointer vers nos éléments
    let btnLectureNouvelles = document.getElementById("lectureNouvelles");
    let btnPauseNouvelles = document.getElementById("pauseNouvelles");
    let btnReprendreNouvelles = document.getElementById("reprendreNouvelles");
    let btnArretNouvelles = document.getElementById("arretNouvelles");
    let divNouvelles = document.getElementById("nouvelles");

    btnArretNouvelles.onclick = function () {
        speechSynthesis.cancel();
    }
    btnLectureNouvelles.onclick = function () {
        speechSynthesis.cancel();
        /*let texte = "Coucou";*/
        let texteNouvelles = divNouvelles.textContent;
        // instancier un objet d'énonciation
        let parole = new SpeechSynthesisUtterance();
        parole.text = texteNouvelles;
        parole.pitch = 1; // 0 à 2 = hauteur
        parole.rate = 1; // 0.5 à 2 = vitesse
        parole.volume = 1; // 0 à 1 = volume
        // fair parler
        speechSynthesis.speak(parole);
    }
    btnPauseNouvelles.onclick = function () {
        let texteNouvelles = divNouvelles.textContent;
        // instancier un objet d'énonciation
        let parole = new SpeechSynthesisUtterance();
        parole.text = texteNouvelles;
        // fair une pause
        speechSynthesis.pause(parole);
    }
    btnReprendreNouvelles.onclick = function () {
            let texteNouvelles = divNouvelles.textContent;
            // instancier un objet d'énonciation
            let parole = new SpeechSynthesisUtterance();
            parole.text = texteNouvelles;
            // reprendre la lecture
            speechSynthesis.resume(parole);
        }
        ////////////////////////// Dissonance ////////////////////////////////
        // pointer vers nos éléments
    let btnLectureDissonance = document.getElementById("lectureDissonance");
    let btnPauseDissonance = document.getElementById("pauseDissonance");
    let btnReprendreDissonance = document.getElementById("reprendreDissonance");
    let btnArretDissonance = document.getElementById("arretDissonance");
    let divDissonance = document.getElementById("dissonance");

    btnArretDissonance.onclick = function () {
        speechSynthesis.cancel();
    }
    btnLectureDissonance.onclick = function () {
        speechSynthesis.cancel();
        /*let texte = "Coucou";*/
        let texteDissonance = divDissonance.textContent;
        // instancier un objet d'énonciation
        let parole = new SpeechSynthesisUtterance();
        parole.text = texteDissonance;
        parole.pitch = 1; // 0 à 2 = hauteur
        parole.rate = 1; // 0.5 à 2 = vitesse
        parole.volume = 1; // 0 à 1 = volume
        // fair parler
        speechSynthesis.speak(parole);
    }
    btnPauseDissonance.onclick = function () {
        let texteDissonance = divDissonance.textContent;
        // instancier un objet d'énonciation
        let parole = new SpeechSynthesisUtterance();
        parole.text = texteDissonance;
        // fair une pause
        speechSynthesis.pause(parole);
    }
    btnReprendreDissonance.onclick = function () {
        let texteDissonance = divDissonance.textContent;
        // instancier un objet d'énonciation
        let parole = new SpeechSynthesisUtterance();
        parole.text = texteDissonance;
        // reprendre la lecture
        speechSynthesis.resume(parole);
    }

Ответы [ 3 ]

0 голосов
/ 18 июля 2020

Вот где я: все начинает складываться, но чтения не происходит.

Я просто использую для этого упражнения один PHP файл:

<body>
<?php 
    
    //  "id"s  of the "div"s to be spoken
$texts = ['Objectif', 'Pourquoi'];
    
    
$buttons = [];
$events = [];

foreach($texts as $text) {
    $buttons[$text] = make_buttons($text);
    $events[$text] = make_events($text);
}
    
    function make_buttons($textname) {
    $buttons = [];
    $buttons[] = '<button id="lecture' . $textname . '">Écouter</button>';
    $buttons[] = '<button id="pause' . $textname . '">Pause</button>';
    $buttons[] = '<button id="reprendre' . $textname . '">Reprendre</button>';
    $buttons[] = '<button id="arret' . $textname . '">Arrêtter</button>';
    return implode("&nbsp;", $buttons);
    
}
    function make_events($textname) {
    $clicks = [];
    $clicks[] = "document.getElementById('lecture{$textname}').onclick = doLecture('{$textname}');";
    $clicks[] = "document.getElementById('pause{$textname}').onclick = doPause('{$textname}');";
    $clicks[] = "document.getElementById('reprendre{$textname}').onclick = doReprendre('{$textname}');";
    $clicks[] = "document.getElementById('arret{$textname}').onclick = doArret('{$textname}');";
    return implode("\n", $clicks);
}   
        
    ?>
    
    <?php   // Show buttons for the div with the id Objectif to be spoken
    echo "<div>{$buttons['Objectif']}</div>";?>

    <!-- The div (with the Objectif id) to be spoken -->
    <div id="Objectif" class="moi-wrap-text">
        <p>L'objectif de ce site est important. </p>
    </div>

    <?php   // Show buttons for the div with the id Pourquoi to be spoken
    echo "<div>{$buttons['Pourquoi']}</div>";?>

    <!-- The div (with the Pourquoi id) to be spoken -->
    <div id="Pourquoi" class="moi-wrap-text">
        <p>Pourquoi est-il important de savoir?</p>
    </div>

    <!-- External JavaScript file -->
    <script src="scrypte.js" defer></script>
</body>

А вот и мой JavaScript файл

// Function for Speak
function doLecture(textName) {
    /* Removes all utterances from the utterance queue and
    if an utterance is currently being spoken, speaking will stop */
    speechSynthesis.cancel();
    // instancier un objet d'énonciation
    let parole = new SpeechSynthesisUtterance();
    parole.lang = 'fr-Fr'; // language, default is 'en-US'
    parole.pitch = 1; // 0 à 2 = hauteur
    parole.rate = 1.3; // 0.1 à 10 = vitesse
    parole.volume = 1; // 0 à 1 = volume
    // Get the DOM object
    parole.text = document.getElementById(textName).textContent;
    // Speak
    speechSynthesis.speak(parole);
}

// Function for Pause
function doPause(textName) {
    // instancier un objet d'énonciation
    let parole = new SpeechSynthesisUtterance();
    // Get the DOM object
    parole.text = document.getElementById(textName).textContent;
    // Pause speaking
    speechSynthesis.pause(parole);
}

// Function for Resume
function doReprendre(textName) {
    // instancier un objet d'énonciation
    let parole = new SpeechSynthesisUtterance();
    // Get the DOM object
    parole.text = document.getElementById(textName).textContent;
    // Resume speaking
    speechSynthesis.resume(parole);
}

// Function for Stop
function doArret(textName) {
    // instancier un objet d'énonciation
    let parole = new SpeechSynthesisUtterance();
    // Get the DOM object
    parole.text = document.getElementById(textName).textContent;
    // Stop speaking
    speechSynthesis.stop(parole);
}

$events = implode("\n", $events);
0 голосов
/ 26 июля 2020

Мне наконец удалось заставить его работать (кроме браузеров на моем мобильном телефоне).

Мне пришлось заменить этот код:

    function make_events($textname) {
    $clicks = [];
    $clicks[] = "document.getElementById('lecture{$textname}').onclick = doLecture('{$textname}');";
    $clicks[] = "document.getElementById('pause{$textname}').onclick = doPause('{$textname}');";
    $clicks[] = "document.getElementById('reprendre{$textname}').onclick = doReprendre('{$textname}');";
    $clicks[] = "document.getElementById('arret{$textname}').onclick = doArret('{$textname}');";
    return implode("\n", $clicks);
} 

На этот код:

function make_events( $textname ) {
    $clicks = [];
    $clicks[] = "document.getElementById('lecture{$textname}').onclick = function(){doLecture('{$textname}');};";
    $clicks[] = "document.getElementById('pause{$textname}').onclick = function(){doPause('{$textname}');};";
    $clicks[] = "document.getElementById('reprendre{$textname}').onclick = function(){doReprendre('{$textname}');};";
    $clicks[] = "document.getElementById('arret{$textname}').onclick = function(){doArret('{$textname}');};";
    return implode( "\n", $clicks );
}

Еще раз спасибо, Markus AO за вашу помощь.

Но, опять же, это не работает (или работает должным образом) в браузерах моего мобильного телефона. В некоторых браузерах я могу заставить произнести, например, первый текст, а затем остановить его, но другой текст не воспроизводится. Во всех браузерах не работают пауза и возобновление.

0 голосов
/ 13 июля 2020

Да, это возможно: путем серьезного рефакторинга вашего явного кода. По сути, вам нужно аннотация , ie. генерируйте варианты на основе общих шаблонов, которые вы определили. Я не буду писать весь этот код за вас, но вот пошаговое руководство с большим количеством примеров.

Во-первых, давайте разберем код; глядя только на одно из множества повторений. Ниже мы отбираем необходимый код для одного текста, с заменой имени текста на заполнитель {{ TEXTNAME }}, чтобы вы могли увидеть, что все дублируется. Для каждого текста у вас есть HTML кнопки, как показано ниже:

<button id="lecture{{ TEXTNAME }}">Écoutez</button>
<button id="pause{{ TEXTNAME }}">Pause</button>
<button id="reprendre{{ TEXTNAME }}">Reprendre</button>
<button id="arret{{ TEXTNAME }}">Arrêtter</button>

Затем у вас есть JavaScript, как показано ниже.

/* You don't really need the following five "let"s. 
   Get the relevant DOM objects inside the functions. */

let btnLecturet{{ TEXTNAME }} = document.getElementById("lecture{{ TEXTNAME }}");
let btnPause{{ TEXTNAME }} = document.getElementById("pause{{ TEXTNAME }}");
let btnReprendre{{ TEXTNAME }} = document.getElementById("reprendre{{ TEXTNAME }}");
let btnArret{{ TEXTNAME }} = document.getElementById("arret{{ TEXTNAME }}");
let div{{ TEXTNAME }} = document.getElementById("{{ TEXTNAME }}");

/* Here we have four *explicit* functions that are 
   unnecessarily repeated for each event handler definition: */

btnArret{{ TEXTNAME }}.onclick = function () {
    speechSynthesis.cancel();
}
btnLecture{{ TEXTNAME }}.onclick = function () {
    speechSynthesis.cancel();
    /*let texte = "Coucou";*/
    let texte{{ TEXTNAME }} = div{{ TEXTNAME }}.textContent;
    // instancier un objet d'énonciation
    let parole = new SpeechSynthesisUtterance();
    parole.lang = 'fr-Fr'; // language, default is 'en-US'
    parole.text = texte{{ TEXTNAME }};
    parole.pitch = 1; // 0 à 2 = hauteur
    parole.rate = 1.3; // 0.1 à 10 = vitesse
    parole.volume = 1; // 0 à 1 = volume
    // fair parler
    speechSynthesis.speak(parole);
}
btnPause{{ TEXTNAME }}.onclick = function () {
    let texte{{ TEXTNAME }} = div{{ TEXTNAME }}.textContent;
    // instancier un objet d'énonciation
    let parole = new SpeechSynthesisUtterance();
    parole.text = texte{{ TEXTNAME }};
    // fair une pause
    speechSynthesis.pause(parole);
}
btnReprendre{{ TEXTNAME }}.onclick = function () {
    let texte{{ TEXTNAME }} = div{{ TEXTNAME }}.textContent;
    // instancier un objet d'énonciation
    let parole = new SpeechSynthesisUtterance();
    parole.text = texte{{ TEXTNAME }};
    // reprendre la lecture
    speechSynthesis.resume(parole);
}

Вы заметите, что Javascript работает выше содержат ненужную явную информацию («ИМЯ ТЕКСТА»). Это делает их непригодными для повторного использования. Было бы неплохо сделать это, если бы у вас была только одна или две фиксированные реализации; но у вас их много, и вы хотите легко что-то обновлять.

Теперь самое интересное в функциях: они могут принимать аргументы, определяющие их действие или возвращаемое значение, что позволяет вам повторно использовать одно и то же код для любого количества вариантов вариантов. Предположим, вместо этого вы сделали следующее (например, вы бы сделали аналогичное «обобщение» для остальных функций):

function doPause(textName) {
    // instancier un objet d'énonciation
    let parole = new SpeechSynthesisUtterance();
    /* simply get the DOM object right here: */
    parole.text = document.getElementById(textName).textContent;
    // fair une pause
    speechSynthesis.pause(parole);
}

Тогда у нас есть функция generi c pause-action, которая принимает имя / идентификатор текста в качестве аргумента , который может применяться к любому количеству случаев (пример ниже соответствует вашему старому коду):

btnPauseWHATEVERTEXT.onclick = doPause("WHATEVERTEXT");
btnPauseQUESTCEQUECEST.onclick = doPause("QUESTCEQUECEST");

Это уже намного проще, правда? Вам нужно будет объявить только один набор функций: doArret(textName), doLecture(textName), doPause(textName) и doReprendre(textName).

Затем все, что останется, - это указать кнопки и обработчики событий. Теперь переключаемся на PHP. Предположим, у вас есть следующая функция:

function make_buttons($textname) {
    $buttons = [];
    $buttons[] = '<button id="lecture' . $textname . '">Écoutez</button>';
    $buttons[] = '<button id="pause' . $textname . '">Pause</button>';
    $buttons[] = '<button id="reprendre' . $textname . '">Écoutez</button>';
    $buttons[] = '<button id="arret' . $textname . '">Arrêtter</button>';
    return implode("&nbsp;", $buttons);
}

У вас есть маленькая «фабрика кнопок». И тогда у вас может быть другая общая функция c, которая занимается созданием наборов обработчиков событий кнопок:

function make_events($textname) {
    $clicks = [];
    $clicks[] = "document.getElementById('lecture{$textname}').onclick = doLecture('{$textname}');";
    $clicks[] = "document.getElementById('pause{$textname}').onclick = doPause('{$textname}');";
    $clicks[] = "document.getElementById('reprendre{$textname}').onclick = doReprendre('{$textname}');";
    $clicks[] = "document.getElementById('arret{$textname}').onclick = doArret('{$textname}');";
    return implode("\n", $clicks);
}

Это даст вам код JS для создания щелчков по заданному тексту. Теперь все, что вам нужно сделать, это собрать все вместе примерно так (снова с PHP):

$texts = ['Objectif', 'Subjectif', 'Reflectif', 'Asterix', 'Obelix'];

$buttons = [];
$events = [];

foreach($texts as $text) {
    $buttons[$text] = make_buttons($text);
    $events[$text] = make_events($text);
}

// If you want to flatten the $buttons array into a string,
// do this; and put $buttons to wherever all the buttons go
$buttons = implode("\n", $buttons); 

// or otherwise, you can get a particular text's buttons like this:
echo "<div>Voici les buttons pour text Reflectif: {$buttons['Reflectif']}</div>";

// and put the events where your JS is, after the generic "doStuff()" functions
$events = implode("\n", $events);

С помощью описанных выше мер вы можете избавить себя от множества ненужных повторений. Подведем итоги:

  1. Очистите ваши явные JS функции до generi c функций (с аргументом), которые могут быть присвоены событиям onclick;
  2. Создайте PHP функции, которые генерируют кнопки и обработчики событий.
  3. L oop через ваши текстовые имена для данной страницы, используя эти функции; и поместите HTML и JS на свои места.
  4. Потратьте больше времени на размышления и изучение того, как абстрактные и повторно использовать ваш код.

Конечно, есть другие способы справиться с этим. Например, вы можете создать больше с помощью JS только на стороне клиента. Поскольку вы только начинаете программировать, это скорее простой и образовательный рефакторинг; не последнее слово в гладкости и оптимизации; но это должно сделать вашу жизнь немного проще. Удачных домашних заданий, дайте нам знать, как развивается ваш код! =(^o^)=

...