wukong-robot源码解读
目录解读
./
└── wukong-robot-master
├── docker
│ ├── Dockerfile
│ └── DockerfileArm
├── docs
│ ├── AI.html
│ ├── ASR.html
│ ├── Brain.html
│ ├── config.html
│ ├── ConfigMonitor.html
│ ├── constants.html
│ ├── Conversation.html
│ ├── drivers.html
│ ├── genindex.html
│ ├── index.html
│ ├── logging.html
│ ├── _modules
│ ├── modules.html
│ ├── objects.inv
│ ├── Player.html
│ ├── plugin_loader.html
│ ├── plugins.html
│ ├── py-modindex.html
│ ├── robot.drivers.html
│ ├── robot.html
│ ├── robot.sdk.html
│ ├── search.html
│ ├── searchindex.js
│ ├── snowboy.html
│ ├── _sources
│ ├── _static
│ ├── statistic.html
│ ├── TTS.html
│ ├── Updater.html
│ ├── utils.html
│ └── wukong.html
├── LICENSE
├── plugins
│ ├── Camera.py
│ ├── CleanCache.py
│ ├── Echo.py
│ ├── Email.py
│ ├── Geek.py
│ ├── __init__.py
│ ├── LocalPlayer.py
│ ├── Poem.py
│ ├── __pycache__
│ └── Volume.py
├── README.md
├── requirements.txt
├── robot
│ ├── AI.py
│ ├── ASR.py
│ ├── BCI.py
│ ├── Brain.py
│ ├── ConfigMonitor.py
│ ├── config.py
│ ├── constants.py
│ ├── Conversation.py
│ ├── drivers
│ ├── __init__.py
│ ├── logging.py
│ ├── NLU.py
│ ├── Player.py
│ ├── plugin_loader.py
│ ├── __pycache__
│ ├── sdk
│ ├── statistic.py
│ ├── TTS.py
│ ├── Updater.py
│ └── utils.py
├── server
│ ├── __pycache__
│ ├── server.py
│ ├── static
│ └── templates
├── snowboy
│ ├── __init__.py
│ ├── __pycache__
│ ├── resources
│ ├── snowboydecoder.py
│ ├── snowboydetect.py
│ └── _snowboydetect.so
├── static
│ ├── beep_hi.wav
│ ├── beep_lo.wav
│ ├── camera.wav
│ ├── default.yml
│ ├── off.wav
│ ├── on.wav
│ ├── qa.csv
│ ├── wukongbiechao_pi.pmdl
│ ├── wukongbiechao.pmdl
│ ├── wukong_pi.pmdl
│ ├── wukong.pmdl
│ ├── wukongxingxing_pi.pmdl
│ ├── wukongxingxing.pmdl
│ └── zhimakaimen.pmdl
├── temp
│ ├── 6c9b01528e3a408f94cc5e74618ad4e4.mp3
│ ├── a8d27931414101815a16234486c32759.mp3
│ ├── baidustt.ini
│ ├── DIR
│ ├── f71ad814cf304c86550c4c0873025f0f.mp3
│ └── wukong.log
├── tools
│ ├── make_json.py
│ ├── __pycache__
│ ├── solr_api.py
│ └── solr_tools.py
├── VERSION
└── wukong.py
docker 文件夹
wukong-robot项目的镜像生成文件
docs 文件夹
wukong-robot项目的文档文件
plugins 文件夹
wukong-robot项目相关插件。如摄像头、缓存清除、邮件、极客模式、播放器、音量等
requirements 文件
记录了wukong-robot项目运行相关依赖包
server 文件夹
wukong-robot项目后台网页服务代码
snowboy 文件夹
wukong-robot项目使用的snowboy热词唤醒功能
static 文件夹
wukong-robot项目使用的资源文件,如声音文件,配置文件等
tools 文件夹
可能会用到的工具。如文件格式转换、引擎切换等
robot 文件夹
wukong-robot项目核心代码存放的文件夹。里面包含主要实现逻辑、封装的第三方开发包、及树莓派驱动。封装的第三方开发包在sdk文件夹。包含阿里、百度、腾讯、讯飞等开发包的封装
树莓派驱动在drivers文件夹。包含spi led等驱动主要实现逻辑有TTS、播放器、ASR、自升级、NLU、日志、配置加载、技能控制等
wukong.py 文件
wukong-robot项目运行的入口文件
一、wukong.py
Wukong类的公开属性有
- bci。封装后的MUSE接口对象
- detector。对snowboy进行封装后的唤醒词检测对象
和方法
- init。初始化。主要进行变量初始化,配置检查,脑机接口初始化
- _loop_event 死循环变量,检测转换相应
- _signal_handler 信号处理函数
- _detected_callback 检测唤醒词回调函数
- _do_not_bother_on_callback 勿扰模式打开
- _do_not_bother_off_callback 勿扰模式关闭
- _interrupt_callback 中断模式
- _init_aiy_button_event 初始化AIY按钮
- run。主运行程序
- initDetector。初始化唤醒词检测对象
- help。打印帮助
- md5。计算md5
- fetch/update。检测/执行更新
- upload。上传 QA 数据集
- restart。重启 wukong-robot
- train。生成snowboy模型
- profiling。运行过程中打印耗时数据,通过私有变量_profiling来控制
dev。在测试环境中运行,通过私有变量_dev来控制
二、唤醒词检测-snowboy
- snowboydetect.py。swig封装的python接口
- snowboydecoder.py。 对snowboy库进行封装的源码文件
snowboydecoder:
-
logger。日志记录
-
TOP_DIR
-
RESOURCE_FILE
-
DETECT_DING。定义声音文件
-
DETECT_DONG。定义声音文件
-
ERROR_HANDLER_FUNC。定义asound库出错后的回调接口
-
c_error_handler。asound库出错后的回调
函数: -
py_error_handler。asound库出错后实际执行的函数
-
no_alsa_error。asound库出错回调管理器
-
play_audio_file。播放声音文件
类: -
RingBuffer。环形缓冲区。实现多次部分写入,一次全部读出
-
ActiveListener。激活并开始循环热词监测。
-
HotwordDetector。检测麦克风是否有自定义的热词。
-
ActiveListener
ActiveListener是对snowboy库的封装,以更方便地使用热词唤醒功能
ActiveListener生成对象时,会将热词模型文件列表传入snowboy库。热词模型文件可通过调用snowboy.kitt.ai网络接口生成
ActiveListener对象生成后,就可以通过listen方法进行热词监听了。listen方法主要做了以下几件事情:
打开录音设备,以持续地将录到的声音存储在前面定义的RingBuffer对象中
在设定的循环次数recording_timeout和设定的安静次数silent_count_threshold内循环读取RingBuffer对象中的值,然后调用snowboy库的RunDetection接口进行热词唤醒检测。
检测次数到或检测到热词后退出listen方法
在退出listen方法之前,保存从ActiveListener对象创建到本次记录完成的声音到以时间命名的wav文件中 -
HotwordDetector
HotwordDetector是对snowboy库的封装。跟ActiveListener相比可设定的参数更多,如输入声音增益,每一个唤醒词的灵敏度等;可在检测到热词后马上调用回调函数,增加反应的实时性;在检测到唤醒词后经过一定延时才进行下一次热词检测HotwordDetector生成对象时,会将热词模型文件列表、每一个唤醒词的灵敏度传入snowboy库。同时设置snowboy库的输入声音增益
HotwordDetector对象生成后,就可以通过start方法进行热词监听了。start方法主要做了以下几件事情:
打开录音设备,以持续地将录到的声音存储在前面定义的RingBuffer对象中
针对每一个唤醒词注册唤醒后的回调函数
在内部不断的循环中进行热词检测
检测到热词后调用本热词对应的回调函数
检测到热词后在设定的循环次数recording_timeout和设定的安静次数silent_count_threshold达到再开始下一次检测
在开始下一次检测之前,保存本次热词检测记录的声音到以时间命名的wav文件中
HotwordDetector对象还提供了terminate方法来强制停止start方法的循环过程