wzpan / wukong-robot

🤖 wukong-robot 是一个简单、灵活、优雅的中文语音对话机器人/智能音箱项目,支持ChatGPT多轮对话能力,还可能是首个支持脑机交互的开源智能音箱项目。
https://wukong.hahack.com/
MIT License
6.27k stars 1.33k forks source link

在树莓派zero上,播放不了回答 #47

Closed zhiwehu closed 5 years ago

zhiwehu commented 5 years ago

2019-04-04 07:26:43,632 - main - INFO - 开始录音 INFO:main:开始录音 2019-04-04 07:26:51,991 - robot.Conversation - INFO - 结束录音 INFO:robot.Conversation:结束录音 2019-04-04 07:26:56,979 - robot.ASR - INFO - baidu-asr 语音识别到了:['只,你好,'] INFO:robot.ASR:baidu-asr 语音识别到了:['只,你好,'] 2019-04-04 07:27:02,834 - robot.AI - INFO - tuling 回答:在在,我在呢,最最喜欢听见你叫我了。 INFO:robot.AI:tuling 回答:在在,我在呢,最最喜欢听见你叫我了。 2019-04-04 07:27:04,371 - robot.TTS - INFO - baidu-tts 语音合成成功,合成路径:/tmp/tmpk5qkgg2m.mp3 INFO:robot.TTS:baidu-tts 语音合成成功,合成路径:/tmp/tmpk5qkgg2m.mp3

zhiwehu commented 5 years ago

识别语音合成都没有问题,临时文件下载回来也可以播放,但是在树莓派zero上就没有播放出来声音。

开始启动时的时候的有声音,还有录音开始和结束的提示音都有。

wzpan commented 5 years ago

我暂时没想出可能原因。

不过,启动的声音、录音开始结束音、TTS合成音都是使用play命令播放,并无二致。

zhiwehu commented 5 years ago

今天在另外一块3b+上测试也是同样的问题,我直接用play命令也不能播放:

$ play /var/tmp/tmp49ct9g5j.mp3

/var/tmp/tmp49ct9g5j.mp3:

 File Size: 4.90k     Bit Rate: 16.0k
  Encoding: MPEG audio    
  Channels: 1 @ 16-bit   
Samplerate: 16000Hz      
Replaygain: off         
  Duration: 00:00:02.45  

In:0.00% 00:00:00.00 [00:00:02.45] Out:0     [      |      ]        Clip:0  

另一个终端窗口查看进程

pi@raspberrypi:~/wukong-robot $ ps -ef | grep mp3
pi        1417  1369  0 23:10 pts/0    00:00:00 play -v 1 /var/tmp/tmp0sl7br4m.mp3
pi        1423  1130  0 23:11 pts/1    00:00:00 grep --color=auto mp3

发现有一个play -v 1 /var/tmp/tmp0sl7br4m.mp3卡住了。然后发现将wukong给关掉,这时再用play就可以播放,是不是线程独占文件的问题?

wzpan commented 5 years ago

装了 pulseaudio 了吗?

zhiwehu commented 5 years ago

@wzpan 装了

pi@raspberrypi:~ $ sudo apt-get install pulseaudio -y Reading package lists... Done Building dependency tree
Reading state information... Done pulseaudio is already the newest version (10.0-1+deb9u1). The following packages were automatically installed and are no longer required: vlc-plugin-notify vlc-plugin-samba vlc-plugin-video-splitter vlc-plugin-visualization Use 'sudo apt autoremove' to remove them. 0 upgraded, 0 newly installed, 0 to remove and 12 not upgraded.

zhiwehu commented 5 years ago

现在就是play会被hang住(试过了aplay播放wav也是同样问题),在临时文件创建那里也加了f.close()也不起作用。只要把wukong关掉,再播放就没有问题。用了lsof查看也是那个mp3文件被一个play进程给hang住了。

zhiwehu commented 5 years ago

简单再说明一下流程:

  1. 关键词唤醒后,叮咚一下,开始录音,被识别,转换成文字,图灵机器人回答,再TTS合成语音,生成一个临时文件
  2. 这时wukong不播放这个语音
  3. 同时在另一个终端窗口中,用进程查看,发现有一个play进程,用lsof查看文件也是这个play进程hang在那里
  4. 这时在另一个终端窗口中,直接用play -v 1 /tmp/临时.mp3,亦被hang住
  5. 这时将wukong给关掉(ctrl + \),第4步被hang住的就可以播放了,再次运行命令播放也没有问题。

已经试过以下解决方案:

  1. 换另外一个temp目录生成临时文件
  2. 用uuid生成临时文件名,不用tempfile包,直接用open(f, "wb")写文件
  3. 换aplay,生成wav临时文件
  4. 在util.py里生成临时文件的地方加上f.close() 以上都不起作用,生成的文件在wukong关闭后都可以播放。
wzpan commented 5 years ago

