乐于分享
好东西不私藏

开源语音AI:零成本搭建语音助手

开源语音AI:零成本搭建语音助手

语音交互是 AI 最自然的交互方式。但市面上大多数语音助手(Siri、小爱、天猫精灵)都依赖云端服务器——你的每一句话都要上传到厂商的服务器处理。

有没有办法在本地跑一套完整的语音 AI 系统?不需要联网,不需要付费 API,不需要担心隐私泄露?

答案是:。而且只需要三个开源工具。

语音 AI 的三大组件

一个完整的语音 AI 系统由三个模块组成:

  1. STT(语音转文字)——把你说话的声音变成文本
  2. LLM(大语言模型)——理解你的问题,生成回答
  3. 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,换成 smallmedium 精度更高。

这里有个关键细节:录制音频时记得用 16kHz 采样率。Whisper 对这个采样率优化最好,用 44.1kHz 反而会降低识别率。

组件二:Ollama 跑本地大模型

语音识别完文本后,需要一个大模型来理解和回复。Ollama 是目前最流行的本地大模型运行工具,安装和 Docker 一样简单:

# Linux/Mac
curl -fsSL https://ollama.com/install.sh | sh

# Windows 直接下载安装包

然后拉一个适合中文的模型:

ollama pull qwen2.5:7b

Qwen2.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.mp3

zh-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。

相关学习资料