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
相关产品推荐
相关产品推荐

