JavaScript音視頻之通過(guò)輸入的文字自動(dòng)計(jì)算機(jī)讀時(shí)長(zhǎng)
需求
通過(guò)輸入的文字,自動(dòng)計(jì)算機(jī)讀時(shí)長(zhǎng)

分析
核心設(shè)計(jì)思路
- 區(qū)分中文(單音節(jié)字) 和英文(多音節(jié)詞) 的語(yǔ)速邏輯(中文按 “字 / 分鐘”,英文按 “詞 / 分鐘”);
- 提供默認(rèn)語(yǔ)速(自然舒適的中速),支持自定義調(diào)整;
- 計(jì)算結(jié)果保留兩位小數(shù),符合實(shí)際使用場(chǎng)景;
- 兼容空字符串、全空格等邊界情況。
- 時(shí)長(zhǎng) = 字符數(shù) × (60 ÷ 語(yǔ)速值)(中文按字,英文按詞)
- 預(yù)設(shè)了最貼合實(shí)際的語(yǔ)速值(中速 200 字 / 分鐘),開(kāi)箱即用
- 支持雙語(yǔ)、自定義語(yǔ)速,適配不同 TTS 工具和業(yè)務(wù)場(chǎng)景
封裝函數(shù)
/**
* method: calculateTtsDuration
* description: 計(jì)算文本轉(zhuǎn)機(jī)讀的時(shí)長(zhǎng)
*/
/**
* 計(jì)算字符串機(jī)讀時(shí)長(zhǎng)(支持中文/英文,適配不同語(yǔ)速)
* @param {string} text - 要朗讀的字符串
* @param {Object} [options] - 可選配置項(xiàng)
* @param {number} [options.speedType='normal'] - 語(yǔ)速類型:slow(慢速)/normal(中速)/fast(快速),也可傳自定義語(yǔ)速值
* @param {Object} [options.speedConfig] - 自定義語(yǔ)速配置(字/分鐘,中文)|(詞/分鐘,英文)
* @param {number} [options.speedConfig.zhSlow=135] - 中文慢速(默認(rèn)135字/分鐘)
* @param {number} [options.speedConfig.zhNormal=200] - 中文中速(默認(rèn)200字/分鐘,最舒適)
* @param {number} [options.speedConfig.zhFast=270] - 中文快速(默認(rèn)270字/分鐘)
* @param {number} [options.speedConfig.enSlow=120] - 英文慢速(默認(rèn)120詞/分鐘)
* @param {number} [options.speedConfig.enNormal=150] - 英文中速(默認(rèn)150詞/分鐘)
* @param {number} [options.speedConfig.enFast=180] - 英文快速(默認(rèn)180詞/分鐘)
* @returns {number} 朗讀時(shí)長(zhǎng)(秒),保留兩位小數(shù)
*/
export function calculateTtsDuration(text, options = {}) {
// 1. 處理邊界:空字符串/全空格直接返回0
if (!text || text.trim() === '') {
return 0
}
// 2. 默認(rèn)配置
const defaultConfig = {
speedType: 'normal',
speedConfig: {
zhSlow: 135, // 中文慢速:≈0.44秒/字(60/135)
zhNormal: 200, // 中文中速:≈0.3秒/字(60/200)
zhFast: 270, // 中文快速:≈0.22秒/字(60/270)
enSlow: 120, // 英文慢速:0.5秒/詞
enNormal: 150, // 英文中速:0.4秒/詞
enFast: 180 // 英文快速:≈0.33秒/詞
}
}
// 合并配置
const config = { ...defaultConfig, ...options }
const { speedType, speedConfig } = config
// 3. 區(qū)分中文/英文,計(jì)算有效長(zhǎng)度
// 中文:匹配中文字符(包括繁體),統(tǒng)計(jì)字?jǐn)?shù);非中文按英文單詞統(tǒng)計(jì)
const zhCharRegex =
/[\u4e00-\u9fa5\u3400-\u4dbf\u{20000}-\u{2a6df}\u{2a700}-\u{2b73f}\u{2b740}-\u{2b81f}\u{2b820}-\u{2ceaf}\u{2ceb0}-\u{2ebef}\u{30000}-\u{3134f}]/gu
const zhChars = text.match(zhCharRegex) || [] // 中文字符數(shù)組
const zhLength = zhChars.length // 中文字?jǐn)?shù)
// 英文:提取非中文字符,按空格分割成單詞(過(guò)濾空字符串)
const nonZhText = text.replace(zhCharRegex, ' ').trim()
const enWords = nonZhText.split(/\s+/).filter((word) => word !== '') // 英文單詞數(shù)組
const enLength = enWords.length // 英文單詞數(shù)
// 4. 獲取對(duì)應(yīng)語(yǔ)速值
let zhSpeed, enSpeed
// 支持直接傳自定義語(yǔ)速值(如傳 250 表示中文250字/分鐘)
if (typeof speedType === 'number') {
zhSpeed = speedType
enSpeed = speedType * 0.75 // 英文語(yǔ)速≈中文的75%(經(jīng)驗(yàn)值)
} else {
zhSpeed =
speedConfig[`zh${speedType.charAt(0).toUpperCase() + speedType.slice(1)}`] ||
speedConfig.zhNormal
enSpeed =
speedConfig[`en${speedType.charAt(0).toUpperCase() + speedType.slice(1)}`] ||
speedConfig.enNormal
}
// 5. 計(jì)算總時(shí)長(zhǎng):中文時(shí)長(zhǎng) + 英文時(shí)長(zhǎng)(秒)
const zhDuration = zhLength * (60 / zhSpeed) // 中文字?jǐn)?shù) × 單字時(shí)長(zhǎng)
const enDuration = enLength * (60 / enSpeed) // 英文單詞數(shù) × 單詞時(shí)長(zhǎng)
const totalDuration = zhDuration + enDuration
// 6. 保留兩位小數(shù)返回
return Number(totalDuration.toFixed(2))
}
使用示例
// // -------------------------- 使用示例 --------------------------
// // 示例1:純中文,默認(rèn)中速
// const text1 = '今天天氣很好'
// console.log(`"${text1}" 朗讀時(shí)長(zhǎng):${calculateTtsDuration(text1)} 秒`)
// // 輸出:"今天天氣很好" 朗讀時(shí)長(zhǎng):1.5 秒(5字 × 0.3秒/字)
// // 示例2:純中文,慢速
// console.log(`"${text1}" 慢速朗讀時(shí)長(zhǎng):${calculateTtsDuration(text1, { speedType: 'slow' })} 秒`)
// // 輸出:"今天天氣很好" 慢速朗讀時(shí)長(zhǎng):2.22 秒(5字 × 0.44秒/字)
// // 示例3:中英混合,快速
// const text2 = 'Hello 世界,今天吃了嗎?'
// console.log(`"${text2}" 快速朗讀時(shí)長(zhǎng):${calculateTtsDuration(text2, { speedType: 'fast' })} 秒`)
// // 中文:5字 × 0.22秒/字 = 1.1秒;英文:1詞 × 0.33秒/詞 = 0.33秒;總計(jì)≈1.43秒
// // 示例4:自定義語(yǔ)速(250字/分鐘)
// console.log(`"${text1}" 自定義語(yǔ)速時(shí)長(zhǎng):${calculateTtsDuration(text1, { speedType: 250 })} 秒`)
// // 輸出:"今天天氣很好" 自定義語(yǔ)速時(shí)長(zhǎng):1.2 秒(5字 × 0.24秒/字)
// // 示例5:空字符串
// console.log(`空字符串時(shí)長(zhǎng):${calculateTtsDuration('')} 秒`) // 輸出:0 秒
到此這篇關(guān)于JavaScript音視頻之通過(guò)輸入的文字自動(dòng)計(jì)算機(jī)讀時(shí)長(zhǎng)的文章就介紹到這了,更多相關(guān)JavaScript計(jì)算文本轉(zhuǎn)語(yǔ)音時(shí)長(zhǎng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js實(shí)現(xiàn)人民幣大寫(xiě)金額形式轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)人民幣大寫(xiě)金額形式轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下2016-04-04
Javascript 多物體運(yùn)動(dòng)的實(shí)現(xiàn)
這篇文章主要介紹了Javascript 多物體運(yùn)動(dòng)的實(shí)現(xiàn),需要的朋友可以參考下2014-12-12
前端請(qǐng)求后端接口報(bào)錯(cuò)blockedmixed-content的原因以及解決辦法
blocked:mixed-content是一個(gè)安全警告,表示當(dāng)前頁(yè)面加載的資源存在混合內(nèi)容,這篇文章主要介紹了前端請(qǐng)求后端接口報(bào)錯(cuò)blockedmixed-content的原因以及解決辦法,需要的朋友可以參考下2025-06-06
javascript中alert()與console.log()的區(qū)別
我們?cè)谧鰆s調(diào)試的時(shí)候使用 alert 可以顯示信息,調(diào)試程序,alert 彈出窗口會(huì)中斷程序, 如果要在循環(huán)中顯示信息,手點(diǎn)擊關(guān)閉窗口都累死。而且 alert 顯示對(duì)象永遠(yuǎn)顯示為[object ]。 自己寫(xiě)的 log 雖然可以顯示一些 object 信息,但很多功能支持都沒(méi)有 console 好2015-08-08
JavaScript倒計(jì)時(shí)不準(zhǔn)的原因與精準(zhǔn)實(shí)現(xiàn)方法
JavaScript 中實(shí)現(xiàn)精確的倒計(jì)時(shí)是一個(gè)常見(jiàn)的挑戰(zhàn),其不準(zhǔn)確性主要源于 JavaScript 的單線程特性、瀏覽器的優(yōu)化策略以及設(shè)備本地時(shí)間可能被修改等因素,下面我會(huì)詳細(xì)解釋原因,并提供幾種方法來(lái)實(shí)現(xiàn)更精準(zhǔn)倒計(jì)時(shí)的策略,需要的朋友可以參考下2025-10-10
微信網(wǎng)頁(yè)登錄邏輯與實(shí)現(xiàn)方法
這篇文章主要介紹了微信網(wǎng)頁(yè)登錄邏輯與實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04

