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

如何构建可读取isVHSopen网站状态的Google Voice语音应用?

嘿,我来帮你搞定这个简易语音应用的搭建!咱们把需求拆成几个核心环节,一步步实现就行。

整体实现流程

这个应用的核心逻辑很清晰,拆解下来就是三步:

  • 监听用户的语音触发短语(比如“IsVHSOpen”)
  • 调用指定接口获取VHS门的状态数据
  • 将获取到的状态转为语音播报出来
技术选型建议

根据需求的简易性,推荐用Python来快速实现,搭配几个轻量库:

  • 语音识别:用SpeechRecognition库,支持麦克风输入和多种识别引擎(Google的免费引擎足够用)
  • HTTP请求:用requests库调用接口获取数据
  • 语音播报:用pyttsx3(离线播报,不需要联网)或者gTTS(在线生成语音文件再播放)
核心代码示例

下面是一个基础的实现版本,你可以直接参考修改:

1. 安装依赖库

先把需要的库装一下:

pip install SpeechRecognition requests pyttsx3 pyaudio

(注:pyaudio是麦克风输入的依赖,Windows/macOS/Linux安装方式可能略有不同,比如Linux可以先运行apt-get install portaudio19-dev再装)

2. 完整代码实现

import speech_recognition as sr
import requests
import pyttsx3

# 初始化语音识别器和播报引擎
recognizer = sr.Recognizer()
engine = pyttsx3.init()

# 自定义触发短语(可以添加多个,比如["IsVHSOpen", "Check VHS Door"])
TRIGGER_PHRASES = ["IsVHSOpen"]
# 状态接口地址
STATUS_API_URL = "https://api.vanhack.ca/s/vhs/data/door.json"

def get_vhs_status():
    """调用接口获取VHS门的状态"""
    try:
        response = requests.get(STATUS_API_URL)
        response.raise_for_status()
        data = response.json()
        # 假设接口返回的状态字段是"status",比如值为"open"或"closed"
        return data.get("status", "unknown")
    except Exception as e:
        print(f"获取状态失败: {e}")
        return "error"

def speak(text):
    """语音播报文本内容"""
    engine.say(text)
    engine.runAndWait()

def listen_for_trigger():
    """监听麦克风输入,检测触发短语"""
    with sr.Microphone() as source:
        print("等待你的触发指令...")
        recognizer.adjust_for_ambient_noise(source)  # 消除环境噪音
        audio = recognizer.listen(source)
        
        try:
            # 用Google语音识别转文本
            command = recognizer.recognize_google(audio).strip()
            print(f"识别到指令: {command}")
            
            # 检查是否匹配触发短语(忽略大小写)
            if any(phrase.lower() in command.lower() for phrase in TRIGGER_PHRASES):
                speak("正在查询VHS门状态...")
                status = get_vhs_status()
                if status == "open":
                    speak("VHS门目前是打开状态")
                elif status == "closed":
                    speak("VHS门目前是关闭状态")
                else:
                    speak(f"无法获取状态,返回值为{status}")
            else:
                speak("未识别到触发指令,请再说一遍")
        except sr.UnknownValueError:
            speak("抱歉,我没听清你说的话")
        except sr.RequestError:
            speak("抱歉,语音识别服务暂时不可用")

if __name__ == "__main__":
    while True:
        listen_for_trigger()
关于权限的说明

你提到网站托管在GitHub且有开发权限,不过咱们这个应用只是调用公开的状态接口,不需要修改GitHub上的仓库内容。如果之后需要调整接口返回字段或者部署相关服务,再用你的仓库权限去修改即可,当前实现完全依赖公开接口就能运行。

扩展建议
  • 可以自定义更多触发短语,比如把TRIGGER_PHRASES改成更口语化的表达,比如"Is VHS open?"
  • 如果需要在线部署,可以把后端逻辑放到Flask/FastAPI服务里,搭配前端Web Speech API实现网页端语音交互
  • 可以添加状态缓存,避免短时间内频繁调用接口

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:34:46