文字转语音:语音合成(Speech Synthesis) 数组文字循环播放

前言:
HTML5中和Web Speech相关的API实际上有两类,一类是"语音识别(Speech Recognition)",另外一个就是"语音合成(Speech Synthesis)", 这两个名词实际上指的分别是"语音转文字",和"文字变语音"。

speak() -- 只能接收SpeechSynthesisUtterance作为唯一的参数,作用是读合成的话语。 stop() -- 立即终止合成过程。 pause() -- 暂停合成过程。 resume() -- 重新开始合成过程。 getVoices() -- 此方法不接受任何参数,用来返回浏览器支持的语音包列表,是个数组。 speechSynthesis.getVoices()返回因每个浏览器不同及版本的不同返回不太一样,大致是这样:

注意:语言包获取不稳定,有时候返回为空,可以用定时器多试几次。

  • SpeechSynthesisUtterance主要用来构建语音合成实例,

  • speechSynthesis大概用来触发浏览器语音模块,让浏览器把内容读出来。 想要浏览器开口说话,只需要:

    javascript 复制代码
    let speechInstance = new SpeechSynthesisUtterance('大家好,我是渣渣辉。');
    speechSynthesis.speak(speechInstance);`
    
    就是这么简单,不妨copy进浏览器试一下?
    // 更换语言
    var msg = new SpeechSynthesisUtterance();
    var voices = window.speechSynthesis.getVoices(); // 获取语言包
    msg.voice = voices[18]; // 18:普通话
    msg.text = "Hello World";
    speechSynthesis.speak(msg); // 

    SpeechSynthesisUtterance实例有以下属性,可以通过设置一下属性调整发音:

  • text -- 要合成的文字内容,字符串。

  • lang -- 使用的语言,字符串, 例如:"zh-cn"

  • voiceURI -- 指定希望使用的声音和服务,字符串。

  • volume -- 声音的音量,区间范围是0到1,默认是1。

  • rate -- 语速,数值,默认值是1,范围是0.1到10,表示语速的倍数,例如2表示正常语速的两倍。

  • pitch -- 表示说话的音高,数值,范围从0(最小)到2(最大)。默认值为1。

    还有一些方法:

  • onstart -- 语音合成开始时候的回调。

  • onpause -- 语音合成暂停时候的回调。

  • onresume -- 语音合成重新开始时候的回调。

  • onend -- 语音合成结束时候的回调。

  • speechSynthesis对象有以下方法:

代码如下:

javascript 复制代码
<template>
    <div class="box">
        <!-- <input type="text" name="text" id="text" v-model="text" /> -->
        <button @click="playVoice">播放语音</button>
        <button @click="pauseVoice" v-if="status === '开始播放'">暂停播放</button>
        <button @click="resumeVoice" v-if="status === '暂停播放'">继续播放</button>
        <button @click="stopVoice">停止播放</button>
        <div>播放状态:{{ status }}</div>
    </div>
</template>
  
<script>
const synth = window.speechSynthesis
const msg = new window.SpeechSynthesisUtterance()
export default {
    data() {
        return {
            currentMsgIndex: 0,
            text: "",
            status: "",
            tableData: [
                { text: '切换后基站BCCH与TCH电平不一致' },
                { text: '切换带异常' },
                { text: '切换后TA偏大' },
                { text: '切换后基站BCCH与TCH电平不一致' },
                { text: '切换带异常' },
                { text: '切换后TA偏大' },
                { text: '切换后基站BCCH与TCH电平不一致' },
                { text: '切换带异常' },
                { text: '切换后TA偏大' }
            ]
        }
    },
    created() {
        this.playVoice()
    },
    mounted() {
        msg.onstart = e => {
            // this.currentMsgIndex = 0
            this.status = '开始播放'
            console.log(this.status)
        }
        msg.onend = e => {
            this.status = '结束播放'
            console.log(this.status)
            this.currentMsgIndex++
            if (this.currentMsgIndex < this.tableData.length) {
                this.playVoice()
            } else {
                this.currentMsgIndex = 0
            }
            console.log(this.currentMsgIndex)
        }
        msg.onpause = e => {
            this.status = "暂停播放"
            console.log('onpause:', this.status)
        }
    },
    destroyed() {
        this.stopVoice()
    },
    methods: {
        //播放
        playVoice() {
            this.handleSpeak(this.tableData[this.currentMsgIndex].text)
        },
        //暂停
        pauseVoice() {
            this.handlePause()
        },
        //继续
        resumeVoice() {
            this.handleResume()
        },
        //停止
        stopVoice() {
            this.handleStop()
        },
        handleSpeak(TEXT) {
            console.log('TEXT:', TEXT)
            // if (!this.text) return alert('请输入文本!')
            msg.text = TEXT // this.text
            msg.lang = 'zh-CN' // 语言
            msg.volume = 1 // 音量:0~1,默认1
            msg.rate = 1 // 语速:0.1~10,默认1
            msg.pitch = 1 // 音高:0~2,默认1
            // msg.voiceURI=''// 希望使用的声音
            synth.speak(msg)
        },
        handleStop(e) {
            synth.cancel(msg)
        },
        handlePause(e) {
            synth.pause(this.tableData[this.currentMsgIndex].text)
        },
        handleResume(e) {
            synth.resume(msg)
        }
    }
}
</script>
  
相关推荐
agicall.com14 小时前
座机通话双方语音分离技术解决方案详解
人工智能·语音识别·信创电话助手·座机语音转文字·固话座机录音转文字
MonkeyKing_sunyuhua21 小时前
什么是服务端 VAD 端点检测
人工智能·语音识别
小仙女的小稀罕21 小时前
培训要点写不完不会整理?规范培训转待办可这样操作
大数据·人工智能·学习·自然语言处理·语音识别
小仙女的小稀罕1 天前
适合销售从业者会议整理使用的销售录音转任务工具
大数据·人工智能·学习·自然语言处理·语音识别
小仙女的小稀罕1 天前
一线记者采访场景 语音转文字APP对比哪款更实用
人工智能·语音识别
小仙女的小稀罕1 天前
语音转文字错误多改不完?教你优化转写准确率的方法
人工智能·语音识别
SH202509171 天前
2026年语音转文字不准确?这5个优化方法帮你提升转写准确率
人工智能·语音识别
电子科技圈2 天前
四大“门派”围攻边缘及端侧AI SoC市场“光明顶”
人工智能·嵌入式硬件·mcu·物联网·网络安全·音视频·语音识别
DogDaoDao3 天前
【GitHub】Microsoft VibeVoice 深度解析:开源语音AI全家桶,90分钟长语音合成+60分钟语音识别
人工智能·microsoft·开源·github·语音识别·语音处理·vibevoice
小龙报3 天前
【必装软件】python及pycharm的安装与环境配置
开发语言·人工智能·python·语言模型·自然语言处理·pycharm·语音识别