国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

前端文字轉(zhuǎn)語音(tts+mp3拼接)

這篇具有很好參考價(jià)值的文章主要介紹了前端文字轉(zhuǎn)語音(tts+mp3拼接)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.功能場(chǎng)景

有時(shí)候需要在網(wǎng)頁上面播報(bào)一段語音,而這段語音是動(dòng)態(tài)的。例如收銀時(shí)播報(bào)請(qǐng)出示付款嗎,收錢成功后播報(bào)某某某為您收到金額XX元。

2.思路

第一種思路是前端不需要怎么動(dòng)手寫代碼的也是最容易實(shí)現(xiàn)的,調(diào)用語音合成api。但是api的局限性就在于免費(fèi)的沒有語音包,收錢的就有點(diǎn)貴了,不適用于重復(fù)調(diào)用(我們系統(tǒng)目前規(guī)模不大,但是每天也能產(chǎn)生1-2萬條成功的交易訂單)。

第二種思路是調(diào)用windows本地的tts語音合成服務(wù),這是能免費(fèi)使用且可以支持每次根據(jù)不同的內(nèi)容來合成不同的語音的一個(gè)功能。

第三種思路使用video元素直接組裝一些零散的文字來形成一段完整的音頻。

這里就講一下第二種跟第三種思路

3.實(shí)現(xiàn)

? ? ? ? 3.1windows本地的tts語音合成服務(wù)

? ? ? ? 這里使用的是SpeechSynthesisUtterance這個(gè)html5新的api,這個(gè)對(duì)象主要用來構(gòu)建語音合成實(shí)例,具體的屬性如下。

  • text – 要合成的文字內(nèi)容:string。
  • lang – 使用的語言:string, 例如:"zh-cn"
  • voiceURI – 指定希望使用的聲音和服務(wù):string。
  • volume – 聲音的音量:number,范圍是0-1,默認(rèn)11
  • rate – 語速:number,范圍是0.1-10,默認(rèn)1。
  • pitch – 表示說話的音高:number,范圍是0-2。默認(rèn)為1。

當(dāng)然,這個(gè)實(shí)例對(duì)象也包括一些方法

  • onstart?– 合成開始的回調(diào)。
  • onpause?– 合成暫停的回調(diào)。
  • onresume?– 合成重新開始的回調(diào)。
  • onend?– 合成結(jié)束時(shí)的回調(diào)。

前端文字轉(zhuǎn)語音(tts+mp3拼接)

這是mdn上面對(duì)SpeechSynthesisUtterance這個(gè)對(duì)象的說明:SpeechSynthesisUtterance - Web API 接口參考 | MDN

?然后還有一個(gè)跟SpeechSynthesisUtterance搭配使用的SpeechSynthesis對(duì)象。該接口是語音服務(wù)的控制接口,它可以用于獲取設(shè)備上關(guān)于可用的合成聲音的信息,開始、暫停語音,或除此之外的其他命令。SpeechSynthesisUtterance - Web API 接口參考 | MDN

  • speak() – 只能接收SpeechSynthesisUtterance作為唯一的參數(shù),作用是讀合成的話語。

  • stop() – 立即終止合成過程。

  • pause() – 暫停合成過程。

  • resume() – 重新開始合成過程。

  • getVoices – 此方法不接受任何參數(shù),用來返回瀏覽器支持的語音包列表,是個(gè)數(shù)組。

  • 谷歌瀏覽器getVoices獲取的聲音列表,國內(nèi)能使用的應(yīng)該就前三個(gè)

  • 前端文字轉(zhuǎn)語音(tts+mp3拼接)

    ?

