You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何删除SpeechRecognition字幕容器顶部溢出文本以避免程序停止?

解决实时字幕容器内容溢出导致的性能问题

要解决文本累积过长导致的程序卡顿,核心思路是避免无限累加字符串导致DOM节点过载,转而将内容拆分为可管理的独立元素,动态删除顶部溢出的旧内容。以下是具体实现方案:

方案1:限制显示的段落数量

将每段最终识别的文本作为独立<p>元素存储,设定最大保留段落数,超过时自动移除最早的内容:

修改后的JavaScript代码

const badWords = ['banana', 'apple', 'pear', 'orange', 'grape'];

window.SpeechRecognition = window.webkitSpeechRecognition || window.SpeechRecognition;
// 用数组存储最终识别的段落,替代原有的字符串累加
const finalParagraphs = [];
let recognition = new window.SpeechRecognition();

recognition.interimResults = true;
recognition.maxAlternatives = 10;
recognition.continuous = true;

// 设置最多保留的段落数(可根据需求调整)
const MAX_DISPLAY_PARAGRAPHS = 10;

recognition.onresult = (event) => {
    let interimTranscript = '';
    for (let i = event.resultIndex, len = event.results.length; i < len; i++) {
        let transcript = event.results[i][0].transcript;
        const words = transcript.split(" ");
        const filteredWords = words.filter(word => !badWords.includes(word.toLowerCase()));
        const filteredTranscript = filteredWords.join(' ');
      
        if (event.results[i].isFinal) {
            // 新增最终识别的段落
            finalParagraphs.push(filteredTranscript);
            // 超过上限时删除最早的段落
            if (finalParagraphs.length > MAX_DISPLAY_PARAGRAPHS) {
                finalParagraphs.shift();
            }
        } else {
            interimTranscript = filteredTranscript;
        }
    }

    const container = document.getElementById('container');
    // 渲染所有保留的段落 + 临时识别文本
    let renderHtml = finalParagraphs.map(text => `<p>${text}</p>`).join('');
    if (interimTranscript) {
        renderHtml += `<p><i style="color:#FFFFFF;">${interimTranscript}</i></p>`;
    }
    container.innerHTML = renderHtml;
    // 自动滚动到底部
    container.scrollTop = container.scrollHeight;
}
recognition.start();

修改后的HTML代码

<body style="background-color: #000000;">
    <div style="height: 600px;
                font-size: 100px;
                color: white;
                overflow-y: hidden;
                padding: 10px;"
         id="container">
    </div>
</body>

方案2:根据容器高度动态删除内容

如果需要更灵活的适配(比如不同字体大小或容器高度),可以通过计算容器可视高度与内容总高度的差值,自动删除顶部溢出的内容:

在方案1的基础上,替换段落数量限制的逻辑,改为以下代码:

recognition.onresult = (event) => {
    // ...(保留原有的识别、过滤逻辑)

    const container = document.getElementById('container');
    let renderHtml = finalParagraphs.map(text => `<p>${text}</p>`).join('');
    if (interimTranscript) {
        renderHtml += `<p><i style="color:#FFFFFF;">${interimTranscript}</i></p>`;
    }
    container.innerHTML = renderHtml;

    // 动态删除顶部内容,直到总高度不超过容器可视高度
    while (container.scrollHeight > container.clientHeight) {
        if (container.firstChild) {
            container.removeChild(container.firstChild);
            finalParagraphs.shift();
        } else {
            break;
        }
    }
    container.scrollTop = container.scrollHeight;
}

方案优势

  • 避免了原方案中字符串无限累加导致的DOM节点过载,内存占用更稳定;
  • 独立段落元素便于精准管理,删除旧内容时直接移除对应节点,性能损耗低;
  • 两种方案可根据场景选择:固定段落数适合需求明确的场景,动态高度适配适合多变的显示环境。

内容的提问来源于stack exchange,提问作者Bryan Dellinger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:50:37