哈哈,三个月前我突发奇想,要做个语音笔记助手。本来以为是个小项目,结果搞到现在,确实踩了不少坑。今天就来跟大家分享一下真实的体验。

项目背景

说实话,我记性不太好。开会的时候经常忘记领导说了什么重点,读书的时候转眼就忘了关键内容。以前都用手机录音,但整理起来简直是噩梦,一个小时的内容要花三个小时整理。

于是就萌生了做个语音笔记助手的想法,希望能把语音自动转成文字,还能智能提取重点、生成摘要。

技术栈选择

选型的时候,我其实挺纠结的:

# 核心依赖选择
requirements = {
    "语音识别": ["whisper", "vosk", "speech_recognition"],
    "文本处理": ["transformers", "spacy", "jieba"],
    "数据库": ["sqlite3", "pymongo"],
    "前端": ["streamlit", "gradio"]
}

一开始我选了 Whisper,毕竟 OpenAI 的模型,准确率应该不错吧?结果发现:

优点:

  • 准确率确实高,尤其是带专业术语的内容
  • 支持多语言切换
  • 输出带时间戳

缺点:

  • 体积太大了!动辄几个G的模型
  • 速度慢,一分钟音频要1-2分钟处理
  • 依赖 PyTorch,环境配置贼麻烦

后来换成了 Vosk,开源的,轻量级,但准确率又差点意思。最后还是用 Whisper,毕竟准确率优先嘛。

主要功能实现

1. 语音转文字

import whisper
import os

class VoiceTranscriber:
    def __init__(self, model_size="base"):
        self.model = whisper.load_model(model_size)
        self.supported_formats = [".mp3", ".wav", ".m4a", ".flac"]
    
    def transcribe_file(self, audio_path):
        """转换单个音频文件"""
        if not os.path.exists(audio_path):
            raise FileNotFoundError(f"音频文件不存在: {audio_path}")
        
        if not any(audio_path.lower().endswith(ext) for ext in self.supported_formats):
            raise ValueError(f"不支持的音频格式: {audio_path}")
        
        result = self.model.transcribe(audio_path, word_timestamps=True)
        return result

说实话,这个功能虽然简单,但坑不少。音频格式兼容、文件大小限制、批量处理时的内存管理,每一个都让人头疼。

2. 智能内容提取

转完文字只是第一步,怎么提取重点才是关键。

2. 智能内容提取

转完文字只是第一步,怎么提取重点才是关键。

from transformers import pipeline

class ContentExtractor:
    def __init__(self):
        self.summarizer = pipeline("summarization")
        self.classifier = pipeline("zero-shot-classification")
    
    def extract_key_points(self, text, categories=None):
        """提取关键信息"""
        if categories is None:
            categories = ["会议记录", "学习笔记", "个人想法", "任务事项"]
        
        result = self.classifier(text, categories)
        key_points = []
        
        # 提取涉及关键类别的句子
        sentences = text.split('。')
        for category in result['labels'][:2]:  # 取最相关的两个类别
            if result['scores'][result['labels'].index(category)] > 0.7:
                for sentence in sentences:
                    if len(sentence.strip()) > 10:
                        key_points.append({
                            'category': category,
                            'content': sentence.strip(),
                            'confidence': result['scores'][result['labels'].index(category)]
                        })
        
        return key_points

这个功能真的很有用,但有时候模型的理解也让人哭笑不得。比如我把“这个需求挺复杂的”归类到了“个人想法”,其实应该是“任务事项”才对。

3. 数据存储与管理

import sqlite3
from datetime import datetime

class NotesManager:
    def __init__(self, db_path="notes.db"):
        self.conn = sqlite3.connect(db_path)
        self.init_database()
    
    def init_database(self):
        """初始化数据库表"""
        cursor = self.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()
    
    def save_note(self, title, content, summary, audio_path, tags=""):
        """保存笔记"""
        cursor = self.conn.cursor()
        cursor.execute('''
        INSERT INTO notes (title, content, summary, audio_path, tags)
        VALUES (?, ?, ?, ?, ?)
        ''', (title, content, summary, audio_path, tags))
        
        self.conn.commit()
        return cursor.lastrowid

实际使用体验

三个月下来,说实话,这个工具确实帮我节省了不少时间,但也有一些让我抓狂的地方。

好用的地方:

  1. 会议记录:以前开会要疯狂打字,现在只需要专心听,处理完就能得到完整的文字记录
  2. 学习笔记:看视频课程的时候,可以一边听一边记重点,效率提升不少
  3. 灵感记录:有了什么想法,直接说就行,不用担心忘记

让人头疼的问题:

  1. 方言识别:我老家是山东的,偶尔说几句方言,识别率就直线下降
  2. 多人说话:超过两个人同时说话,基本就乱套了
  3. 背景噪音:咖啡馆这种环境,基本没法用
  4. 专业术语:技术术语经常识别错误,还要手动纠正

优化之路

为了让这个工具更好用,我做了不少优化:

# 环境噪音过滤
import noisereduce as nr

def denoise_audio(audio_data, sample_rate):
    """降噪处理"""
    reduced_noise = nr.reduce_noise(y=audio_data, sr=sample_rate)
    return reduced_noise

# 多说话人分离
import pyannote.audio
from pyannote.core import Segment

def separate_speakers(audio_path):
    """分离多人音频"""
    separator = pyannote.audio.Segmentation.from_pretrained("pyannote/speaker-diarization")
    segmentation = Segment(audio_path)
    return segmentation

说实话,环境降噪效果还行,但多人分离那块儿,pyannote 的模型在特定环境下确实不靠谱,经常搞错。

数据统计

用了三个月,我收集了不少数据:

指标 数值
总录音时长 约45小时
处理成功率 78%
平均处理时间 2.3分钟/小时
准确率 82%

说实话,这个准确率比我预期的高一些,主要是因为我养成了说话清晰的习惯。

未来计划

虽然现在这个版本已经能用,但还有不少改进空间:

  1. 实时识别:现在需要等音频录完才能处理,希望能实时识别
  2. 多语言支持:目前主要支持中文和英文,希望能支持更多语言
  3. 云端同步:现在数据都存在本地,希望能支持云端同步
  4. 移动端:虽然能用,但移动体验不够好

总结

说实话,做这个语音笔记助手的过程,比我想象的复杂得多。一开始以为就是简单调用几个API就行,结果发现坑一个接一个。

但是看到自己的笔记库慢慢充实起来,能随时搜索三个月前会议的内容,还是挺有成就感的。

如果你也经常需要记录语音内容,这个工具确实值得一试,但要做好心理准备,可能需要花不少时间优化和调试。

哈哈,反正我是不后悔的,毕竟现在开会终于不用疯狂打字了!


项目地址:https://github.com/reware-frame/voice-notes-assistant
欢迎一起改进,欢迎大家提交 Issue 和 PR!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