let synth;
let msg;
const initSpeak = () => {
    synth = window.speechSynthesis
    msg = new SpeechSynthesisUtterance()
    msg.text = '收到新的訂單'
    msg.lang = 'zh-CN'
    msg.pitch = 1.1
    msg.rate = 1.8
    msg.volume = 10
    //getVoices() 是一個(gè)異步的方法,需要使用一個(gè)定時(shí)器來保證每次都能獲取到值
    setTimeout(()=>{
        synth.getVoices().find(i=>i.lang=='zh-CN'&&i.localService==true)
    },100)
}

initSpeak()

// 調(diào)用這個(gè)方法傳入一個(gè)你需要合成的文字的話就能開始使用瀏覽器來播報(bào)語音了
const handleSpeak = (message) => {
    msg.text = message
    synth.speak(msg)
}

到這里就完成了語音合成了,不過由于我們項(xiàng)目中有的客戶電腦使用的閹割版的windows或者沒有去安裝語音合成引擎,這個(gè)版本上線一周就被pass掉了,所以使用這個(gè)方案的前提是你能保證客戶機(jī)上面是安裝了語音合成引擎。

????????3.2 組裝一些零散的mp3片段來形成一段完整的音頻(偽語音播報(bào))

? ? ? ? 結(jié)合到實(shí)際的應(yīng)用場(chǎng)景項(xiàng)目中最終選擇了這種方式來實(shí)現(xiàn)語音合成,雖然方法很笨,但是至少所有客戶機(jī)都能滿足需求且可以做到客戶自定義語音包。

? ? ? ? 實(shí)現(xiàn):

1.需要一個(gè)將數(shù)字轉(zhuǎn)換成中文讀數(shù)的方法(網(wǎng)上找的)

2.再將這個(gè)中文讀數(shù)構(gòu)造成一個(gè)數(shù)組(urlList)

3.調(diào)用組件進(jìn)行播報(bào)

?數(shù)字轉(zhuǎn)換成中文讀數(shù)的方法

/**
    * 數(shù)字轉(zhuǎn)成漢字
    * @params num === 要轉(zhuǎn)換的數(shù)字
    * @return 漢字
    * @eg 例如,輸入0.41, 返回"零點(diǎn)四一元"
    * */
const numToChines = (tranvalue) => {
    if (typeof tranvalue == "number") {
        tranvalue = tranvalue + ''
    }
    //拆分整數(shù)與小數(shù)
    let splits = function (tranvalue) {
        var value = new Array('', '');
        temp = tranvalue.split(".");
        for (var i = 0; i < temp.length; i++) {
            value[i] = temp[i];
        }
        return value;
    }
    try {
        var i = 1;
        var dw2 = new Array("", "萬", "億");//大單位
        var dw1 = new Array("十", "百", "千");//小單位
        var dw = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九");//整數(shù)部分用
        //以下是小寫轉(zhuǎn)換成大寫顯示在合計(jì)大寫的文本框中
        //分離整數(shù)與小數(shù)
        var source = splits(tranvalue);
        var num = source[0];
        var dig = source[1];
        //轉(zhuǎn)換整數(shù)部分
        var k1 = 0;//計(jì)小單位
        var k2 = 0;//計(jì)大單位
        var sum = 0;
        var str = "";
        var len = source[0].length;//整數(shù)的長度
        for (i = 1; i <= len; i++) {
            var n = source[0].charAt(len - i);//取得某個(gè)位數(shù)上的數(shù)字
            var bn = 0;
            if (len - i - 1 >= 0) {
                bn = source[0].charAt(len - i - 1);//取得某個(gè)位數(shù)前一位上的數(shù)字
            }
            sum = sum + Number(n);
            if (sum != 0) {
                str = dw[Number(n)].concat(str);//取得該數(shù)字對(duì)應(yīng)的大寫數(shù)字,并插入到str字符串的前面
                if (n == '0') sum = 0;
            }
            if (len - i - 1 >= 0) {//在數(shù)字范圍內(nèi)
                if (k1 != 3) {//加小單位
                    if (bn != 0) {
                        str = dw1[k1].concat(str);
                    }
                    k1++;
                } else {//不加小單位,加大單位
                    k1 = 0;
                    var temp = str.charAt(0);
                    if (temp == "萬" || temp == "億")//若大單位前沒有數(shù)字則舍去大單位
                        str = str.substr(1, str.length - 1);
                    str = dw2[k2].concat(str);
                    sum = 0;
                }
            }
            if (k1 == 3)//小單位到千則大單位進(jìn)一
            { k2++; }
        }
        //轉(zhuǎn)換小數(shù)部分
        var strdig = "";
        if (dig != "") {
            var n = dig.charAt(0)
            var nn = dig.charAt(1)
            if (nn !== "") {
                strdig = "點(diǎn)" + dw[Number(n)] + dw[Number(nn)]
            } else {
                strdig = "點(diǎn)" + dw[Number(n)]
            }

        }
        if (str) {
            str += strdig + "元";
        } else {
            str = "零" + strdig + "元"
        }

    } catch (e) {
        return "零元";
    }
    return str;
}

