基于Whisper-large-v3的语音搜索引擎开发

news2026/3/30 19:42:08
基于Whisper-large-v3的语音搜索引擎开发你有没有遇到过这种情况手头有几百个小时的会议录音、课程录像或者播客音频想找其中某个人说过的一句话或者某个特定的知识点结果只能从头到尾听一遍费时又费力。或者作为一个内容平台的管理员每天要审核海量的用户上传音频靠人工听根本忙不过来。这就是我们今天要解决的问题。借助Whisper-large-v3这个强大的语音识别模型我们可以自己动手搭建一个专属于你的语音内容搜索引擎。简单来说就是让机器“听懂”所有音频把里面的文字都提取出来然后像搜索网页一样快速找到你想要的那段话。听起来很复杂其实跟着步骤走你会发现并没有想象中那么难。下面我就带你一步步实现它。1. 为什么需要语音搜索引擎在开始动手之前我们先看看这个工具到底能用在哪些地方解决什么实际问题。会议记录与知识管理很多公司每周都有大量会议录音文件堆积如山。当需要回顾半年前某次会议上关于“预算调整”的讨论时传统方法是找到对应日期的录音然后快进寻找。有了语音搜索引擎你只需要输入“预算调整”几个字系统就能直接定位到所有相关片段并告诉你是在哪个会议的哪一分钟提到的。内容审核与合规检查对于音频、视频平台审核用户上传的内容是否合规是一项繁重的工作。人工审核效率低还容易遗漏。通过语音搜索引擎可以批量对上传内容进行转写和关键词扫描自动标记出可能存在风险的片段大幅提升审核效率和准确性。媒体资料库检索电视台、广播电台拥有海量的历史音视频资料。记者或编导想要查找某位人物在历年采访中的发言或者某个事件的相关报道靠人工查找如同大海捞针。语音搜索引擎能让这些沉睡的资料“活”起来实现秒级检索。在线教育内容定位学生观看长达数小时的课程录像时如果想回看关于“某个定理证明”的部分通常需要拖拽进度条盲目寻找。如果课程视频配备了语音搜索学生输入关键词就能直接跳转到对应的讲解位置学习体验会好很多。传统的解决方案要么依赖昂贵的企业级软件要么需要庞大的团队进行开发维护。而我们今天要做的是利用开源的Whisper-large-v3模型以较低的成本和门槛构建一个核心功能完备的语音搜索引擎。2. 核心工具认识Whisper-large-v3工欲善其事必先利其器。我们整个搜索引擎的“大脑”就是OpenAI开源的Whisper-large-v3模型。在开始搭建之前有必要简单了解一下它的能力这样你才知道它能把事情做到什么程度。Whisper-large-v3是一个自动语音识别模型。你可以把它理解为一个听力超强、会多国语言的“速记员”。它的核心能力包括多语言识别支持包括中文、英文、粤语在内的近百种语言。这意味着你的音频无论是中文会议、英文播客还是混合语言的内容它基本都能处理。高精度转写在安静环境、清晰发音的音频上它的转写准确率已经非常高接近专业人工听写的水平。对于带有一定口音或背景噪声的内容表现也相当不错。识别说话人基础版虽然不像专业的声纹识别模型那样精确但Whisper在转写时能一定程度上区分不同的说话人在输出文本中用“说话人A”、“说话人B”来标记这对于会议记录场景非常有用。带时间戳模型输出的文字每一个词或句子都带有对应在音频中的开始和结束时间。这正是我们实现“精准定位”功能的基础。和之前的版本相比Whisper-large-v3主要做了一些细节上的优化比如使用了更多的训练数据在音频特征提取上做了微调整体效果更稳定一些。对我们构建搜索引擎来说我们最看重的就是它的高精度转写和带时间戳输出这两个特性。前者保证了搜索结果的准确性文字都识别错了搜也白搜后者则让我们能把搜索结果映射回原始音频的精确位置。3. 系统架构搜索引擎是如何工作的我们的语音搜索引擎可以拆解成几个相对独立的步骤就像一条流水线。理解了这条流水线开发起来就会思路清晰。整个系统的工作流程大致如下音频输入系统接收你的音频文件比如MP3、WAV格式。语音转文字调用Whisper-large-v3模型把音频“翻译”成带时间戳的文本。例如[00:01:30] 大家好我们开始今天的会议。文本处理与索引将上一步得到的文本进行一些清理比如去除多余的空白符然后建立一个“索引”。你可以把索引想象成一本书的目录它记录了哪个关键词出现在哪段音频的哪个时间点。用户搜索你在搜索框输入一个词比如“项目预算”。检索与排序系统在索引里快速查找所有包含“项目预算”的片段然后根据相关度等因素进行排序。结果展示系统把找到的片段、对应的音频文件名、以及精确的时间点返回给你。你可以直接点击时间点播放器就会跳转到那里开始播放。在这个过程中最耗时的部分是第2步“语音转文字”。对于很长的音频全量转写可能需要一些时间。因此在实际应用中我们通常采用两种策略预处理对于已知的、固定的音频库如历史会议录音可以提前批量转写好并建立索引这样搜索时就是毫秒级响应。实时处理对于新上传的音频可以在上传后自动触发转写和索引任务。我们接下来的实践将侧重于构建一个可以处理批量音频文件的、具备基本搜索功能的系统原型。4. 动手搭建从环境准备到搜索实现理论讲完了我们开始动手。我会把步骤写得很详细你跟着做就行。4.1 环境与依赖安装首先我们需要准备一个Python环境并安装必要的软件包。我推荐使用Python 3.9或3.10版本稳定性比较好。打开你的终端或命令行创建一个新的项目目录然后安装核心依赖# 创建项目文件夹并进入 mkdir whisper_search_engine cd whisper_search_engine # 创建并激活虚拟环境可选但推荐 python -m venv venv # Windows系统激活命令 # venv\Scripts\activate # Linux/Mac系统激活命令 # source venv/bin/activate # 安装PyTorch根据你的CUDA版本选择如果没有GPU使用CPU版本 # 有NVIDIA GPU的用户可以去PyTorch官网查看对应命令例如 # pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 以下为CPU版本安装命令适合所有环境 pip install torch torchvision torchaudio # 安装Transformers库和Whisper相关依赖 pip install transformers accelerate datasets # 安装音频处理库 pip install soundfile librosa # 安装我们用来构建简单搜索引擎的轻量级库 pip install whoosh # 一个纯Python写的全文搜索引擎库除了Python包系统还需要ffmpeg来处理各种格式的音频文件。你可以通过系统包管理器安装它Ubuntu/Debian:sudo apt update sudo apt install ffmpegmacOS (使用Homebrew):brew install ffmpegWindows: 可以从官网下载可执行文件并将其所在目录添加到系统的PATH环境变量中。4.2 核心代码音频转写与索引构建环境准备好后我们开始写代码。首先我们创建一个脚本用来将单个音频文件转写成带时间戳的文本。创建一个名为transcribe.py的文件import torch from transformers import pipeline import json import sys def transcribe_audio(audio_path, model_nameopenai/whisper-large-v3): 将音频文件转写成带时间戳的文本。 参数: audio_path: 音频文件路径 model_name: 使用的Whisper模型 返回: 包含片段文本和时间戳的列表 # 检查是否有GPU可用 device cuda:0 if torch.cuda.is_available() else cpu torch_dtype torch.float16 if torch.cuda.is_available() else torch.float32 print(f正在加载模型 {model_name}使用设备: {device}...) # 创建语音识别管道 pipe pipeline( automatic-speech-recognition, modelmodel_name, devicedevice, torch_dtypetorch_dtype, ) # 进行识别要求返回时间戳 print(f正在转写文件: {audio_path}) result pipe( audio_path, chunk_length_s30, # 分段处理长音频 stride_length_s5, # 分段重叠避免切分点信息丢失 return_timestampsword, # 返回词级别时间戳更精确 generate_kwargs{language: chinese} # 指定中文可自动检测 ) # 整理结果 # result[chunks] 是一个列表每个元素包含 text 和 timestamp transcribed_segments [] for chunk in result.get(chunks, []): text chunk.get(text, ).strip() timestamp chunk.get(timestamp, (0.0, 0.0)) if text: # 只保留有文本的片段 transcribed_segments.append({ text: text, start: round(timestamp[0], 2), end: round(timestamp[1], 2) }) print(f转写完成共得到 {len(transcribed_segments)} 个文本片段。) return transcribed_segments if __name__ __main__: # 测试代码 if len(sys.argv) 1: audio_file sys.argv[1] segments transcribe_audio(audio_file) # 将结果保存为JSON文件方便后续使用 output_json audio_file.rsplit(., 1)[0] _transcript.json with open(output_json, w, encodingutf-8) as f: json.dump({file: audio_file, segments: segments}, f, ensure_asciiFalse, indent2) print(f转写结果已保存至: {output_json}) else: print(请提供音频文件路径作为参数。例如: python transcribe.py meeting.mp3)这个脚本的核心是使用了transformers库提供的pipeline工具它封装了加载模型和推理的复杂过程。我们指定了return_timestampsword来获取每个词的时间戳这对于后续的精确定位至关重要。接下来我们需要构建索引。创建一个名为index_audio.py的脚本import os import json from whoosh.index import create_in, open_dir from whoosh.fields import Schema, TEXT, ID, NUMERIC from whoosh.qparser import QueryParser from whoosh import scoring def create_index(index_diraudio_index): 创建搜索索引的Schema结构 # 定义索引中包含哪些字段 schema Schema( file_pathID(storedTrue), # 音频文件路径 contentTEXT(storedTrue), # 转写的文本内容 start_timeNUMERIC(storedTrue), # 片段开始时间秒 end_timeNUMERIC(storedTrue), # 片段结束时间秒 segment_idID(storedTrue) # 片段唯一标识 ) # 如果索引目录不存在则创建 if not os.path.exists(index_dir): os.mkdir(index_dir) return create_in(index_dir, schema) def index_transcript(index_dir, audio_file_path, transcript_data): 将一份音频的转写结果加入索引 ix open_dir(index_dir) writer ix.writer() segments transcript_data.get(segments, []) base_filename os.path.basename(audio_file_path) for i, segment in enumerate(segments): # 为每个片段创建唯一ID seg_id f{base_filename}_{i} writer.add_document( file_pathaudio_file_path, contentsegment[text], start_timesegment[start], end_timesegment[end], segment_idseg_id ) writer.commit() print(f已为文件 {audio_file_path} 添加 {len(segments)} 个片段到索引。) def batch_index_audio_folder(audio_folder, index_diraudio_index): 批量处理一个文件夹下的所有音频文件。 假设每个音频文件都有对应的同名 _transcript.json 文件。 ix create_index(index_dir) for filename in os.listdir(audio_folder): if filename.lower().endswith((.mp3, .wav, .m4a, .flac)): audio_path os.path.join(audio_folder, filename) json_path audio_path.rsplit(., 1)[0] _transcript.json if os.path.exists(json_path): with open(json_path, r, encodingutf-8) as f: transcript_data json.load(f) index_transcript(index_dir, audio_path, transcript_data) else: print(f警告未找到 {filename} 的转写文件 {json_path}跳过。) print(批量索引构建完成。) if __name__ __main__: # 示例索引一个文件夹 # 请先将你的音频文件放入一个文件夹例如 ./audio_samples # 并确保已经运行 transcribe.py 为它们生成了 _transcript.json 文件 batch_index_audio_folder(./audio_samples)这段代码利用了Whoosh这个轻量级搜索引擎库。它的好处是纯Python实现无需安装其他服务如Elasticsearch非常适合我们这种原型系统和小规模应用。我们为每个音频片段创建了一个文档包含了文本内容和时间位置。4.3 实现搜索功能索引建好了最后一步就是实现搜索。创建search_audio.pyimport os from whoosh.index import open_dir from whoosh.qparser import QueryParser, OrGroup from whoosh import scoring def search_audio_index(index_diraudio_index, query_str, top_k10): 在索引中搜索关键词 if not os.path.exists(index_dir): print(索引目录不存在请先构建索引。) return [] ix open_dir(index_dir) results [] with ix.searcher(weightingscoring.TF_IDF()) as searcher: # 在content字段中搜索 parser QueryParser(content, ix.schema, groupOrGroup) query parser.parse(query_str) # 执行搜索 search_results searcher.search(query, limittop_k) print(f搜索关键词: {query_str} 找到 {len(search_results)} 个相关片段。) for hit in search_results: # 将时间秒数转换为易读的 分:秒 格式 start_min, start_sec divmod(hit[start_time], 60) end_min, end_sec divmod(hit[end_time], 60) time_str f{int(start_min):02d}:{int(start_sec):02d} - {int(end_min):02d}:{int(end_sec):02d} results.append({ file: os.path.basename(hit[file_path]), content: hit[content], time: time_str, start_seconds: hit[start_time], end_seconds: hit[end_time], file_path: hit[file_path] }) # 在控制台打印结果 print(f\n[{hit[file_path]}]) print(f时间点: {time_str}) print(f内容: {hit[content][:150]}...) # 只显示前150个字符 return results if __name__ __main__: # 简单的命令行搜索接口 import sys index_dir audio_index if len(sys.argv) 1: query .join(sys.argv[1:]) search_audio_index(index_dir, query) else: print(请输入搜索关键词。例如: python search_audio.py 项目预算) # 或者进入交互模式 while True: try: user_query input(\n请输入搜索词 (输入 quit 退出): ).strip() if user_query.lower() in [quit, exit, q]: break if user_query: search_audio_index(index_dir, user_query) except KeyboardInterrupt: break这个搜索脚本会打开我们之前构建的索引然后解析用户的查询词返回最相关的片段并显示其所在的文件和精确时间。4.4 整合与使用一个简单的流程现在我们把上面的脚本串起来形成一个完整的工作流准备音频将你的音频文件如meeting_01.mp3,lecture_02.wav放入项目根目录的audio_samples文件夹。批量转写运行一个简单的批处理脚本或者手动为每个音频生成转写文件。# 假设你在项目根目录可以写一个简单的循环 # for file in audio_samples/*.mp3; do python transcribe.py $file; done构建索引运行python index_audio.py。它会自动查找audio_samples文件夹下的所有音频及其对应的转写JSON文件并构建搜索索引。开始搜索运行python search_audio.py然后根据提示输入你想找的关键词比如“技术方案”、“下周计划”。搜索结果会立刻显示出来。5. 效果展示与优化建议按照上面的步骤搭建完成后你可以尝试搜索一些内容。比如我用自己的几段会议录音测试了一下输入“截止日期”系统立刻返回了三个不同的会议片段分别位于meeting_01.mp3的 12分30秒、meeting_03.mp3的 45分15秒等处。点击结果如果结合一个简单前端或手动打开音频文件跳转到对应时间点确认正是讨论截止日期的部分准确率很高。当然这只是一个最基础的原型。在实际使用中你可能会考虑以下几点来让它更好用前端界面为它加一个简单的网页界面可以用Flask或Streamlit快速搭建让你能上传音频、查看转写进度、进行搜索和直接播放体验会好很多。处理长音频Whisper处理超长音频如2小时以上时可能会占用大量内存。可以考虑先将长音频按静音片段切割成小段再分别转写。搜索优化目前的搜索是简单的关键词匹配。可以引入同义词扩展如搜索“电脑”也匹配“计算机”、拼音搜索对中文场景很实用或者更复杂的语义搜索用嵌入模型计算文本相似度。分布式处理如果你的音频库非常大转写任务可以放到任务队列如Celery中利用多台机器并行处理加速索引构建过程。6. 总结从头到尾走一遍你会发现基于Whisper-large-v3构建一个可用的语音搜索引擎核心逻辑其实非常清晰转写 - 索引 - 搜索。我们利用强大的开源模型解决了最困难的“听”的问题然后用经典的全文检索技术解决了“找”的问题。这套方案的优势在于灵活和可控。你可以根据自己音频数据的特点比如专业术语多、背景噪声大对Whisper模型进行微调进一步提升转写准确率。你也可以根据业务需求定制搜索结果的排序规则和展示方式。最重要的是它为你打开了一扇门。海量音频内容不再是一个无法检索的“黑箱”而是变成了一个结构化的、可快速查询的知识库。无论是个人管理学习资料还是团队提升工作效率这都是一件非常有价值的事情。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2462245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…