JavaScript音視頻之通過輸入的文字自動計算機讀時長
更新時間:2026年02月06日 09:15:13 作者:博客zhu虎康
這篇文章主要介紹了一個計算文本轉(zhuǎn)語音時長的JavaScript函數(shù),該函數(shù)支持中英文混合文本,通過區(qū)分中文(按字數(shù))和英文(按單詞數(shù))分別計算時長,感興趣的小伙伴可以了解下
需求
通過輸入的文字,自動計算機讀時長

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