?構(gòu)建待播報(bào)的數(shù)組

//將中文枚舉成對(duì)應(yīng)的英文路徑
const voiceEnum = {
    "萬": "ten_thousand",
    "十": "ten",
    "百": "hundred",
    "千": "thousand",
    "零": "0",
    "一": "1",
    "二": "2",
    "三": "3",
    "四": "4",
    "五": "5",
    "六": "6",
    "七": "7",
    "八": "8",
    "九": "9",
    "點(diǎn)": "point",
    "元": "element"
}

const speak = () => {
    let list = []
    let chineseNum = numToChines(0.41)
    for (let i = 0; i < chineseNum.length; i++) {
        const item = chineseNum[i];
        //這里的地址拼接成你自己存放零散mp3片段的地址,voicePacket是語音包的配置,需要自己去定義
           urlList.push(`https://oss.aliyuncs.com/voice/${voicePacket.value}/amount/${voiceEnum[item]}.mp3`)
    }
    //調(diào)用一個(gè)組件來播報(bào)這個(gè)數(shù)組形式的url
    audioLoopRef.value && audioLoopRef.value.start(list)
}

?附上audioLoop這個(gè)組件代碼,構(gòu)建好urlList之后通過ref調(diào)用組件內(nèi)的方法即可

<template>
    <div v-if="audioUrlList.length > 0">
        <audio @ended="voiceEnded" id="voice">
            <source :src="audioUrlList[currentIndex]" type="audio/mpeg">
            您的瀏覽器不支持 audio 元素。
        </audio>
    </div>
</template>
 
<script setup>
import { ref, nextTick } from "vue"
// 用來保存?zhèn)鬟^來的需要播放的urlList:[]
const audioUrlList = ref([])
// 默認(rèn)從頭開始播報(bào)
const currentIndex = ref(0)
// 開始播報(bào)
const start = (urlList) => {
    audioUrlList.value = urlList
    nextTick(() => {
        let dom = document.getElementById("voice")
        dom.play()
    })
}

// 停止播報(bào)
const stop = () => {
    let dom = document.getElementById("voice")
    nextTick(() => {
        dom.pause()
        dom.setAttribute("src", "xxxx")
        currentIndex.value = 0
        audioUrlList.value = []
    })
}

// 播放完一個(gè)就繼續(xù)播放下一個(gè) 
const voiceEnded = () => {
    if (currentIndex.value == (audioUrlList.value.length - 1)) {
        audioUrlList.value = []
        currentIndex.value = 0
    } else {
        currentIndex.value++
        let dom = document.getElementById("voice")
        dom.setAttribute("src", audioUrlList.value[currentIndex.value])
        dom.play()
    }
}
defineExpose({
    start, stop
})
</script>

?語音包的實(shí)現(xiàn)其實(shí)就是將相同的文字多錄制幾個(gè)語音包放在不同的oss目錄下面,到時(shí)候通過前端的配置動(dòng)態(tài)生成urlList時(shí)去對(duì)應(yīng)到不同的語音包。

