You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python 3.9.7的AI助手代码中添加唤醒词?求解决方案

唤醒词功能实现解决方案

核心思路

放弃在speech_recognition常规识别流程中硬加唤醒词判断,改用持续监听+轻量唤醒词检测的架构——speech_recognition的recognize_*方法是一次性识别逻辑,不适合实时唤醒场景。

具体实现步骤

1. 安装依赖

除speech_recognition外,引入轻量唤醒词检测库pvporcupine(免费版支持自定义唤醒词),执行安装命令:

pip install pvporcupine speechrecognition pyaudio

2. 替换原有监听逻辑

将单次语音识别流程改为:

  • 用Porcupine持续监听唤醒词
  • 检测到唤醒词后,再调用speech_recognition处理后续指令

3. 代码修改示例

假设原有基础代码结构如下:

import speech_recognition as sr

r = sr.Recognizer()
with sr.Microphone() as source:
    print("Listening...")
    audio = r.listen(source)
try:
    text = r.recognize_google(audio, language='zh-CN')
    print(f"You said: {text}")
    # 后续指令处理逻辑
except sr.UnknownValueError:
    print("Could not understand audio")

修改为带唤醒词的版本:

import speech_recognition as sr
import pvporcupine
import pyaudio

# 初始化Porcupine,使用内置唤醒词(免费版支持"alexa"等内置词)
# 自定义唤醒词需生成对应的ppn文件,替换下方参数即可
porcupine = pvporcupine.create(keywords=["alexa"])
pa = pyaudio.PyAudio()

# 配置音频流
audio_stream = pa.open(
    rate=porcupine.sample_rate,
    channels=1,
    format=pyaudio.paInt16,
    input=True,
    frames_per_buffer=porcupine.frame_length
)

r = sr.Recognizer()

print("等待唤醒词...")
while True:
    # 读取音频帧检测唤醒词
    pcm = audio_stream.read(porcupine.frame_length)
    pcm = pvporcupine.convert_pcm_to_int16(pcm)
    keyword_index = porcupine.process(pcm)
    
    if keyword_index >= 0:
        print("唤醒成功!请说话...")
        # 唤醒后监听用户指令
        with sr.Microphone() as source:
            r.adjust_for_ambient_noise(source)
            audio = r.listen(source)
        try:
            text = r.recognize_google(audio, language='zh-CN')
            print(f"识别到指令: {text}")
            # 在此添加你的指令处理逻辑
        except sr.UnknownValueError:
            print("没听清,请再说一遍")
        except sr.RequestError as e:
            print(f"语音识别服务出错: {e}")
        print("回到等待唤醒词状态...")

# 程序退出时释放资源(需捕获Ctrl+C等中断信号执行)
porcupine.delete()
audio_stream.close()
pa.terminate()

4. 关键注意事项

  • 自定义唤醒词:若要使用专属唤醒词(如"小助手"),需生成对应的.ppn文件,修改初始化代码为porcupine = pvporcupine.create(keyword_paths=["你的唤醒词文件.ppn"])
  • 权限与环境:确保麦克风权限已开启,Linux系统可能需额外安装音频驱动
  • 性能优化:Porcupine检测逻辑轻量,不会占用过多系统资源,适合持续运行
  • 错误处理:添加键盘中断捕获(如try-except KeyboardInterrupt)实现优雅退出

无第三方库备选方案

若不想引入额外依赖,可通过speech_recognition持续识别短音频片段,检查结果中是否包含唤醒词:

import speech_recognition as sr
import time

r = sr.Recognizer()
with sr.Microphone() as source:
    r.adjust_for_ambient_noise(source)
    print("等待唤醒词...")
    while True:
        try:
            # 每秒识别一次短音频片段
            audio = r.listen(source, phrase_time_limit=1)
            text = r.recognize_google(audio, language='zh-CN').lower()
            if "小助手" in text:
                print("唤醒成功!请说话...")
                # 监听完整指令
                audio = r.listen(source)
                cmd = r.recognize_google(audio, language='zh-CN')
                print(f"指令: {cmd}")
                # 处理指令逻辑
                print("回到等待唤醒词状态...")
        except sr.UnknownValueError:
            continue
        except sr.RequestError as e:
            print(f"服务出错,等待重试: {e}")
            time.sleep(5)

该方案缺点是误唤醒率较高,且依赖网络识别,仅适合快速测试。

内容的提问来源于stack exchange,提问作者aminerijalleblad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:30:51