系列教程说明
这是「AI专家养成计划」系列教程的第58篇,共140篇。从AI零基础出发,每天进步一点点。晚课以实操为主,手把手教你做——读完这篇,你就能用开源工具Whisper完成语音转文字、字幕生成、会议记录等实用任务。
上篇回顾
今天我们早课学习了语音识别的原理和应用。三个核心要点:
- 语音识别三步走:声音→信号→音素→文字,通过信号处理、声学模型和语言模型的配合,把语音转换成文字
- 深度学习带来质变:端到端模型(如Whisper)让识别准确率突破97%,已接近人类水平
- 五大应用场景:实时字幕、语音输入、智能助手、会议记录、医疗记录——语音识别正在改变我们与机器的交互方式
现在,我们进入实操环节。今晚的目标:用5个实操练习,亲手掌握语音识别的核心技能。
实操一:5分钟安装Whisper,转写你的第一段音频
什么是Whisper?
Whisper是OpenAI开源的语音识别模型,支持99种语言,是目前最强大的开源语音识别工具之一。免费、可离线使用、效果接近商业产品。
安装步骤
第1步:安装Python环境
确认你的电脑上有Python 3.8以上版本。打开终端(Mac/Linux)或命令提示符(Windows),输入:
`bash
python3 –version
`
如果显示版本号≥3.8,就可以继续。
第2步:安装Whisper
`bash
pip install openai-whisper
`
如果遇到权限问题,加上 --user:
`bash
pip install openai-whisper –user
`
第3步:安装FFmpeg(音频处理工具)
Whisper需要FFmpeg来读取音频文件。
- Mac:
brew install ffmpeg - Ubuntu/Debian:
sudo apt install ffmpeg - Windows:从 ffmpeg.org 下载,解压后把路径添加到系统环境变量
动手试试
找一段音频文件(MP3、WAV、M4A都行),在终端输入:
`bash
whisper your_audio.mp3 –language zh –model base
`
参数说明:
--language zh:指定中文(不指定的话Whisper会自动检测语言)--model base:使用base模型(平衡速度和准确率)
运行后,Whisper会在同目录下生成 .txt、.srt、.json 等多个格式的转写结果。其中 .srt 是字幕文件,可以直接导入视频编辑软件。
💡 小技巧:如果你的电脑没有独立显卡,用 tiny 模型速度更快:
`bash
whisper your_audio.mp3 –language zh –model tiny
`
实操二:批量转写——一次性处理10个音频文件
工作中经常需要批量处理多个音频文件。用一个简单的Python脚本就能搞定。
创建批量转写脚本
新建一个文件 batch_transcribe.py,粘贴以下代码:
`python
import whisper
import os
import glob
# 加载模型(只加载一次,节省时间)
model = whisper.load_model(“base”)
# 设置音频文件目录
audio_dir = “./audio_files” # 把你的音频文件放在这个目录
output_dir = “./transcripts” # 转写结果保存到这个目录
# 创建输出目录
os.makedirs(output_dir, exist_ok=True)
# 获取所有音频文件
audio_extensions = [“*.mp3”, “*.wav”, “*.m4a”, “*.flac”, “*.ogg”]
audio_files = []
for ext in audio_extensions:
audio_files.extend(glob.glob(os.path.join(audio_dir, ext)))
print(f”找到 {len(audio_files)} 个音频文件”)
# 逐个转写
for i, audio_path in enumerate(audio_files, 1):
filename = os.path.splitext(os.path.basename(audio_path))[0]
output_path = os.path.join(output_dir, f”{filename}.txt”)
# 跳过已转写的文件
if os.path.exists(output_path):
print(f”[{i}/{len(audio_files)}] 跳过 {filename}(已存在)”)
continue
print(f”[{i}/{len(audio_files)}] 正在转写 {filename}…”)
result = model.transcribe(audio_path, language=”zh”)
# 保存纯文本
with open(output_path, “w”, encoding=”utf-8″) as f:
f.write(result[“text”])
# 保存带时间戳的文本
srt_path = os.path.join(output_dir, f”{filename}.srt”)
with open(srt_path, “w”, encoding=”utf-8″) as f:
for j, segment in enumerate(result[“segments”], 1):
start = segment[“start”]
end = segment[“end”]
text = segment[“text”].strip()
# 转换为SRT时间格式
start_str = f”{int(start//3600):02d}:{int((start%3600)//60):02d}:{int(start%60):02d},{int((start%1)*1000):03d}”
end_str = f”{int(end//3600):02d}:{int((end%3600)//60):02d}:{int(end%60):02d},{int((end%1)*1000):03d}”
f.write(f”{j}n{start_str} –> {end_str}n{text}nn”)
print(f” ✅ 完成,结果保存到 {output_path}”)
print(“n全部完成!”)
`
使用方法
`bash
# 1. 创建音频目录
mkdir -p audio_files transcripts
# 2. 把音频文件放到 audio_files 目录
cp ~/your_audio/*.mp3 audio_files/
# 3. 运行脚本
python3 batch_transcribe.py
`
脚本会自动跳过已经转写过的文件,所以中断后可以重新运行,不会重复处理。
实操三:实时语音识别——让AI边听边写
Whisper擅长处理录音文件,但如果你想实时识别正在说的话(比如边开会边记录),需要另一个工具。
方案一:Whisper + 实时录音(简单方案)
`python
import whisper
import sounddevice as sd
import numpy as np
import tempfile
import scipy.io.wavfile as wav
model = whisper.load_model(“base”)
print(“🎤 实时语音识别(按 Ctrl+C 停止)”)
print(“说话后等待2秒,AI会自动识别…n”)
try:
while True:
# 录制3秒音频
duration = 3 # 秒
print(“🎙️ 正在听…”, end=””, flush=True)
audio = sd.rec(int(duration * 16000), samplerate=16000, channels=1, dtype=’float32′)
sd.wait()
# 保存为临时文件
with tempfile.NamedTemporaryFile(suffix=”.wav”, delete=False) as f:
wav.write(f.name, 16000, (audio * 32767).astype(np.int16))
# 转写
result = model.transcribe(f.name, language=”zh”)
text = result[“text”].strip()
if text:
print(f”r📝 {text}”)
else:
print(“r(未检测到语音)”)
except KeyboardInterrupt:
print(“nn结束识别”)
`
安装依赖:
`bash
pip install sounddevice scipy
`
方案二:使用FunASR(阿里开源,更适合中文)
FunASR对中文的优化比Whisper更好,而且支持标点恢复和说话人识别。
`bash
# 安装
pip install funasr
`
`python
from funasr import AutoModel
# 加载模型(首次运行会自动下载)
model = AutoModel(
model=”paraformer-zh”, # 中文语音识别模型
vad_model=”fsmn-vad”, # 语音活动检测
punc_model=”ct-punc”, # 标点恢复
)
# 转写音频文件
result = model.generate(input=”your_audio.mp3″)
print(result[0][“text”])
`
FunASR的优势:
- 自动加标点(Whisper的中文标点不太准)
- 支持语音活动检测(自动跳过静音段)
- 中文准确率比Whisper base模型更高
实操四:会议记录自动化——从录音到纪要的完整流程
这是最实用的项目。把一场1小时的会议录音,自动变成结构化的会议纪要。
完整代码
`python
import whisper
import json
from datetime import timedelta
def meeting_to_minutes(audio_path, output_path=”meeting_minutes.md”):
“””
会议录音 → 结构化纪要
“””
print(“📥 步骤1/3:加载Whisper模型…”)
model = whisper.load_model(“medium”) # medium模型准确率更高
print(“🎤 步骤2/3:转写会议录音(这可能需要几分钟)…”)
result = model.transcribe(
audio_path,
language=”zh”,
word_timestamps=True, # 启用词级时间戳
initial_prompt=”以下是一场工作会议的记录。” # 提示上下文,提升准确率
)
# 提取带时间戳的段落
segments = result[“segments”]
print(“📝 步骤3/3:生成会议纪要…”)
with open(output_path, “w”, encoding=”utf-8″) as f:
f.write(“# 会议纪要nn”)
f.write(f”生成时间:{timedelta(seconds=0)} – {timedelta(seconds=int(segments[-1][‘end’]))}nn”)
f.write(“—nn”)
# 按时间段输出(每5分钟一段)
current_minute = 0
f.write(f”## 📌 第1段(0:00 – 5:00)nn”)
for seg in segments:
minute = int(seg[“start”] // 60)
# 每5分钟换一段
if minute >= current_minute + 5:
current_minute = minute
f.write(f”n## 📌 第{current_minute // 5 + 1}段({current_minute}:00 – {current_minute + 5}:00)nn”)
# 输出带时间戳的文字
start = str(timedelta(seconds=int(seg[“start”])))
text = seg[“text”].strip()
f.write(f”[{start}] {text}nn”)
# 生成摘要提示
f.write(“—nn”)
f.write(“## 💡 AI建议nn”)
f.write(“以上内容由Whisper自动生成。建议用ChatGPT进一步处理:nn”)
f.write(“`n”)
f.write(“请根据以下会议转写内容,生成结构化的会议纪要,包含:n”)
f.write(“1. 会议主题n”)
f.write(“2. 参会人员(如果能识别)n”)
f.write(“3. 主要讨论内容(分点列出)n”)
f.write(“4. 决策事项n”)
f.write(“5. 待办事项(含负责人和截止时间)n”)
f.write(“`n”)
print(f”n✅ 会议纪要已保存到 {output_path}”)
print(f”📊 共转写 {len(segments)} 个段落,总时长 {timedelta(seconds=int(segments[-1][‘end’]))}”)
# 使用方法
meeting_to_minutes(“meeting_recording.mp3”)
`
使用步骤
`bash
# 1. 录制会议(用手机录音机App即可)
# 2. 把录音文件传到电脑
# 3. 运行脚本
python3 meeting_minutes.py
# 4. 把生成的markdown文件内容粘贴到ChatGPT,让它帮你整理成正式纪要
`
💡 进阶技巧:
在调用Whisper时,initial_prompt 参数非常有用。它告诉AI”上下文是什么”,可以显著提升专业术语的识别准确率。
`python
# 如果是技术会议
result = model.transcribe(audio, initial_prompt=”以下是一场技术评审会议,涉及微服务架构、Kubernetes部署、CI/CD流水线。”)
# 如果是医学会议
result = model.transcribe(audio, initial_prompt=”以下是一场科室会诊,涉及患者病史、诊断、治疗方案。”)
`
实操五:搭建你的私有语音助手(开源方案)
如果你想在自己的电脑上搭建一个完全离线、不依赖任何云服务的语音助手,可以试试这个组合:
技术栈
- 语音识别(ASR):Whisper(已安装)
- 语音合成(TTS):Piper(开源,下节课会详细讲)
- 大语言模型(LLM):Ollama + Llama3(本地运行)
- 语音活动检测(VAD):Silero VAD(判断什么时候有人在说话)
安装Ollama
`bash
# Mac/Linux
curl -fsSL https://ollama.com/install.sh | sh
# 下载一个轻量模型
ollama pull llama3.2:3b
`
最简语音助手代码
`python
import whisper
import sounddevice as sd
import numpy as np
import tempfile
import scipy.io.wavfile as wav
import requests
import json
# 加载Whisper
asr_model = whisper.load_model(“base”)
# Ollama API地址
OLLAMA_URL = “http://localhost:11434/api/generate”
def listen():
“””录制3秒音频并转写”””
audio = sd.rec(int(3 * 16000), samplerate=16000, channels=1, dtype=’float32′)
sd.wait()
with tempfile.NamedTemporaryFile(suffix=”.wav”, delete=False) as f:
wav.write(f.name, 16000, (audio * 32767).astype(np.int16))
result = asr_model.transcribe(f.name, language=”zh”)
return result[“text”].strip()
def think(text):
“””用Ollama思考”””
response = requests.post(OLLAMA_URL, json={
“model”: “llama3.2:3b”,
“prompt”: f”你是一个友善的语音助手。用户说:{text}n请用简短的中文回答:”,
“stream”: False
})
return response.json()[“response”]
# 主循环
print(“🤖 语音助手已启动(按 Ctrl+C 退出)”)
print(“对着麦克风说话,我会回答你…n”)
try:
while True:
print(“🎙️ 在听…”, end=””, flush=True)
text = listen()
if not text:
print(“r(没听清,请再说一次)”)
continue
print(f”r👤 你说:{text}”)
answer = think(text)
print(f”🤖 AI:{answer}n”)
except KeyboardInterrupt:
print(“n再见!”)
`
这个语音助手完全在本地运行,不需要联网,不需要API Key。你的对话内容不会离开你的电脑。
今日总结
- Whisper是最佳起点:免费开源、支持中文、效果接近商业产品,5分钟就能完成第一次语音转文字
- 批量处理用脚本:一段Python代码就能批量转写多个音频文件,自动生成纯文本和字幕文件
- ASR+LLM是黄金组合:Whisper负责”听”,ChatGPT/Ollama负责”理解”和”整理”——这就是语音助手的核心架构
今日行动项
- 安装Whisper并转写一段音频(15分钟):找一段播客或会议录音,用
whisper命令转写,看看效果如何 - 尝试批量转写脚本(10分钟):准备3-5个音频文件,运行批量转写脚本,对比不同音频的识别效果
- 用ChatGPT整理转写结果(10分钟):把Whisper的转写文本粘贴到ChatGPT,让它帮你生成摘要或会议纪要
📖 地铁深读:语音识别的”内卷”——Whisper vs 各路对手
这个板块专为地铁通勤设计,每篇5-10分钟。不想深读可以跳过,不影响主线学习。
Whisper凭什么封神?
2022年9月,OpenAI发布Whisper时,语音识别领域已经”卷”了很多年。Google有自家的USM,Meta有wav2vec 2.0,阿里有Paraformer。但Whisper一出来,直接改变了游戏规则。
Whisper的秘密武器不是算法有多花哨,而是数据量。它用了68万小时的多语言音频数据训练——这个数据量是之前最大开源数据集的几十倍。而且这些数据来自互联网,包含了各种口音、噪音、语速的真实场景。
关键洞察:在深度学习时代,数据规模往往比算法创新更重要。Whisper的架构并不复杂(标准的Transformer encoder-decoder),但68万小时的训练数据让它”见多识广”,遇到什么口音都不怕。
中文语音识别的”内战”
在中文领域,Whisper并不是唯一的选项。来看看主要选手:
FunASR(阿里达摩院)
- 优势:中文优化极好,支持标点恢复、说话人分离
- 劣势:多语言支持不如Whisper
- 适合:纯中文场景(会议记录、客服录音)
SenseVoice(FunASR团队2024年新作)
- 优势:支持50+语言,情绪识别,速度比Whisper快5倍
- 劣势:社区生态不如Whisper成熟
- 适合:需要情绪分析的场景(客服质检、访谈分析)
WeNet(出门问问+西工大)
- 优势:工业级部署方案,支持流式识别
- 劣势:上手门槛较高
- 适合:需要嵌入到产品中的开发者
一个有趣的实验
如果你想亲自对比这些模型,可以试试这个方法:
`bash
# 准备同一段音频
audio=”test.mp3″
# Whisper
whisper $audio –language zh –model base
# FunASR(需要安装)
python3 -c “
from funasr import AutoModel
model = AutoModel(model=’paraformer-zh’, vad_model=’fsmn-vad’, punc_model=’ct-punc’)
result = model.generate(input=’$audio’)
print(result[0][‘text’])
“
`
把两段结果放在一起对比,你会发现:
- Whisper的英文混杂识别更好(比如”这个API返回了error”)
- FunASR的中文标点更准(自动加逗号、句号)
- 在专业术语方面,两者各有胜负
语音识别的下一个前沿
当前语音识别的主要战场已经从”准确率”转向了”实时性”和”多模态”:
- 流式识别:边听边转写,延迟<500ms。这对直播字幕、实时翻译至关重要
- 端侧部署:把模型装进手机和IoT设备,不需要联网就能识别。Whisper tiny只有39MB,已经可以在手机上跑
- 多模态理解:不仅听”说了什么”,还理解”怎么说的”——语气、情绪、意图。这是通往真正智能语音助手的关键一步
推荐学习资源
- Whisper GitHub:github.com/openai/whisper — 官方仓库,包含模型和论文
- FunASR GitHub:github.com/modelscope/FunASR — 阿里开源的语音识别工具包
- HuggingFace ASR排行榜:huggingface.co/spaces/hf-audio/open_asr_leaderboard — 实时对比各模型准确率
- 《动手学深度学习》语音识别章节:d2l.ai — 李沐团队的免费教材,讲解语音识别原理
进阶思考题
- Whisper用了68万小时数据训练,但这些数据来自互联网,可能存在版权争议。如果你要训练一个商业语音识别模型,数据来源问题怎么解决?
- 流式识别(边听边写)和离线识别(听完再写)的准确率通常有2-5%的差距。你能想到是什么原因导致的吗?
下篇预告
明天早上8点:Day30——语音合成:让AI开口说话
明天下午5点:Day30——语音合成实战
今天我们学会了让AI”听”,明天反过来——让AI”说”。文字转语音(TTS)技术已经能生成以假乱真的人声,甚至能克隆你的声音。我们将了解这项技术的原理、工具和伦理边界。
发表回复