用了三个月语音笔记助手,说实话,踩的坑比记的笔记还多

张开发
2026/4/16 22:57:00 15 分钟阅读

分享文章

用了三个月语音笔记助手,说实话,踩的坑比记的笔记还多
哈哈三个月前我突发奇想要做个语音笔记助手。本来以为是个小项目结果搞到现在确实踩了不少坑。今天就来跟大家分享一下真实的体验。项目背景说实话我记性不太好。开会的时候经常忘记领导说了什么重点读书的时候转眼就忘了关键内容。以前都用手机录音但整理起来简直是噩梦一个小时的内容要花三个小时整理。于是就萌生了做个语音笔记助手的想法希望能把语音自动转成文字还能智能提取重点、生成摘要。技术栈选择选型的时候我其实挺纠结的# 核心依赖选择requirements{语音识别:[whisper,vosk,speech_recognition],文本处理:[transformers,spacy,jieba],数据库:[sqlite3,pymongo],前端:[streamlit,gradio]}一开始我选了 Whisper毕竟 OpenAI 的模型准确率应该不错吧结果发现优点准确率确实高尤其是带专业术语的内容支持多语言切换输出带时间戳缺点体积太大了动辄几个G的模型速度慢一分钟音频要1-2分钟处理依赖 PyTorch环境配置贼麻烦后来换成了 Vosk开源的轻量级但准确率又差点意思。最后还是用 Whisper毕竟准确率优先嘛。主要功能实现1. 语音转文字importwhisperimportosclassVoiceTranscriber:def__init__(self,model_sizebase):self.modelwhisper.load_model(model_size)self.supported_formats[.mp3,.wav,.m4a,.flac]deftranscribe_file(self,audio_path):转换单个音频文件ifnotos.path.exists(audio_path):raiseFileNotFoundError(f音频文件不存在:{audio_path})ifnotany(audio_path.lower().endswith(ext)forextinself.supported_formats):raiseValueError(f不支持的音频格式:{audio_path})resultself.model.transcribe(audio_path,word_timestampsTrue)returnresult说实话这个功能虽然简单但坑不少。音频格式兼容、文件大小限制、批量处理时的内存管理每一个都让人头疼。2. 智能内容提取转完文字只是第一步怎么提取重点才是关键。2. 智能内容提取转完文字只是第一步怎么提取重点才是关键。fromtransformersimportpipelineclassContentExtractor:def__init__(self):self.summarizerpipeline(summarization)self.classifierpipeline(zero-shot-classification)defextract_key_points(self,text,categoriesNone):提取关键信息ifcategoriesisNone:categories[会议记录,学习笔记,个人想法,任务事项]resultself.classifier(text,categories)key_points[]# 提取涉及关键类别的句子sentencestext.split(。)forcategoryinresult[labels][:2]:# 取最相关的两个类别ifresult[scores][result[labels].index(category)]0.7:forsentenceinsentences:iflen(sentence.strip())10:key_points.append({category:category,content:sentence.strip(),confidence:result[scores][result[labels].index(category)]})returnkey_points这个功能真的很有用但有时候模型的理解也让人哭笑不得。比如我把“这个需求挺复杂的”归类到了“个人想法”其实应该是“任务事项”才对。3. 数据存储与管理importsqlite3fromdatetimeimportdatetimeclassNotesManager:def__init__(self,db_pathnotes.db):self.connsqlite3.connect(db_path)self.init_database()definit_database(self):初始化数据库表cursorself.conn.cursor()# 主笔记表cursor.execute( CREATE TABLE IF NOT EXISTS notes ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, content TEXT, summary TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, audio_path TEXT, tags TEXT ) )self.conn.commit()defsave_note(self,title,content,summary,audio_path,tags):保存笔记cursorself.conn.cursor()cursor.execute( INSERT INTO notes (title, content, summary, audio_path, tags) VALUES (?, ?, ?, ?, ?) ,(title,content,summary,audio_path,tags))self.conn.commit()returncursor.lastrowid实际使用体验三个月下来说实话这个工具确实帮我节省了不少时间但也有一些让我抓狂的地方。好用的地方会议记录以前开会要疯狂打字现在只需要专心听处理完就能得到完整的文字记录学习笔记看视频课程的时候可以一边听一边记重点效率提升不少灵感记录有了什么想法直接说就行不用担心忘记让人头疼的问题方言识别我老家是山东的偶尔说几句方言识别率就直线下降多人说话超过两个人同时说话基本就乱套了背景噪音咖啡馆这种环境基本没法用专业术语技术术语经常识别错误还要手动纠正优化之路为了让这个工具更好用我做了不少优化# 环境噪音过滤importnoisereduceasnrdefdenoise_audio(audio_data,sample_rate):降噪处理reduced_noisenr.reduce_noise(yaudio_data,srsample_rate)returnreduced_noise# 多说话人分离importpyannote.audiofrompyannote.coreimportSegmentdefseparate_speakers(audio_path):分离多人音频separatorpyannote.audio.Segmentation.from_pretrained(pyannote/speaker-diarization)segmentationSegment(audio_path)returnsegmentation说实话环境降噪效果还行但多人分离那块儿pyannote 的模型在特定环境下确实不靠谱经常搞错。数据统计用了三个月我收集了不少数据指标数值总录音时长约45小时处理成功率78%平均处理时间2.3分钟/小时准确率82%说实话这个准确率比我预期的高一些主要是因为我养成了说话清晰的习惯。未来计划虽然现在这个版本已经能用但还有不少改进空间实时识别现在需要等音频录完才能处理希望能实时识别多语言支持目前主要支持中文和英文希望能支持更多语言云端同步现在数据都存在本地希望能支持云端同步移动端虽然能用但移动体验不够好总结说实话做这个语音笔记助手的过程比我想象的复杂得多。一开始以为就是简单调用几个API就行结果发现坑一个接一个。但是看到自己的笔记库慢慢充实起来能随时搜索三个月前会议的内容还是挺有成就感的。如果你也经常需要记录语音内容这个工具确实值得一试但要做好心理准备可能需要花不少时间优化和调试。哈哈反正我是不后悔的毕竟现在开会终于不用疯狂打字了项目地址https://github.com/reware-frame/voice-notes-assistant欢迎一起改进欢迎大家提交 Issue 和 PR

更多文章