马黑黑 发表于 2022-6-26 10:51

再试TTS:朗读时同步选中文本

本帖最后由 马黑黑 于 2022-6-26 10:54 编辑 <br /><br /><style>
.mama { margin: auto; width: fit-content; }
.mama textarea { padding: 12px; width: 600px; height: 400px; outline: none; font-size: 1.2em; }
.mama p { margin: 0; padding: 6px 0; text-align: center; }
.mama input { outline: none; }
</style>

<p>测试中,待朗读的文本需要标点符号!<br><br></p>

<div class="mama">
        <p><textarea id="textarea" placeholder="输入待朗读文本"></textarea></p>
        <p><input id="read" type="button" value=" 朗读 " />        </p>
</div>

<script>

let textarea = document.querySelector('#textarea'),
        read = document.querySelector('#read');
let synth = window.speechSynthesis,
        speech = new SpeechSynthesisUtterance();
let reg = /[,\.!\?\(\),。!?()]/g; //断句符号
let idx = 0, total = 0, start = 0; ar = [], bdAr = []; //文本处理相关变量

//朗读按钮
read.onclick = function() {
        ar.length = 0;
        idx = 0;
        start = 0;
        let reg = /[,\.:!\?,。:!?]/g;
        ar = textarea.value.split(reg);
        bdAr = textarea.value.match(reg);
        total = ar.length;
        readText();
        read.disabled = true;
}

//结束监听:接力朗读
speech.addEventListener('end', () => {
        if(idx < total - 1) readText();
        if(idx == total - 1 ) read.disabled = false;
})

//朗读+文本选中
function readText() {
        console.log(idx,ar);
        let current = ar + bdAr;
        let end = start + current.length;
        textarea.setSelectionRange(start,end);
        textarea.focus();
        speech.text = ar;
        synth.speak(speech);
        start += current.length;
        idx ++;
}

</script>

红影 发表于 2022-6-26 15:53

有意思, 每一句都在标点的地方断句,然后这句就是被选中的。

红影 发表于 2022-6-26 15:53

特地把最后一句去掉标点,结果那句就直接被扔掉了,也不阅读了,也不标注了{:4_189:}

红影 发表于 2022-6-26 15:55

这个不能分辨多音字,我转的一段里有上下联几个字,被都成了zhang下联,读错音了{:4_173:}

红影 发表于 2022-6-26 15:56

这个评分后一定要刷新才可以,我前面忘记这点,放一段话怎么都不读,后来才想起来这点{:4_173:}

马黑黑 发表于 2022-6-26 16:55

红影 发表于 2022-6-26 15:56
这个评分后一定要刷新才可以,我前面忘记这点,放一段话怎么都不读,后来才想起来这点

很多JS的运行都受到评分所用的的异步操作影响

马黑黑 发表于 2022-6-26 16:56

红影 发表于 2022-6-26 15:53
特地把最后一句去掉标点,结果那句就直接被扔掉了,也不阅读了,也不标注了

对,这个我是依据标点符号断句的

红影 发表于 2022-6-26 22:04

马黑黑 发表于 2022-6-26 16:55
很多JS的运行都受到评分所用的的异步操作影响

是啊,我前面忘了这点,结果试了半天试不出{:4_173:}

红影 发表于 2022-6-26 22:04

马黑黑 发表于 2022-6-26 16:56
对,这个我是依据标点符号断句的

原来是这样。试过才知道的{:4_173:}

马黑黑 发表于 2022-6-26 22:18

红影 发表于 2022-6-26 22:04
原来是这样。试过才知道的

玩玩的,有空弄个选中文本就开读的

马黑黑 发表于 2022-6-26 22:19

红影 发表于 2022-6-26 22:04
是啊,我前面忘了这点,结果试了半天试不出

凡评分都习惯按下f5

红影 发表于 2022-6-27 10:59

马黑黑 发表于 2022-6-26 22:18
玩玩的,有空弄个选中文本就开读的

早上来已经看到了,黑黑厉害,想弄什么就弄什么{:4_199:}

红影 发表于 2022-6-27 11:00

马黑黑 发表于 2022-6-26 22:19
凡评分都习惯按下f5

这不是忘了么,下回会记得了{:4_173:}

马黑黑 发表于 2022-6-27 12:20

红影 发表于 2022-6-27 11:00
这不是忘了么,下回会记得了

木有办法

马黑黑 发表于 2022-6-27 12:20

红影 发表于 2022-6-27 10:59
早上来已经看到了,黑黑厉害,想弄什么就弄什么

没那么夸张

红影 发表于 2022-6-27 20:38

马黑黑 发表于 2022-6-27 12:20
木有办法

没什么,多刷新就是了{:4_204:}

红影 发表于 2022-6-27 20:38

马黑黑 发表于 2022-6-27 12:20
没那么夸张

的确是你想到的都弄出来了啊。

马黑黑 发表于 2022-6-27 20:39

红影 发表于 2022-6-27 20:38
的确是你想到的都弄出来了啊。

一般我只想那些可能可以弄出来的,不敢想那些不可能弄出来的

红影 发表于 2022-6-27 21:58

马黑黑 发表于 2022-6-27 20:39
一般我只想那些可能可以弄出来的,不敢想那些不可能弄出来的

至少你知道哪些可以哪些不可以,我连这也不知道,完全糊里糊涂{:4_173:}

马黑黑 发表于 2022-6-27 21:59

红影 发表于 2022-6-27 21:58
至少你知道哪些可以哪些不可以,我连这也不知道,完全糊里糊涂

我研究过的。之前,TTS还不怎么流行的时候,还做过一个编辑器,输入每一个字都可以朗读
页: [1] 2 3
查看完整版本: 再试TTS:朗读时同步选中文本