我刚改了一下 SoxPlayer 的实现方式(https://github.com/wzpan/wukong-robot/commit/e12b3d107ae7613b20ef954ad762eb05abfef866 )。你看看还有没有问题。

wzpan commented 5 years ago

想了一下,有一种可能的原因,你是不是克隆悟空仓库的时候用了sudo?有可能是因为没权限写入不了文件导致阻塞了播放。

zhiwehu commented 5 years ago

@wzpan 我没有sudo去git clone,就是用pi用户克隆的。

zhiwehu commented 5 years ago

刚刚pull了最新的代码测试。

第一个终端:

pi@raspberrypi:~ $ cd wukong-robot/ pi@raspberrypi:~/wukong-robot $ git pull remote: Enumerating objects: 14, done. remote: Counting objects: 100% (14/14), done. remote: Compressing objects: 100% (3/3), done. remote: Total 16 (delta 10), reused 14 (delta 10), pack-reused 2 Unpacking objects: 100% (16/16), done. From https://github.com/wzpan/wukong-robot e248db0..74d9fc5 master -> origin/master

  • [new tag] 1.4.9 -> 1.4.9 Updating e248db0..74d9fc5 Fast-forward VERSION | 2 +- robot/Player.py | 18 ++++++------------ robot/config.py | 2 +- robot/logging.py | 9 ++------- 4 files changed, 10 insertions(+), 21 deletions(-) pi@raspberrypi:~/wukong-robot $ python3 wukong.py ... INFO:snowboy:Keyword 2 detected at time: 2019-04-06 12:02:58 INFO:snowboy:Keyword 1 detected at time: 2019-04-06 12:03:00 INFO:main:开始录音 INFO:robot.Conversation:结束录音 INFO:robot.ASR:baidu-asr 语音识别到了:['哦,您好,'] INFO:robot.AI:tuling 回答:在在,我在呢,我亲爱的小伙伴 INFO:robot.TTS:baidu-tts 语音合成成功,合成路径:/tmp/tmpijjts6g0.mp3

第二终端(同时):

pi@raspberrypi:~ $ ps -ef | grep play pi 21603 21311 0 12:03 pts/0 00:00:00 play -v 1 /tmp/tmpijjts6g0.mp3 pi 21819 21311 0 12:04 pts/0 00:00:00 play -v 1 /home/pi/wukong-robot/static/beep_hi.wav pi 21872 21311 0 12:04 pts/0 00:00:00 play -v 1 /home/pi/wukong-robot/static/beep_lo.wav pi 21990 21311 1 12:04 pts/0 00:00:00 play -v 1 /tmp/tmpjotkzb6a.mp3 pi 22009 21939 0 12:04 pts/1 00:00:00 grep --color=auto play pi@raspberrypi:~ $ ls -la /tmp/.mp3 -rw------- 1 pi pi 4248 Apr 6 11:20 /tmp/tmp0gm0iodh.mp3 -rw------- 1 pi pi 6048 Apr 6 11:20 /tmp/tmp5jl2bdmn.mp3 -rw------- 1 pi pi 3960 Apr 6 11:18 /tmp/tmpa1zc1tgj.mp3 -rw------- 1 pi pi 13752 Apr 6 11:21 /tmp/tmpb1x847mn.mp3 -rw------- 1 pi pi 7920 Apr 6 11:19 /tmp/tmpc_rzqikq.mp3 -rw------- 1 pi pi 7200 Apr 6 12:03 /tmp/tmpijjts6g0.mp3 -rw------- 1 pi pi 5760 Apr 6 11:21 /tmp/tmpjhn74bz9.mp3 -rw------- 1 pi pi 10944 Apr 6 12:04 /tmp/tmpjotkzb6a.mp3 pi@raspberrypi:~ $ lsof /tmp/.mp3 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME play 21603 pi 3r REG 179,2 7200 4578 /tmp/tmpijjts6g0.mp3

zhiwehu commented 5 years ago

可以看到上面生成的/tmp/tmpijjts6g0.mp3在play的时候被hang住了。

wzpan commented 5 years ago

你这个问题很诡异,我也不知道怎么解决了。在我的 Pi 3 上是无法复现的。

zhiwehu commented 5 years ago

@wzpan 又查了一下,发现是设备独占的问题,在热词唤醒那里(snowboydecoder.py)有一个while循环,在这里audio设备被占用了,如果运行时按ctrl+c,snowboy会退出,这时就可以播放了(通过网页发送命令),但是热词唤醒功能就没有了,因为对pyaudio不熟悉,不知道要如何处理。 不知道你是什么设备?我打印了我的设备: {'index': 0, 'structVersion': 2, 'name': 'wm8960-soundcard: - (hw:0,0)', 'hostApi': 0, 'maxInputChannels': 2, 'maxOutputChannels': 0, 'defaultLowInputLatency': 0.005804988662131519, 'defaultLowOutputLatency': -1.0, 'defaultHighInputLatency': 0.034829931972789115, 'defaultHighOutputLatency': -1.0, 'defaultSampleRate': 44100.0}

zhiwehu commented 5 years ago

把播放和录音设备分开了,解决了。