?前端文字轉(zhuǎn)語音(tts+mp3拼接)

?

到這里就完成了自己手動(dòng)合成一段語音并播報(bào)了。文章來源地址http://www.zghlxwxcb.cn/news/detail-416196.html

到了這里,關(guān)于前端文字轉(zhuǎn)語音(tts+mp3拼接)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 微軟語音合成助手 TTS-VUE 文字轉(zhuǎn)語音工具

    微軟語音合成助手 TTS-VUE 文字轉(zhuǎn)語音工具

    我們?cè)谒⒍桃曨l的時(shí)候經(jīng)常會(huì)聽到一些AI合成聲音,它們有各種音色、語調(diào),甚至不同的情緒,聽起來與人聲無異 其實(shí)這些大都是利用微軟Azure的文字轉(zhuǎn)語音技術(shù)來實(shí)現(xiàn)的 雖然國內(nèi)也有很多配音工具,但體驗(yàn)下來還是微軟的效果最好,語氣最為自然 不過Azure的文字轉(zhuǎn)語音功能

    2024年02月02日
    瀏覽(26)
  • 體驗(yàn)最佳的一個(gè)TTS文字轉(zhuǎn)語音工具

    文本轉(zhuǎn)語音 (TTS) 技術(shù)在當(dāng)今的數(shù)字世界中變得越來越流行,其應(yīng)用范圍從語音導(dǎo)航到教學(xué)視頻、教育和娛樂。 TTS 技術(shù)允許用戶將文本轉(zhuǎn)換為語音,使其成為一種極其方便、高效和靈活的交流方式。 個(gè)人的使用場(chǎng)景是抖音短視頻語音配音和電影解說,嘗試了很多網(wǎng)站和工具,

    2024年02月15日
    瀏覽(20)
  • MP3 Module 語音播放模塊(Arduino和串口控制)

    MP3 Module 語音播放模塊(Arduino和串口控制)

    Emakefun MP3語音模塊內(nèi)置8 MB存儲(chǔ)空間,無需外接SD卡,若一個(gè)音效以秒計(jì)算,8M的內(nèi)存可以存儲(chǔ)兩百多個(gè)音效供您選用。存儲(chǔ)方式和使用U盤一樣簡單,可隨時(shí)更新模塊內(nèi)的音效。使用上非常的簡單,使用PH2.0接口,減少了接線的煩惱;支持MP3、WAV音頻格式,可做指定播放,循環(huán)

    2024年02月07日
    瀏覽(128)
  • 4個(gè)步驟實(shí)現(xiàn)Java版的TTS(文字轉(zhuǎn)語音)

    4個(gè)步驟實(shí)現(xiàn)Java版的TTS(文字轉(zhuǎn)語音)

    TTS是Text To Speech的縮寫,即“從文本到語音”,讓機(jī)器能夠說話。 微軟自帶TTS(Text To Speech) 語音引擎,可以將文本轉(zhuǎn)換成語音播報(bào)。 現(xiàn)在通過Java程序(jacob包),利用Windows自帶的TTS實(shí)現(xiàn)語言的播報(bào)。 詳細(xì)步驟如下: 下載jacob jar包和dll文件 將dll放置到相應(yīng)的文件目錄中 將

    2024年02月07日
    瀏覽(20)
  • 瀏覽器原生JavaScript離線文字轉(zhuǎn)語音TTS播放,支持Windows自帶TTS語音和移動(dòng)端(安卓、IOS)

    瀏覽器原生JavaScript離線文字轉(zhuǎn)語音TTS播放,支持Windows自帶TTS語音和移動(dòng)端(安卓、IOS)

    JS已經(jīng)可以實(shí)現(xiàn)語音合成(文字轉(zhuǎn)語音)和語音識(shí)別(語音轉(zhuǎn)文字),各個(gè)瀏覽器支持列表如下所示: 語音識(shí)別支持列表: 因此,瀏覽器上面使用語音合成非常簡單。 頁面效果示例: 1、支持速度,音調(diào)設(shè)置 2、支持下拉選擇語音模板 3、文字轉(zhuǎn)語音 該文件可直接保存成htm

    2024年02月04日
    瀏覽(28)
  • AI智能語音識(shí)別模塊(二)——基于Arduino的語音控制MP3播放器

    AI智能語音識(shí)別模塊(二)——基于Arduino的語音控制MP3播放器

    在前面一篇文章里我們對(duì)AI智能語音識(shí)別模塊進(jìn)行了介紹,并對(duì)離線語音模組下載固件的過程進(jìn)行了一個(gè)簡單描述,不知道大家還記不記得,這篇文章也是鴿了好久,,本文將用這個(gè)語音控制模塊結(jié)合前面介紹的DFPlayer Mini MP3模塊來做一個(gè)有趣的應(yīng)用,在上一期文章中,我們只

    2024年02月03日
    瀏覽(29)
  • 免費(fèi)下載微軟azure文本轉(zhuǎn)語音的mp3文件

    免費(fèi)下載微軟azure文本轉(zhuǎn)語音的mp3文件

    免費(fèi)下載微軟azure文本轉(zhuǎn)語音的mp3文件 Azure機(jī)器學(xué)習(xí)的文本轉(zhuǎn)語音最接近人聲, 大家平時(shí)看的抖音的影視剪輯賬號(hào)用的配音都是從這里錄制下載的 一、下載 edge瀏覽器 由于國內(nèi)下載google瀏覽器插件需要科學(xué)上網(wǎng),所以我們這里使用edge瀏覽器 下載地址可以自行百度,或者從這里

    2024年02月05日
    瀏覽(17)
  • vue使用WEB自帶TTS實(shí)現(xiàn)語音文字互轉(zhuǎn)

    vue使用WEB自帶TTS實(shí)現(xiàn)語音文字互轉(zhuǎn)

    時(shí)隔多日,自己已經(jīng)好久沒更新文章了;今年一直跟隨公司的政策[BEI YA ZHA]中,做了一個(gè)又一個(gè)的需求,反而沒有多少自己的時(shí)間,更別說突破自己 ??o·(? ??????????? )?o·? (霧) 然后最近,我朋友突然和我說有沒有做過TTS,我第一反應(yīng)是??? ? ????…… 一

    2024年02月04日
    瀏覽(22)
  • 【花雕動(dòng)手做】ASRPRO語音識(shí)別(72)---定義與循環(huán)播放MP3

    【花雕動(dòng)手做】ASRPRO語音識(shí)別(72)---定義與循環(huán)播放MP3

    本例實(shí)驗(yàn)采用Mini MP3 Player播放器模塊 是一款小巧且價(jià)格低廉的MP3模塊,可以直接接駁揚(yáng)聲器。模塊配合供電電池、揚(yáng)聲器、按鍵可以單獨(dú)使用,也可以通過串口控制,作為UNO或者是任何有串口的單片機(jī)的一個(gè)模塊。模塊本身完美的集成了MP3、WAV、WMA的硬解碼。同時(shí)軟件支持

    2024年02月19日
    瀏覽(21)
  • Python調(diào)用edge-tts實(shí)現(xiàn)在線文字轉(zhuǎn)語音

    edge-tts是一個(gè) Python 模塊,允許通過Python代碼或命令的方式使用 Microsoft Edge 的在線文本轉(zhuǎn)語音服務(wù)。 GitHub - rany2/edge-tts: Use Microsoft Edge\\\'s online text-to-speech service from Python WITHOUT needing Microsoft Edge or Windows or an API key Use Microsoft Edge\\\'s online text-to-speech service from Python WITHOUT needing Micro

    2024年03月27日
    瀏覽(96)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包