当前位置: 首页 > article >正文

Web Speech API 实现语音识别

场景很简单就是当用户长按按钮说话之后可以将识别到的语音转为文字效果图如下长按转换文字断句动态拼接分隔符识别的文字由浮层展示光标在哪语音插入到哪支持中途编辑清除文本和复制文本长按按钮有动画效果需要解决的核心问题recognition.start() 不是立即开始录音用户如果刚按下按钮就开始说话很可能语音没有被录到因此需要做一个延迟的处理。result.isFinal 这个方法只有在断句之前才进行一次拼接就会给用户延迟显示文本的情况我们需要 “边说边出字”一起来看完整代码template div classvoice-wrapper div classinput-container textarea reftextareaRef v-modeldisplayText classresult-box placeholder语音识别内容会显示在这里可直接编辑/textarea tiny-icon-copy v-if!copied classinput-icon copy-icon clickhandleCopy / tiny-icon-yes v-else classinput-icon copy-icon / tiny-icon-clear v-if!deleted classinput-icon clear-icon clickhandleClear / tiny-icon-yes v-else classinput-icon clear-icon / /div div classbtn-container div v-iftempText classfloat-temp-text {{ tempText }} /div button idrecordBtn :class{ recording: isRecording } mousedownstartRecord touchstart.preventstartRecord mouseup.stopstopRecord touchend.stopstopRecord tiny-icon-mic classmic-icon / /button /div /div /template script setup import { ref, nextTick, onMounted } from vue import { IconMic, IconCopySolid, IconRichTextDeleteTable, IconYes } from opentiny/vue-icon const TinyIconMic IconMic() const TinyIconYes IconYes() const TinyIconCopy IconCopySolid() const TinyIconClear IconRichTextDeleteTable() const textareaRef ref(null) const isRecording ref(false) const isPressing ref(false) const displayText ref() const tempText ref() const copied ref(false) const deleted ref(false) let copyTimer null let deleteTimer null let lastProcessedIndex 0 const Recognition window.SpeechRecognition || window.webkitSpeechRecognition const recognition new Recognition() recognition.lang zh-CN recognition.continuous true recognition.interimResults true recognition.onresult (e) { let finalChunk let interimChunk for (let i lastProcessedIndex; i e.results.length; i) { const result e.results[i] if (!result.isFinal) continue const transcript result[0].transcript.trim() if (!transcript) continue finalChunk transcript lastProcessedIndex i 1 } const lastResult e.results[e.results.length - 1] if (lastResult !lastResult.isFinal) { interimChunk lastResult[0].transcript.trim() } if (finalChunk) { tempText.value insertAtCursor(finalChunk) } tempText.value interimChunk } recognition.onaudiostart () { if (isPressing.value) isRecording.value true else recognition.stop() } recognition.onend () { if (isPressing.value) setTimeout(() safeStart(), 50) } function insertAtCursor(text) { const el textareaRef.value if (!el) return const start el.selectionStart const end el.selectionEnd const val displayText.value const before val.substring(0, start) const after val.substring(end) const isNewParagraph start 0 const lastChar before.slice(-1) const isAlreadyPunctuation /[。、]/g.test(lastChar) const needComma before !isNewParagraph !isAlreadyPunctuation const insert needComma ? text : text displayText.value before insert after nextTick(() { const newPos start insert.length el.setSelectionRange(newPos, newPos) }) } function safeStart() { try { recognition.start() } catch {} } function startRecord(e) { e?.preventDefault() if (isPressing.value) return lastProcessedIndex 0 isPressing.value true safeStart() } function stopRecord() { isPressing.value false if (isRecording.value) { recognition.stop() isRecording.value false setTimeout(() tempText.value , 400) } } const handleCopy async () { try { await navigator.clipboard.writeText(displayText.value) copied.value true clearTimeout(copyTimer) copyTimer setTimeout(() copied.value false, 2000) } catch {} } function handleClear() { deleted.value true clearTimeout(deleteTimer) deleteTimer setTimeout(() deleted.value false, 2000) displayText.value } onMounted(() { try { recognition.start(); recognition.stop() } catch {} }) /script style scoped .voice-wrapper { position: fixed; top: 0; left: 0; right: 0; bottom: 0; display: flex; flex-direction: column; background: #fff; box-sizing: border-box; } .input-container { position: relative; flex: 1; padding: 15px; display: flex; flex-direction: column; min-height: 0; } .result-box { flex: 1; width: 100%; padding: 12px; font-size: 16px; line-height: 1.6; border: 1px solid #eee; border-radius: 8px; resize: none; outline: none; box-sizing: border-box; overflow-y: auto; } .btn-container { position: relative; padding: 20px 0; display: flex; justify-content: center; align-items: center; border-top: 1px solid #f5f5f5; background: #fff; } .float-temp-text { position: absolute; bottom: 100px; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.6); color: #fff; padding: 6px 12px; border-radius: 6px; font-size: 14px; white-space: nowrap; pointer-events: none; z-index: 10; max-width: 80%; overflow: hidden; text-overflow: ellipsis; } #recordBtn { position: relative; width: 68px; height: 68px; background: #42b983; border: none; border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer; user-select: none; } #recordBtn.recording { background: #2f9e6e; transform: scale(1.08); box-shadow: 0 0 0 6px rgba(66, 185, 131, 0.25); } #recordBtn.recording::after { content: ; position: absolute; inset: 0; border-radius: 50%; background: rgba(66, 185, 131, 0.35); animation: pulse 1.5s infinite; } keyframes pulse { 0% { transform: scale(1); opacity: 0.6; } 100% { transform: scale(1.6); opacity: 0; } } #recordBtn:active { background: #359469; } .input-icon { position: absolute; font-size: 24px; bottom: 25px; fill: #323233; cursor: pointer; } .copy-icon { right: 60px; } .clear-icon { right: 25px; } .mic-icon { fill: #fff; font-size: 30px; } /style

相关文章:

Web Speech API 实现语音识别

场景很简单,就是当用户长按按钮说话之后,可以将识别到的语音转为文字,效果图如下:长按转换文字,断句动态拼接分隔符识别的文字由浮层展示光标在哪,语音插入到哪支持中途编辑清除文本和复制文本长按按钮有动…...

微信读书的划线,同步到 Notion 只是开始;接上 AI 才算“拥有“

微信读书的划线,同步到 Notion 只是开始;接上 AI 才算"拥有"昨晚我在写一篇东西,想引用一段《打造第二大脑》里关于"CODE 法"的描述。 放在半年前,我会这么干:打开微信读书 → 找到这本书 → 翻目…...

从复古游戏到电子墨水屏:聊聊Floyd-Steinberg抖动算法的那些神奇应用场景

从复古游戏到电子墨水屏:Floyd-Steinberg抖动算法的跨时代魔法 1983年,任天堂红白机设计师面临一个棘手问题:如何在仅支持52色的硬件上呈现《超级马里奥兄弟》中碧蓝的海水与翠绿的管道?答案藏在一项诞生于1976年的图像处理技术中…...

告别base环境自动激活:CentOS7安装Miniconda后必做的几项贴心配置

告别base环境自动激活:CentOS7安装Miniconda后必做的几项贴心配置 当你第一次在CentOS7服务器上成功安装Miniconda后,可能会遇到一个令人困扰的默认行为:每次打开新终端会话时,conda都会自动激活base环境。对于需要通过SSH频繁连接…...

嵌入式老鸟的VSCode私房插件清单:除了C/C++,这些调试和效率工具让你事半功倍

嵌入式开发者的VSCode效率革命:资深工程师的插件配置秘籍 作为一名在嵌入式领域摸爬滚打多年的开发者,我深知效率工具对项目进度的影响。记得有一次在调试STM32的CAN总线通信时,传统IDE的局限性让我不得不频繁切换多个工具,直到发…...

大模型RAG (一)

一、RAG介绍 1、LLM的缺陷 LLM的知识不是实时的,不具备知识更新.LLM可能不知道你私有的领域/业务知识.LLM有时会在回答中生成看似合理但实际上是错误的信息。 2、为什么会用到RAG 减少幻觉(Hallucination):回答基于真实资料&…...

深度剖析:LangGraph中的状态管理与循环逻辑

深度剖析:LangGraph中的状态管理与循环逻辑 副标题:从核心原理到工业级落地,彻底掌握LangChain生态中下一代Agent编排的灵魂 第一部分:引言与基础 (Introduction & Foundation) 1. 引人注目的标题 深度剖析:LangGraph中的状态管理与循环逻辑——从核心原理到工业级…...

微软新 Xbox 负责人阿莎·夏尔马忙不停:Game Pass 定价待调,“螺旋计划”影响几何?

承诺“Xbox 回归”后,负责人忙不停微软新任 Xbox 负责人承诺“Xbox 回归”后,一直忙得不可开交。阿莎夏尔马在 3 月游戏开发者大会上与发行商会面,最近几周走访微软旗下游戏工作室和产品团队。曾在微软 CoreAI 部门工作的她目前处于学习阶段&…...

vivo X300 Ultra长焦套件集市游玩体验佳,小巧轻便成家庭出游必备!

vivo X300 Ultra长焦套件体验:集市游玩拍出惊喜,小巧轻便再游必备!原本我以为 vivo X300 系列只是个博眼球、难促销售的噱头概念。然而,带着这部手机和精心设计、造型奇特的小镜头套件度过一个周末后,我玩得十分尽兴。…...

RAG基本流程

RAG(Retrieval-Augmented Generation,检索增强生成)是一种将外部知识检索与大语言模型(LLM)生成能力相结合的技术,用于提升回答的准确性、减少“幻觉”(Hallucination),并…...

Super Qwen Voice World智能语音助手开发:基于Python的完整项目实战

Super Qwen Voice World智能语音助手开发:基于Python的完整项目实战 1. 引言:语音交互的新时代 你有没有想过,给自己的项目加上一个能听会说的智能语音助手?就像电影里的科幻场景一样,用自然语言和机器对话&#xff…...

如何监控AWR数据收集Job_DBA_SCHEDULER_JOBS中的BSLN_MAINTAIN_STATS

BSLN_MAINTAIN_STATS状态需查DBA_SCHEDULER_JOBS中含%BSLN%MAINTAIN%STATS%的作业,若无结果则可能被禁用或功能未启用;还需确认维护窗口、AWR快照、statistics_level参数及磁盘空间是否正常。查 Job_DBASCHEDULER_JOBS 里 BSLN_MAINTAIN_STATS 的状态这个…...

【Gartner 2024 DevOps趋势验证】:已上线智能代码生成的团队,MTTR缩短61%,但89%未启用变更影响分析——你的流水线安全吗?

第一章:智能代码生成与DevOps流水线整合 2026奇点智能技术大会(https://ml-summit.org) 现代软件交付已从“人工驱动”转向“AI协同驱动”,智能代码生成不再仅限于IDE插件中的单点辅助,而是深度嵌入CI/CD流水线各阶段,实现从需求…...

Py之pycocotools:从COCO数据加载到自定义标注可视化的实战指南

1. 为什么你需要pycocotools 如果你正在做计算机视觉相关的项目,特别是目标检测、实例分割这类任务,那么COCO数据集一定不会陌生。作为计算机视觉领域最常用的基准数据集之一,COCO提供了超过20万张标注图像,包含80个常见物体类别。…...

阿里云国际版防火墙规则:从安全组配置到流量过滤的深度实操

在云计算的生产环境中,“防火墙规则”是保障业务安全的第一道、也是最关键的一道防线。很多开发者在阿里云国际版(Alibaba Cloud International)开通实例后,常会遇到“SSH连不上”、“Web页面打不开”或者“数据库连接超时”等问题…...

2026届最火的十大降AI率方案实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 让AIGC(人工智能生成内容)留下的痕迹得以降低,其关键之处…...

2026奇点智能技术大会核心成果发布(AI文档生成引擎v3.2正式开源)

第一章:2026奇点智能技术大会:AI接口文档生成 2026奇点智能技术大会(https://ml-summit.org) 在2026奇点智能技术大会上,AI驱动的接口文档自动生成技术成为核心议题之一。该技术依托多模态大模型对源码、注释、测试用例及通信日志的联合理解…...

ComfyUI-Impact-Pack终极指南:如何快速掌握AI图像增强与面部细化技术

ComfyUI-Impact-Pack终极指南:如何快速掌握AI图像增强与面部细化技术 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目…...

20天速通LeetCode day07:前缀和

前言 今日练习目的:掌握前缀和思维。前缀和的核心价值是能实现在O(1)时间求区间和,是各类子数组问题的常用工具 560:和为k的子数组 题目要求:给定一个整数数组nums和整数k 要求:统计并返回和为k的子数组 核心思路&…...

给数学恐惧者的图解:用几何直觉理解SVM中的对偶问题与KKT条件

给数学恐惧者的图解:用几何直觉理解SVM中的对偶问题与KKT条件 第一次接触支持向量机(SVM)时,很多人都会被"对偶问题"和"KKT条件"这两个概念吓退。教科书上密密麻麻的数学推导让人望而生畏,仿佛在提…...

Python实战:从零实现Transformer中的多头注意力机制

1. 理解多头注意力机制的核心思想 多头注意力机制是Transformer架构中最关键的组成部分之一,它让模型能够同时关注输入序列的不同位置,并学习到丰富的上下文信息。想象一下你在阅读一篇文章时,大脑会同时关注当前句子、前文提到的关键概念&am…...

Jupyter Notebook代码补全插件安装踩坑实录:从nbextensions不显示到完美解决(Anaconda环境)

Jupyter Notebook代码补全插件安装踩坑实录:从nbextensions不显示到完美解决(Anaconda环境) 在数据科学和机器学习的工作流中,Jupyter Notebook因其交互式特性广受欢迎,而代码补全功能能显著提升开发效率。然而&#x…...

若依WMS仓库管理系统:企业级仓储管理的现代化解决方案

若依WMS仓库管理系统:企业级仓储管理的现代化解决方案 【免费下载链接】RuoYi-WMS-VUE 若依wms是一套基于若依的wms仓库管理系统,支持lodop和网页打印入库单、出库单。包括仓库/库区/货架管理,出入库管理,客户/供应商/承运商&…...

从零搭建思澈科技SiFli-Solution开发环境:避坑指南与实战演练

1. 环境准备:软件工具全家桶 第一次接触思澈科技的SiFli-Solution平台时,我像个刚拿到乐高套装的孩子——既兴奋又手足无措。这里给各位新手列个必备工具清单,都是我踩坑后验证过的稳定组合:Keil uVision5(5.32版&…...

Python实现图形化井字棋——人机对战

井字棋,英文名叫TicQ-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名。游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记&…...

MOPSO算法实战:如何用它搞定你的多目标优化项目?(从理论到调参全解析)

MOPSO算法实战:从理论到调参的全流程指南 想象一下你正面临一个棘手的工程优化问题——需要在云计算资源调度中同时优化成本和性能。传统的单目标优化方法让你不得不在两个相互冲突的目标之间做出妥协,而多目标粒子群优化(MOPSO)…...

5分钟上手LogcatReader:安卓设备日志查看神器

5分钟上手LogcatReader:安卓设备日志查看神器 【免费下载链接】LogcatReader A simple app for viewing logcat logs on an android device. 项目地址: https://gitcode.com/gh_mirrors/lo/LogcatReader 还在为复杂的ADB命令而烦恼吗?LogcatReade…...

【2026奇点智能技术大会权威解码】:AI原生数据结构生成的5大范式跃迁与工程落地路径

第一章:2026奇点智能技术大会:AI数据结构生成 2026奇点智能技术大会(https://ml-summit.org) 核心突破:语义驱动的数据结构合成引擎 本届大会首次公开发布StructGen v3.1——一个基于多模态推理与形式化约束求解的AI数据结构生成框架。它不…...

科学图像分析难题破解:3个步骤让Fiji成为你的得力助手

科学图像分析难题破解:3个步骤让Fiji成为你的得力助手 【免费下载链接】fiji A "batteries-included" distribution of ImageJ :battery: 项目地址: https://gitcode.com/gh_mirrors/fi/fiji 你是否曾经面对显微镜下的大量细胞图像束手无策&#x…...

英雄联盟智能工具箱:重新定义你的游戏体验

英雄联盟智能工具箱:重新定义你的游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在英雄联盟的竞技世界中,每一…...