SenseVoice-Small ONNX实际作品:政务12345热线录音→诉求分类+关键词云图
1. 项目背景与痛点
你有没有想过,每天成千上万通打给政务热线的电话,背后都藏着什么信息?是市民对交通拥堵的抱怨,是对老旧小区改造的期盼,还是对窗口服务态度的投诉?这些海量的语音数据,如果只靠人工去听、去记、去分类,不仅效率低下,还容易遗漏关键信息。
传统的政务热线数据分析,往往面临几个头疼的问题:
- 信息处理慢:录音转文字依赖人工或昂贵的商用服务,周期长,成本高。
- 诉求归类难:面对五花八门的市民诉求,人工分类标准不一,难以形成统一的分析视角。
- 洞察挖掘浅:文字记录堆积如山,但哪些是高频问题?哪些是新出现的痛点?很难快速、直观地把握。
今天,我们就用一个实际项目,来展示如何用轻量化的AI工具,自动化地解决这些问题。我们将利用SenseVoice-Small ONNX这个本地语音识别工具,把政务热线录音变成结构化的文本,再通过简单的文本分析,自动生成诉求分类和可视化关键词云图,让海量语音数据背后的民意“一目了然”。
2. 工具核心:SenseVoice-Small ONNX 语音识别
工欲善其事,必先利其器。整个项目的起点,是将录音转化为准确、可读的文本。我们选择了SenseVoice-Small ONNX作为核心识别引擎,主要是看中了它的几个独特优势,完美匹配政务场景的需求。
2.1 为什么选择它?
政务数据处理,尤其是语音数据,对工具的要求非常特殊:
- 数据安全与隐私:市民通话录音包含敏感信息,必须本地处理,杜绝数据外传风险。
- 硬件友好性:政务部门的IT设备配置往往不高,需要工具能在普通电脑上流畅运行。
- 处理准确性:识别结果要带标点、数字要规范(比如“一百二十”要转成“120”),方便后续分析。
- 操作简便:业务人员可能不具备深度学习背景,工具需要足够“傻瓜式”。
SenseVoice-Small ONNX 正是为此而生:
- 纯本地运行:所有模型(主识别模型和标点模型)最终都运行在你的电脑上,录音数据不出门。
- 轻量化设计:采用了Int8量化技术,将模型“瘦身”,使得内存和显存占用大幅降低(相比原版可减少约75%),在只有CPU的办公电脑上也能快速完成识别。
- 智能文本处理:内置自动语种识别(能处理中文、英文甚至方言混合)、逆文本正则化(自动转换数字、单位)和标点恢复功能,出来的文本直接就是规整的句子,省去大量后期整理工作。
- 开箱即用:我们为其搭配了一个基于Streamlit的网页界面,你只需要上传音频文件,点击按钮,结果就出来了,无需接触任何代码。
2.2 快速上手体验
它的使用简单到不可思议:
- 启动工具后,打开浏览器访问本地网址。
- 在网页上点击上传按钮,选择你的热线录音文件(支持mp3, wav, m4a等多种格式)。
- 点击“开始识别”按钮。
- 等待片刻,完整的带标点识别文本就会显示在页面上,可以直接复制。
这个过程完全在本地完成,第一次使用时标点模型需要从国内镜像站下载缓存,之后离线也能用。这为我们在内网环境或保密要求高的场景下部署提供了可能。
3. 实战项目:从录音到洞察的全流程
现在,我们假设手头有一批某市“12345政务服务便民热线”某一天的通话录音,目标是快速分析出当天的热点诉求。下面是完整的操作流程。
3.1 第一步:语音转文本(批量处理)
单条录音我们可以用上面的网页工具手动处理。但对于批量数据,我们需要写一个简单的Python脚本来自动化。核心就是调用我们已经封装好的识别函数。
import os from pathlib import Path # 假设识别核心函数已封装在 sensevoice_recognizer 模块中 from sensevoice_recognizer import transcribe_audio # 设置热线录音文件夹路径 audio_dir = Path("./data/12345_recordings/") # 设置输出文本保存路径 output_dir = Path("./output/transcripts/") output_dir.mkdir(parents=True, exist_ok=True) # 获取所有音频文件 audio_files = list(audio_dir.glob("*.mp3")) + list(audio_dir.glob("*.wav")) transcripts = [] for audio_path in audio_files: print(f"正在处理: {audio_path.name}") try: # 调用本地识别函数 text_result = transcribe_audio(str(audio_path)) # 保存到文件 output_file = output_dir / f"{audio_path.stem}.txt" with open(output_file, 'w', encoding='utf-8') as f: f.write(text_result) transcripts.append({"file": audio_path.name, "text": text_result}) print(f" 完成,已保存至 {output_file}") except Exception as e: print(f" 处理失败: {e}") print(f"批量处理完成,共处理 {len(transcripts)} 个文件。")运行这个脚本,output/transcripts/文件夹里就会得到一堆.txt文件,每个文件内容都是一段规整的、带标点的通话文字记录。
3.2 第二步:诉求关键信息提取与分类
拿到文本只是第一步。接下来,我们要从这些文字中提取出市民的“核心诉求”。这里我们可以用一个轻量级但有效的组合方法:关键词提取 + 规则分类。
我们使用jieba库进行分词和关键词提取,然后根据预设的关键词规则库,将每条记录分到不同的诉求类别中。
import jieba.analyse import pandas as pd # 定义一个简单的诉求分类规则库(可根据实际数据扩充) complaint_categories = { "市容环境": ["垃圾", "清扫", "污水", "噪音", "违章建筑", "占道经营"], "交通管理": ["堵车", "停车位", "红绿灯", "违章", "公交", "地铁"], "住房保障": ["物业", "漏水", "房产证", "老旧小区改造", "租房"], "教育文体": ["学区", "入学", "学校", "补习班", "体育馆", "图书馆"], "医疗卫生": ["医院", "挂号", "医保", "疫苗", "医生", "药店"], "劳动社保": ["工资", "拖欠", "社保", "公积金", "劳动合同", "退休"], } def categorize_complaint(text): """ 根据文本内容,匹配到最可能的诉求类别。 """ # 提取文本中的关键词(Top 10) keywords = jieba.analyse.extract_tags(text, topK=10, withWeight=False) category_scores = {} for category, key_phrases in complaint_categories.items(): score = 0 for phrase in key_phrases: if phrase in text: # 简单使用文本包含匹配 score += 2 for kw in keywords: if phrase in kw or kw in phrase: score += 1 if score > 0: category_scores[category] = score # 返回得分最高的类别,如果都没有则归为“其他” if category_scores: return max(category_scores, key=category_scores.get) else: return "其他" # 对之前识别出的所有文本进行分类 classified_data = [] for item in transcripts: text = item["text"] category = categorize_complaint(text) classified_data.append({ "文件": item["file"], "识别文本": text[:100] + "...", # 预览前100字 "诉求分类": category }) # 转换为DataFrame方便查看和分析 df_classified = pd.DataFrame(classified_data) print(df_classified.head()) print(f"\n诉求分类统计:") print(df_classified['诉求分类'].value_counts())运行后,我们会得到一个表格,里面每条录音都有了明确的分类标签,比如“市容环境”、“交通管理”等,并且能看到每个类别有多少条记录。
3.3 第三步:生成关键词云图
分类让我们知道了问题的类型分布,但还不够直观。我们还想知道,在每个类别里,市民具体都在说什么?哪些词被提得最多?这时候,词云图(Word Cloud)就派上用场了。
我们使用wordcloud和matplotlib库来为每个诉求类别生成专属的词云。
from wordcloud import WordCloud import matplotlib.pyplot as plt from collections import defaultdict # 准备每个类别的全部文本 category_texts = defaultdict(str) for item in transcripts: text = item["text"] category = categorize_complaint(text) category_texts[category] += " " + text # 为每个类别生成词云 for category, full_text in category_texts.items(): if len(full_text.strip()) < 10: # 文本太少的类别跳过 continue print(f"正在生成 '{category}' 类别的词云...") # 创建词云对象,设置字体(确保系统有中文字体,如‘SimHei.ttf’) wc = WordCloud( font_path='SimHei.ttf', # 请替换为你的中文字体路径 width=800, height=600, background_color='white', max_words=50 ) # 生成词云 wordcloud = wc.generate(full_text) # 绘制并保存 plt.figure(figsize=(10, 8)) plt.imshow(wordcloud, interpolation='bilinear') plt.axis('off') plt.title(f'诉求类别:{category} - 高频关键词云图') # 保存图片 plt.savefig(f'./output/wordcloud_{category}.png', dpi=300, bbox_inches='tight') plt.close() print("所有词云图已生成至 ./output/ 目录。")运行这段代码,你会在输出文件夹里得到一系列PNG图片,文件名类似wordcloud_交通管理.png。打开一看,每个图里字号最大的词,就是该类别下市民反映最频繁的问题。
4. 成果展示与价值解读
经过以上三步,我们从一堆原始的录音文件,得到了结构化的、可视化的分析成果。
成果一:结构化数据表我们得到了一个包含“文件名”、“识别文本(摘要)”、“诉求分类”的表格。这个表格可以直接导入到Excel或数据库,进行更深入的统计分析,比如计算各类诉求的占比、变化趋势等。
成果二:分类统计脚本运行时会直接输出类似下面的统计结果:
诉求分类统计: 交通管理 45 市容环境 38 住房保障 22 教育文体 15 劳动社保 12 医疗卫生 8 其他 10一目了然,当天市民最关心的是“交通管理”和“市容环境”问题。
成果三:可视化关键词云图这是最直观的成果。例如,“交通管理”的词云里,“停车难”、“堵车”、“红绿灯损坏”等词汇会非常突出;“市容环境”的词云里,“垃圾堆积”、“噪音扰民”、“污水外溢”等可能是高频词。
这些成果的价值在哪里?
- 效率提升:将数小时甚至数天的人工听录、归纳工作,缩短到几分钟的自动化处理。
- 洞察精准:通过关键词云,决策者能瞬间抓住当前最突出、最集中的民生痛点,而不是被淹没在零散的报告里。
- 响应前置:通过对历史数据的持续分析,可以预测某些问题的爆发趋势(比如雨季前的积水投诉增多),从而提前部署资源,实现从“被动接诉”到“主动治理”的转变。
- 流程优化:清晰的分类和关键词统计,可以帮助热线管理部门优化知识库、培训话务员,提升首次问题解决率。
5. 总结
这个项目展示了一条清晰的技术路径:利用SenseVoice-Small ONNX这样的轻量化、本地化AI工具,将非结构化的语音数据,低成本、高效率、安全地转化为结构化的文本数据。再结合经典的文本分析方法和可视化技术,就能从海量语音中快速提炼出有价值的业务洞察。
整个过程无需昂贵的云计算服务,无需复杂的大数据平台,在普通的办公电脑上就能跑起来。它降低了政务部门利用AI技术的门槛,为热线数据的深度利用、智慧政务的建设提供了一个切实可行的“轻起点”方案。
技术的意义在于解决实际问题。希望这个从“录音”到“云图”的完整案例,能给你带来启发。无论是政务热线,还是客户服务录音、会议纪要分析、课堂录音整理,这套“轻量化识别+自动化分析”的思路,都有着广泛的应用空间。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。