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

Python中执行Google Assistant命令无输出音频文件求助

我来帮你排查下这个问题,看起来有几个关键的地方导致命令在Python里执行异常:

问题根源分析

1. 多余的引号破坏了参数传递

你在args列表里给--device-model-id和--device-id的值加了双引号(比如'"pbx-assista"'),这会让googlesamples-assistant-pushtotalk把带引号的字符串当成参数值,而不是你实际需要的pbx-assista。在终端里用引号是为了避免shell解析特殊字符,但用subprocess的列表传参方式时,每个参数都是独立的元素,完全不需要额外加引号。

2. 输出音频的路径是相对路径,导致找不到文件

你的audio_out设置为"google_audio1314_out.wav",这是相对路径,文件会生成在Python脚本运行的当前工作目录(大概率是Asterisk的运行目录),而不是你预期的/tmp目录,所以你自然在/tmp里找不到它。

3. 异步执行且未捕获错误,无法排查问题

subprocess.Popen是异步启动进程的,你的代码直接调用后就进入循环,既没有等待命令执行完成,也没有捕获命令的错误输出。就算命令执行失败,你也看不到任何报错信息,根本没法定位问题。

修复后的代码

把这些问题修正后,代码应该能正常工作了:

#!/usr/bin/env python
import sys
from asterisk.agi import *
import subprocess

command = "googlesamples-assistant-pushtotalk"
oauth_dir = "/home/jsti/.config/google-oauthlib-tool/credentials.json"
audio_in = "/tmp/google_audio1314_in.wav"
# 改为绝对路径,确保输出到/tmp目录
audio_out = "/tmp/google_audio1314_out.wav"
agi = AGI()
agi.verbose("python agi started")
callerId = agi.env['agi_callerid']
agi.verbose("call from %s" % callerId)

# 移除多余引号,每个参数独立拆分
args = [
    command,
    '--credentials', oauth_dir,
    '--device-model-id', 'pbx-assista',
    '--device-id', 'pbx',
    '-i', audio_in,
    '-o', audio_out,
    '-v'
]

# 用subprocess.run同步执行,捕获输出方便调试
try:
    # 同步执行命令,捕获输出并转为文本格式
    result = subprocess.run(args, check=True, capture_output=True, text=True)
    agi.verbose(f"Assistant command succeeded: {result.stdout}")
except subprocess.CalledProcessError as e:
    # 命令执行失败时,把错误信息输出到Asterisk日志
    agi.verbose(f"Assistant command failed! Error: {e.stderr}")
    agi.verbose(f"Return code: {e.returncode}")
额外调试建议
  • 如果你需要循环执行这个命令,记得在每次执行后加适当的延迟,避免频繁调用导致资源问题。
  • 确保Asterisk运行用户对/tmp目录有读写权限,否则无法生成音频文件。
  • 可以先在终端里用Asterisk用户身份手动执行修正后的命令,确认能正常生成输出文件,再放到Python脚本里运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:32:08