跳转到内容
Yuuki学习手记
GitHub

给 Yuuki 装上耳朵和嘴巴

终端里的文字可以变成一句招呼,你说的话也可以落进草稿。先让 Yuuki 开口,再教它听懂录音,最后找出哪些片段真的有人说话,三块能力就能逐个摸清。

每个工具给一种安装方式、两个基础用法。第一轮先选 edge-tts,听见声音再往下玩。

工具 / 源码做什么费用与联网
edge-tts文字 → 声音(TTS)在线免 Key,文字发给微软
whisper.cpp声音 → 文字(转写)下载模型后,本地免费运行
silero-vad找出人声与静音(VAD)安装后,本地免费运行

只想先听一句话,点让 Yuuki 开口说第一句话。

先准备一次:Mac + 独立 Python 环境

本机已确认有 Homebrew、Python 3.14.6 和 pip 26.1.2(2026-10-14)。环境外用 python3 -m pip 或 pip3;下面在虚拟环境里用 python -m pip。

终端窗口
mkdir -p ~/voice-lab
cd ~/voice-lab
python3 -m venv .venv
source .venv/bin/activate

之后的命令都在这个终端运行。文件放在 ~/voice-lab;重新开终端时执行:

终端窗口
cd ~/voice-lab
source .venv/bin/activate

第一站 · edge-tts:先听见一句话

Section titled “第一站 · edge-tts:先听见一句话”

下载安装:

终端窗口
python -m pip install edge-tts

用法 ①:一句中文 → MP3 → 播放。

终端窗口
edge-tts --voice zh-CN-XiaoxiaoNeural --text "你好,我是 Yuuki。" --write-media hello.mp3
afplay hello.mp3

用法 ②:文本文件 → 配音 + 字幕。把自己的 UTF-8 文本放进 article.txt,然后执行:

终端窗口
edge-tts --voice zh-CN-XiaoxiaoNeural --file article.txt --write-media article.mp3 --write-subtitles article.srt

得到 article.mp3 和 article.srt。官方用法

第二站 · whisper.cpp:把声音接回文字

Section titled “第二站 · whisper.cpp:把声音接回文字”

下载安装工具和多语言 base 模型(约 142 MiB,支持中文):

终端窗口
brew install whisper.cpp ffmpeg
curl -fL https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.bin -o ggml-base.bin

安装包不含模型,需要第二行单独下载。Homebrew 安装说明、官方模型说明

先准备音频:用上一节的 hello.mp3,或把它换成自己的录音路径。转换成 16 kHz、单声道 WAV:

终端窗口
ffmpeg -i hello.mp3 -ar 16000 -ac 1 -c:a pcm_s16le audio.wav

用法 ①:中文录音 → 文字文件。

终端窗口
whisper-cli -m ggml-base.bin -f audio.wav -l zh -otxt -of transcript

得到 transcript.txt。

用法 ②:中文录音 → 带时间的字幕。

终端窗口
whisper-cli -m ggml-base.bin -f audio.wav -l zh -osrt -of subtitles

得到 subtitles.srt。音频留在本机。官方入门、CLI 参数

第三站 · silero-vad:在录音里找出人声

Section titled “第三站 · silero-vad:在录音里找出人声”

下载安装库和随包模型;soundfile 用来读写音频:

终端窗口
python -m pip install silero-vad soundfile

准备好上一节的 audio.wav。下面一段包含两个用法:① 打印人声的起止秒数;② 拼接检测到的人声片段,保存为 speech.wav。

整段粘贴到终端:

终端窗口
python - <<'PY'
import soundfile as sf
import torch
from silero_vad import load_silero_vad, get_speech_timestamps, collect_chunks
torch.set_num_threads(1)
samples, rate = sf.read("audio.wav", dtype="float32")
wav = torch.from_numpy(samples)
spans = get_speech_timestamps(wav, load_silero_vad(), sampling_rate=rate)
# 用法 ①:打印人声时间段
for span in spans:
print(f"{span['start'] / rate:.2f} 秒 → {span['end'] / rate:.2f} 秒")
# 用法 ②:保留人声片段
if spans:
sf.write("speech.wav", collect_chunks(spans, wav).numpy(), rate)
print("已保存 speech.wav")
else:
print("没有检测到人声")
PY

VAD 只检测人声;文字内容交给 Whisper。保留的人声片段里仍可能有背景噪声。官方用法、音频读写说明

拿第一站生成的 hello.mp3,在第二站转回文字,对照它有没有听对;再用第三站打印人声起止时间。三份产物摆在一起:声音、转写、人声区间,你就能具体说清一条语音交互要经过哪些环节。想接进工作台,再读模型与语音基础。

资料核对:2026-10-14。已检查本机 Python/pip 和示例语法;安装、模型下载及实际语音效果尚未执行验证。