给 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-labcd ~/voice-labpython3 -m venv .venvsource .venv/bin/activate之后的命令都在这个终端运行。文件放在 ~/voice-lab;重新开终端时执行:
cd ~/voice-labsource .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.mp3afplay 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 ffmpegcurl -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 sfimport torchfrom 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("没有检测到人声")PYVAD 只检测人声;文字内容交给 Whisper。保留的人声片段里仍可能有背景噪声。官方用法、音频读写说明
串起来玩一次
Section titled “串起来玩一次”拿第一站生成的 hello.mp3,在第二站转回文字,对照它有没有听对;再用第三站打印人声起止时间。三份产物摆在一起:声音、转写、人声区间,你就能具体说清一条语音交互要经过哪些环节。想接进工作台,再读模型与语音基础。
资料核对:2026-10-14。已检查本机 Python/pip 和示例语法;安装、模型下载及实际语音效果尚未执行验证。