在开始构建数字档案馆语音识别系统之前,必须先配置好运行环境。本系统基于Python开发,利用OpenAI的Whisper模型进行高精度语音转文字,使用Flask作为Web框架,SQLite作为轻量级数据库。请严格按照以下步骤操作,避免环境冲突。
确保系统已安装Python 3.9或更高版本。打开终端(Linux/Mac)或命令提示符(Windows),输入以下命令检查版本:
python --version
若未安装,请前往Python官网下载对应操作系统的安装包,安装时务必勾选"Add Python to PATH"。
Whisper模型依赖FFmpeg处理音频流。如果系统中没有FFmpeg,语音转写功能将直接报错。
choco install ffmpegsudo apt update && sudo apt install ffmpegbrew install ffmpeg在桌面或任意工作目录下创建项目文件夹,并建立Python虚拟环境以隔离依赖:
mkdir digital_archive_voice
cd digital_archive_voice
python -m venv venv
激活虚拟环境:
venv\Scripts\activatesource venv/bin/activate激活环境后,安装Flask框架和Whisper模型库。执行以下命令:
pip install flask openai-whisper
这一步会自动下载Flask及其依赖,以及Whisper运行所需的PyTorch等库,网络可能需要几分钟时间。

我们先编写一个独立的Python脚本来处理语音识别逻辑,确保核心功能可用。在项目根目录下创建文件 transcriber.py,并写入以下完整代码:
```python import whisper import os 加载Whisper模型,'base'模型兼顾速度与准确度,首次运行会自动下载约140MB的模型文件 如果需要更高精度,可改为 'small' 或 'medium',但显存和耗时会增加 model = whisper.load_model("base") def transcribe_audio(audio_path): """ 对指定路径的音频文件进行语音识别 :param audio_path: 音频文件绝对路径 :return: 识别出的文本字符串 """ if not os.path.exists(audio_path): raise FileNotFoundError(f"音频文件不存在: {audio_path}") print(f"正在处理文件: {audio_path} ...") 执行转写,language='zh' 指定主要识别中文,提升准确率 result = model.transcribe(audio_path, language='zh', fp16=False) text = result["text"].strip() return text if __name__ == "__main__": 测试代码:将此处路径替换为你本地的一个测试音频路径 test_file = "test_audio.wav" print(transcribe_audio(test_file)) pass ```注意: 代码中设置了 fp16=False,这是为了兼容不支持FP16的CPU环境。如果你有NVIDIA显卡且配置了CUDA,可以去掉此参数以加速处理。
接下来构建Flask后端,实现文件上传、调用识别服务、存储档案记录的功能。在项目根目录下创建 app.py:
```python import os import sqlite3 from flask import Flask, request, jsonify, render_template, send_from_directory from transcriber import transcribe_audio app = Flask(__name__) 配置上传文件夹 UPLOAD_FOLDER = 'uploads' if not os.path.exists(UPLOAD_FOLDER): os.makedirs(UPLOAD_FOLDER) app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER 允许的音频格式 ALLOWED_EXTENSIONS = {'wav', 'mp3', 'm4a', 'flac', 'ogg'} def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS def init_db(): """初始化SQLite数据库,创建档案表""" conn = sqlite3.connect('archives.db') cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS archives ( id INTEGER PRIMARY KEY AUTOINCREMENT, filename TEXT NOT NULL, audio_path TEXT NOT NULL, content TEXT, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ''') conn.commit() conn.close() @app.route('/') def index(): """返回前端页面""" return render_template('index.html') @app.route('/upload', methods=['POST']) def upload_file(): """处理音频文件上传并识别""" if 'file' not in request.files: return jsonify({"error": "没有文件部分"}), 400 file = request.files['file'] if file.filename == '': return jsonify({"error": "未选择文件"}), 400 if file and allowed_file(file.filename): 保存文件 filename = file.filename save_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) file.save(save_path) try: 调用识别服务 text_content = transcribe_audio(save_path) 存入数据库 conn = sqlite3.connect('archives.db') cursor = conn.cursor() cursor.execute("INSERT INTO archives (filename, audio_path, content) VALUES (?, ?, ?)", (filename, save_path, text_content)) conn.commit() archive_id = cursor.lastrowid conn.close() return jsonify({ "success": True, "id": archive_id, "filename": filename, "content": text_content }) except Exception as e: return jsonify({"error": str(e)}), 500 return jsonify({"error": "不支持的文件格式"}), 400 @app.route('/archives', methods=['GET']) def get_archives(): """获取所有档案列表""" conn = sqlite3.connect('archives.db') cursor = conn.cursor() cursor.execute("SELECT id, filename, content, create_time FROM archives ORDER BY create_time DESC") rows = cursor.fetchall() conn.close() data = [] for row in rows: data.append({ "id": row[0], "filename": row[1], "content": row[2], "create_time": row[3] }) return jsonify(data) if __name__ == '__main__': init_db() 启动服务,监听所有IP,端口5000 app.run(host='0.0.0.0', port=5000, debug=True) ```在项目根目录下创建一个名为 templates 的文件夹,并在其中新建 index.html。这个页面将提供文件上传表单和档案展示列表。
```html代码编写完成后,即可启动系统进行实测。确保当前终端仍在虚拟环境中,且位于项目根目录下。
在终端执行以下命令:
python app.py
终端显示 Running on http://0.0.0.0:5000 即表示启动成功。如果是本地测试,浏览器访问 http://localhost:5000。
关闭Flask服务(Ctrl+C),然后重新运行 python app.py。刷新浏览器页面,之前识别的档案记录依然存在,说明SQLite数据库存储功能正常。
上述代码已完成核心闭环,但在实际生产环境中部署数字档案馆系统时,还需注意以下细节:
base 模型适合快速验证。正式环境建议在服务器端下载并使用 medium 或 large-v3 模型,准确率会有显著提升,尤其是针对专业术语较多的档案内容。Gunicorn 启动服务,命令如下:gunicorn -w 4 -b 0.0.0.0:5000 app:appuploads 文件夹。生产环境建议对接对象存储服务(如MinIO或阿里云OSS),并将访问路径存入数据库。