⚡ SenseVoice-Small ONNX实战:企业内训录音→知识图谱三元组自动构建
SenseVoice-Small ONNX实战企业内训录音→知识图谱三元组自动构建1. 引言从录音到知识的自动化之路想象一下这个场景公司每周都有好几场内部培训讲师讲得口干舌燥员工听得昏昏欲睡。会后培训录音被丢进共享盘从此无人问津。宝贵的经验、关键的业务流程、创新的想法全都锁在了那一小时又一小时的音频文件里。这就是很多企业知识管理的现状——数据很多但知识很少。今天我要分享一个能彻底改变这种状况的实战方案。我们利用一个轻量级的本地语音识别工具把那些沉睡的录音唤醒然后通过简单的文本处理自动提取出结构化的知识——也就是知识图谱的三元组主体、关系、客体。整个过程完全自动化不需要昂贵的云服务不涉及数据外传一台普通的办公电脑就能跑起来。你只需要上传录音文件点击几下就能得到一份可以直接导入知识库的结构化数据。这篇文章我会手把手带你走通整个流程。从语音识别工具的快速部署到文本处理的代码编写再到最终三元组的生成和可视化。即使你之前没接触过语音识别或知识图谱也能跟着做出来。2. 核心工具SenseVoice-Small ONNX 语音识别工欲善其事必先利其器。我们整个流程的起点是一个高效、轻量且完全本地运行的语音识别工具。2.1 为什么选择它在开始动手之前我们先看看这个工具解决了哪些痛点资源占用极低它采用了Int8量化技术简单说就是把模型“压缩”了。相比原来的版本内存和显存占用能降低75%左右。这意味着你不需要专业的GPU服务器用普通的办公电脑甚至笔记本电脑就能流畅运行。开箱即用它支持WAV、MP3、M4A这些常见的音频格式。你不需要事先用其他软件转换格式直接上传就能识别。结果“能看”很多语音识别工具出来的是一大段没有标点的文字读起来非常费劲。这个工具内置了标点恢复功能会自动给识别结果加上句号、逗号让文本更通顺。完全本地运行所有处理都在你自己的电脑上完成录音内容不会上传到任何人的服务器对于处理企业内部敏感的培训录音来说这一点至关重要。智能文本规整它还能做“逆文本正则化”。比如语音里说的“一百二十三点五”它会自动转换成“123.5”说的“二零二四年”会转换成“2024年”。这为我们后续的文本分析省了不少事。2.2 快速部署与启动部署过程非常简单几乎就是“复制粘贴”几条命令。首先确保你的电脑已经安装了Python建议3.8以上版本。然后打开命令行终端依次执行下面的命令# 1. 下载这个语音识别工具的项目代码 git clone https://github.com/your-repo/SenseVoice-ONNX-Tool.git cd SenseVoice-ONNX-Tool # 2. 安装项目需要的所有Python库 pip install -r requirements.txt # 3. 启动工具 streamlit run app.py执行完最后一条命令你的终端里会显示一个本地网络地址通常是http://localhost:8501。用浏览器打开这个地址你就能看到工具的界面了。界面非常简洁主要就是一个文件上传按钮和一个“开始识别”按钮。到这里语音识别的环境就准备好了。2.3 基本使用把录音变成文字使用起来只有三步上传音频在网页界面上点击“上传音频文件”按钮选择你的企业培训录音文件比如sales_training_20240520.mp3。开始识别点击“开始识别”按钮。界面会显示“正在推理...”后台的模型就开始工作了。获取结果识别完成后界面会提示“完成”并在一个文本框里展示带标点的完整识别文本。你可以直接全选、复制这段文字。至此我们已经完成了从“声音”到“文字”的关键一步。接下来我们要对这些文字进行加工从中提炼出结构化的知识。3. 实战流程从识别文本到知识三元组拿到大段的培训文字稿后我们的目标是提取出像“张三 擅长 Python编程”、“项目A 使用了 敏捷开发方法”这样的结构化三元组。整个处理流程是一个清晰的管道如下图所示graph TD A[原始培训录音文件] -- B[SenseVoice-Small ONNX工具] B -- C[带标点的识别文本] C -- D[文本预处理模块] D -- E[关键实体识别与分类] E -- F[关系短语提取] F -- G[三元组组装与过滤] G -- H[结构化知识三元组列表]下面我们来拆解并实现流程中的每一个环节。3.1 第一步文本预处理模型识别出的文本虽然有了标点但可能包含一些多余的空格、换行或者一些口语化的赘词比如“嗯”、“啊”、“这个那个”。我们需要先清洗一下。import re def preprocess_text(text): 清洗和预处理识别文本。 # 1. 合并多余的空白字符空格、换行、制表符等 text re.sub(r\s, , text).strip() # 2. 简单过滤一些常见的口语填充词可根据实际情况扩充列表 filler_words [嗯, 啊, 呃, 这个, 那个, 然后] for word in filler_words: # 注意在词语前后加上空格避免误伤单词中的部分 pattern r\s re.escape(word) r\s text re.sub(pattern, , text) # 3. 再次合并可能因删除填充词而产生的多余空格 text re.sub(r\s, , text).strip() return text # 示例清洗一段识别文本 raw_text 嗯 大家好 啊 今天我们这个 培训的主要内容 是Python数据分析 然后 会用到pandas库 cleaned_text preprocess_text(raw_text) print(f清洗前: {raw_text}) print(f清洗后: {cleaned_text}) # 输出清洗后: 大家好 今天我们培训的主要内容是Python数据分析 会用到pandas库3.2 第二步关键实体识别与分类这是核心步骤。我们需要从文本中找出哪些是“人”员工、讲师、客户哪些是“物”产品、工具、项目哪些是“概念”方法、技术、流程。我们这里采用一个基于规则和关键词词典的轻量级方法它足够有效且易于理解和调整。def extract_entities(text, entity_dict): 基于词典匹配识别文本中的实体并进行分类。 entity_dict: 字典键为实体类别值为该类别下的关键词或短语列表。 entities [] words text.split() # 为了匹配多词实体我们采用一个滑动窗口检查从最大长度到1个词的短语 max_phrase_len max(len(phrase.split()) for category in entity_dict for phrase in entity_dict[category]) i 0 while i len(words): matched False # 从长到短尝试匹配 for length in range(min(max_phrase_len, len(words) - i), 0, -1): phrase .join(words[i:ilength]) for category, keywords in entity_dict.items(): if phrase in keywords: entities.append({ text: phrase, type: category, start: i, end: i length - 1 }) i length # 跳过已匹配的词 matched True break if matched: break if not matched: i 1 # 未匹配到移动一个词 return entities # 定义我们的实体词典这是需要根据你的业务领域来维护和丰富的核心部分 my_entity_dict { 人员: [张三, 李四, 王工程师, 销售团队, 开发组], 技术: [Python, pandas, NumPy, 机器学习, Docker, Kubernetes], 产品: [产品A, 云服务平台, 移动端APP], 方法: [敏捷开发, Scrum, 代码评审, 单元测试], 部门: [研发部, 市场部, 运维部], } # 示例从一段文本中提取实体 sample_text 李四在研发部介绍了Python和pandas在数据分析中的应用并推荐了敏捷开发方法。 identified_entities extract_entities(sample_text, my_entity_dict) print(识别出的实体) for ent in identified_entities: print(f - 文本{ent[text]} 类型{ent[type]})3.3 第三步关系短语提取实体找到了我们还需要找到它们之间是通过什么“关系”连接起来的。例如“介绍”、“推荐”、“使用”、“负责”等。我们可以通过分析实体之间的依存句法关系来实现但这需要更复杂的NLP模型。为了保持轻量化和可解释性我们这里使用一个更简单的方法寻找连接两个实体的“关系动词”或“模式”。import jieba.posseg as pseg # 用于中文词性标注 def find_relations_between_entities(text, entities): 一个简化的关系发现函数。 寻找连接两个实体的动词并将其作为候选关系。 这是一个启发式方法在实际应用中可能需要更复杂的规则或模型。 # 对文本进行分词和词性标注 words_with_pos pseg.cut(text) words [] pos_tags [] for word, flag in words_with_pos: words.append(word) pos_tags.append(flag) relations [] # 遍历所有实体对 for i in range(len(entities)): for j in range(i1, len(entities)): ent_a entities[i] ent_b entities[j] # 找出两个实体在文本中的中间部分 start min(ent_a[end], ent_b[end]) 1 end max(ent_a[start], ent_b[start]) if start end: # 确保实体之间确实有词语 middle_words words[start:end] middle_pos pos_tags[start:end] # 寻找中间的动词作为关系词 relation_verbs [] for idx, (w, pos) in enumerate(zip(middle_words, middle_pos)): if pos.startswith(v): # 词性以v开头很可能是动词 relation_verbs.append(w) if relation_verbs: # 取第一个动词作为关系或进行组合 relation .join(relation_verbs) relations.append({ source: ent_a[text], target: ent_b[text], relation: relation, source_type: ent_a[type], target_type: ent_b[type] }) return relations # 注意此函数需要安装jieba库 pip install jieba # 示例寻找实体间关系 sample_text 李四在研发部介绍了Python和pandas在数据分析中的应用。 entities extract_entities(sample_text, my_entity_dict) # 复用之前的函数 candidate_relations find_relations_between_entities(sample_text, entities) print(\n发现的候选关系) for rel in candidate_relations: print(f - {rel[source]} ({rel[source_type]}) --[{rel[relation]}]-- {rel[target]} ({rel[target_type]}))3.4 第四步三元组组装与过滤现在我们有了实体和候选关系可以把它们组装成主体关系客体的三元组了。同时我们需要过滤掉一些质量不高或重复的三元组。def build_and_filter_triples(relations, min_relation_length1): 将关系列表组装成三元组并进行简单过滤。 min_relation_length: 关系词的最小长度用于过滤掉太短、无意义的关系。 triples [] seen set() # 用于去重 for rel in relations: # 过滤条件1关系词不能太短或无意义 if len(rel[relation]) min_relation_length: continue # 过滤条件2主体和客体不能相同 if rel[source] rel[target]: continue # 组装三元组 triple (rel[source], rel[relation], rel[target]) triple_str str(triple) # 去重 if triple_str not in seen: seen.add(triple_str) triples.append({ triple: triple, source_type: rel[source_type], target_type: rel[target_type] }) return triples # 示例组装并过滤三元组 final_triples build_and_filter_triples(candidate_relations, min_relation_length1) print(\n最终生成的知识三元组) for item in final_triples: s, r, o item[triple] print(f - ({s}, {r}, {o}))4. 完整案例处理一段真实的培训录音让我们把上面的所有步骤串起来模拟处理一段虚构但很真实的技术分享录音。假设的录音文本经语音识别后“大家好我是后端组的王工程师。今天分享的主题是微服务架构下的容器化部署。我们目前主要使用Docker来打包应用用Kubernetes做编排。运维部的李四负责搭建和维护这套K8s集群。实践表明这套方案能大幅提升研发部的部署效率。”# 完整流程代码示例 def full_pipeline(audio_file_path): 从音频文件到知识三元组的完整管道。 注意这里省略了实际的语音识别调用假设我们已经得到了文本。 # 1. 语音识别 (此处模拟结果) # recognized_text sensevoice_recognize(audio_file_path) # 实际调用 recognized_text “大家好我是后端组的王工程师。今天分享的主题是微服务架构下的容器化部署。我们目前主要使用Docker来打包应用用Kubernetes做编排。运维部的李四负责搭建和维护这套K8s集群。实践表明这套方案能大幅提升研发部的部署效率。” # 2. 文本预处理 cleaned_text preprocess_text(recognized_text) print(f【清洗后文本】\n{cleaned_text}\n) # 3. 实体识别 (使用扩充的词典) expanded_entity_dict { **my_entity_dict, # 包含之前定义的 人员: my_entity_dict[人员] [王工程师], 技术: my_entity_dict[技术] [Docker, Kubernetes, K8s, 微服务架构, 容器化部署], 部门: my_entity_dict[部门] [后端组], 抽象概念: [部署效率, 方案] } entities extract_entities(cleaned_text, expanded_entity_dict) print(f【识别出的实体】) for ent in entities: print(f - {ent[text]} - {ent[type]}) # 4. 关系提取 relations find_relations_between_entities(cleaned_text, entities) print(f\n【发现的候选关系】) for rel in relations: print(f - {rel[source]} --[{rel[relation]}]-- {rel[target]}) # 5. 三元组构建与过滤 triples build_and_filter_triples(relations, min_relation_length1) print(f\n【最终知识三元组】) for item in triples: s, r, o item[triple] print(f - ({s}, {r}, {o})) return triples # 运行完整流程 generated_triples full_pipeline(fake_audio.mp3)运行上述代码我们可能会得到类似以下的三元组输出(王工程师 是 后端组)(主题 是 微服务架构下的容器化部署)(我们 使用 Docker)(Docker 来打包 应用)(我们 用 Kubernetes)(Kubernetes 做 编排)(李四 负责 K8s集群)(方案 提升 部署效率)这些三元组已经具备了初步的结构化特征可以直接用于丰富企业的知识图谱或者导入到CRM、项目管理等系统中。5. 总结与展望通过这个实战项目我们完成了一个从非结构化的企业培训录音到结构化知识三元组的自动化构建流程。我们来回顾一下关键收获核心价值知识显性化将隐藏在音频中的经验、流程、职责关系变成了可查询、可分析的结构化数据。流程自动化只需上传音频后续的识别、清洗、提取、生成全部自动完成极大提升了知识沉淀的效率。成本可控全程使用本地化、轻量级的开源工具和代码避免了高昂的云API调用费用和数据隐私风险。灵活可扩展整个流程的每个模块如实体词典、关系规则都可以根据你公司的具体业务进行定制和优化。下一步可以做什么丰富实体词典根据你所在行业的术语、公司内部的项目名、产品名、岗位名称不断扩充和细化entity_dict。这是提升提取准确率最有效的方法。优化关系提取可以尝试集成更专业的开源NLP工具如LTP、HanLP来进行更准确的句法分析从而提取更精准的关系。增加后处理对提取出的三元组进行置信度打分、冲突检测如“张三负责A项目”和“李四负责A项目”是否矛盾、以及与现有知识图谱的融合。构建可视化界面将整个流程用Streamlit或Gradio包装成一个有上传、处理、图谱展示完整功能的小型应用提供给非技术同事使用。技术的意义在于解决实际问题。希望这个将SenseVoice-Small ONNX语音识别与轻量级文本处理相结合的思路能为你打开一扇门让你公司那些沉默的录音资料真正转变为驱动业务发展的知识资产。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。