语音交互是 AI 最自然的交互方式。但市面上大多数语音助手(Siri、小爱、天猫精灵)都依赖云端服务器——你的每一句话都要上传到厂商的服务器处理。
有没有办法在本地跑一套完整的语音 AI 系统?不需要联网,不需要付费 API,不需要担心隐私泄露?
答案是:有。而且只需要三个开源工具。
语音 AI 的三大组件
一个完整的语音 AI 系统由三个模块组成:
- STT(语音转文字)——把你说话的声音变成文本
- LLM(大语言模型)——理解你的问题,生成回答
- TTS(文字转语音)——把回答朗读出来
市面上每个环节都有优秀的开源方案。经过实测,我推荐下面这个组合。
组件一:Whisper 做语音识别
OpenAI 开源的 Whisper 是目前最成熟的免费语音识别模型。它支持 99 种语言,中文识别准确率非常高。
安装非常简单:
pip install faster-whisper一条命令就能转录音频:
from faster_whisper import WhisperModel
model = WhisperModel("tiny", device="cpu")
segments, _ = model.transcribe("recording.wav")
for seg in segments:
print(seg.text)tiny 模型只有 75MB,CPU 就能实时运行。如果你有 GPU,换成 small 或 medium 精度更高。
这里有个关键细节:录制音频时记得用 16kHz 采样率。Whisper 对这个采样率优化最好,用 44.1kHz 反而会降低识别率。
组件二:Ollama 跑本地大模型
语音识别完文本后,需要一个大模型来理解和回复。Ollama 是目前最流行的本地大模型运行工具,安装和 Docker 一样简单:
# Linux/Mac
curl -fsSL https://ollama.com/install.sh | sh
# Windows 直接下载安装包然后拉一个适合中文的模型:
ollama pull qwen2.5:7bQwen2.5 7B 对中文的理解能力非常出色,普通笔记本电脑(16GB 内存)就能流畅运行。如果配置更高,可以上 14B 或 32B 版本。
更棒的是 Ollama 兼容 OpenAI API 格式,你可以用任何支持 OpenAI 的客户端连接它:
from openai import OpenAI
client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")
response = client.chat.completions.create(
model="qwen2.5:7b",
messages=[{"role": "user", "content": "介绍一下西湖"}]
)
print(response.choices[0].message.content)组件三:Edge TTS 做语音合成
这是最让我惊喜的部分。微软 Edge 浏览器的文本转语音引擎可以通过一个开源库 edge-tts 调用,免费、无需 API Key、音质极好。
pip install edge-tts命令行一条搞定:
edge-tts --text "你好,我是你的本地语音助手" --voice zh-CN-XiaoxiaoNeural --write-media output.mp3zh-CN-XiaoxiaoNeural 是目前中文女声里最自然的,还有 zh-CN-YunxiNeural(男声)、zh-CN-XiaoyiNeural(活泼女声)等可选。
Python 调用同样简洁:
import edge_tts
async def speak(text):
tts = edge_tts.Communicate(text, "zh-CN-XiaoxiaoNeural")
await tts.save("output.mp3")串起来:一个完整的语音助手
把三个组件串联,不到 100 行 Python 代码就能搭一个完整的本地语音助手:
麦克风录音 → Whisper 识别成文字 → Ollama 生成回复 → Edge TTS 朗读关键代码骨架:
import pyaudio, wave
from faster_whisper import WhisperModel
from openai import OpenAI
import edge_tts, asyncio
# 1. 录音
def record(duration=5, filename="input.wav"):
CHUNK, RATE = 1024, 16000
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1,
rate=RATE, input=True, frames_per_buffer=CHUNK)
frames = [stream.read(CHUNK) for _ in range(int(RATE/CHUNK * duration))]
with wave.open(filename, 'wb') as wf:
wf.setnchannels(1)
wf.setsampwidth(p.get_sample_size(pyaudio.paInt16))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
# 2. 识别
whisper = WhisperModel("tiny", device="cpu")
text = "".join(seg.text for seg in whisper.transcribe("input.wav")[0])
# 3. LLM 回复
llm = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")
reply = llm.chat.completions.create(
model="qwen2.5:7b",
messages=[{"role": "user", "content": text}]
).choices[0].message.content
# 4. 朗读
asyncio.run(edge_tts.Communicate(reply, "zh-CN-XiaoxiaoNeural").save("output.mp3"))三个踩坑经验
实测中踩了不少坑,分享三个最关键的:
1. 录音时加 VAD(语音活动检测)
不要一直开着麦克风。用 webrtcvad 或者简单的音量阈值判断,只在有人说话时才开始录音。否则 Whisper 会把背景噪音也识别成文字,输出一堆乱码。
2. Ollama 第一次回复慢是正常的
模型需要加载到内存。第一次请求可能等 5-10 秒,后续就快了。如果不想等,可以在启动时设置 OLLAMA_KEEP_ALIVE=-1 让模型常驻内存。
3. Edge TTS 不是严格"离线"的
它需要联网调用微软的合成接口。如果你需要完全离线的方案,可以用 Piper TTS 或 Coqui TTS,但中文音质远不如 Edge TTS。个人觉得这个取舍值得——音质好太多,而且不涉及隐私(文本发给微软做语音合成,不会被存储)。
这套方案的总成本:零。不需要买 API Key,不需要云服务器,一台普通笔记本就够了。语音识别、大模型推理全部在本地完成,只有语音合成用了 Edge 的免费接口。
最重要的是——你的数据完全由你掌控。说过的每一句话都不会离开你的电脑(TTS 那段文本除外)。这在隐私越来越被重视的今天,价值远超省钱本身。
如果你也想动手试试,推荐从 Ollama + Qwen2.5 开始。先跑通文字对话,再逐步加上语音输入和输出。一个周末足够搭出你自己的 Jarvis。
夜雨聆风