V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
namco1992
V2EX  ›  Python

你的树莓派还在吃灰吗?来试试把它改造成语音助手吧!

  •  
  •   namco1992 · 2016-08-29 22:41:35 +08:00 · 22735 次点击
    这是一个创建于 3002 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好,我又不要脸地来骗 star 了~

    可能有点标题党的成分,但是我的树莓派已经吃灰很久了。所以这次写了个小程序,花一点微小的成本把树莓派改造成语音助手,何乐而不为呢?其实这个 idea 在去年 Amazon 的 Echo 没出的时候就有了,当时就写了一个,现在是一个重构版本。 Amazon 的 Echo 还是不太符合中国国情,不如试试自己搭建一个屌丝版的 Echo 吧~

    这次的树莓派语音助手做成了我写的一个小工具 voicetools 的一个示例程序, voicetools 只是一个尽可能方便大家做语音合成和语音识别的一个 wrapper ,让大家一行代码完成语音识别和合成的工作。

    项目地址:https://github.com/namco1992/voicetools

    voicetools 介绍

    语音识别及语音合成

    from voicetools import BaiduVoice
    # api key 及 secret key 请在百度语音官方网站注册获取
    token = BaiduVoice.get_baidu_token('YOUR_VOICE_API_KEY', 'YOUR_VOICE_SECRET')
    bv = BaiduVoice(token)
    # 语音识别
    results = bv.asr('path/to/your/audio/file')  # 返回识别结果列表,可选参数见百度语音文档
    # 语音合成
    audio = bv.tts('你好')  # 返回 MP3 格式二进制数据,可选参数见百度语音文档
    

    还集成了两个 AI 类型的 API ,就不占篇幅了,有兴趣可以移步项目地址查看。

    树莓派语音助手介绍

    简介

    该示例程序基于 voicetools ,遵循最简单的 one-in-one-out ,只需要在该示例程序的基础上添加关键词和对应执行的动作,就可以扩展成为个性化的专属助手。 目前示例程序实现的功能有语音提醒今明两天天气预报查询

    特性

    • 使用 redis 作缓存,提升语音助手的反应速度。同样的问题,第二遍不再发生网络请求。
    • 使用图灵机器人 API ,除了预设功能外,所有问题都会有答案。
    • 非常简单的“ receive-process-execute-feedback ”逻辑,易于扩展。
    • 有一个心情阈值,目前是预设在配置文件中的。不一定会对你的命令言听计从。(只是为了好玩)

    需要准备什么?

    • 一块树莓派
    • 一个麦克风
    • 一个扬声器
    • 一个传感器(用于唤醒语音助手,我使用的是声音传感器,当然任何传感器都可以)

    如何运行和扩展?

    扩展只需三步,且只需要关注你要实现的功能即可。请移步项目地址参考实例。

    最后,如果大家有兴趣的话,请给个 star 鼓励一下,非常感谢~

    如果有任何问题,欢迎 PR 和 Issue 。

    58 条回复    2017-06-16 13:22:51 +08:00
    roadna
        1
    roadna  
       2016-08-29 22:44:15 +08:00   ❤️ 1
    我的树莓派还真在吃灰。支持一个。
    namco1992
        2
    namco1992  
    OP
       2016-08-29 22:47:55 +08:00
    @roadna 哈哈,我的已经吃灰一年多了...
    andyhuzhill
        3
    andyhuzhill  
       2016-08-29 23:05:09 +08:00
    我的树莓派已经吃灰 3 年了 现在只在上面跑个 HTTP 代理 FQ
    namco1992
        4
    namco1992  
    OP
       2016-08-29 23:16:32 +08:00
    @andyhuzhill 能用起来就不算吃灰吧~我现在改成语音助手之后,早上起来问下天气,然后记点今天该做的事情。虽然手机都能做,但是语音最大的优点就是 hands-off ,拍拍手就能发指令,不用找手机了。
    manhere
        5
    manhere  
       2016-08-29 23:26:53 +08:00 via iPhone
    麦克风和语音传感器不是重复吗?
    cnkuner
        6
    cnkuner  
       2016-08-29 23:29:20 +08:00 via Android
    被某人破解后 24 小时监听。嗯啊嗯啊卡木昂
    huangtao728
        7
    huangtao728  
       2016-08-29 23:32:36 +08:00 via Android
    比较好奇心情阈值大概是什么效果?
    namco1992
        8
    namco1992  
    OP
       2016-08-29 23:33:02 +08:00
    @manhere 麦克风拿来做唤醒的话很困难,而传感器就比较方便,阈值可调。还有就是,传感器唤醒的话并不限于语音传感器,距离感应、光感应都可以,比如说挥挥手唤醒之类的,可玩性好一点。
    namco1992
        9
    namco1992  
    OP
       2016-08-29 23:34:21 +08:00
    @huangtao728 就只是做着玩的...比如说阈值是 0.6 ,就是有 60%的概率是积极心态回复, 40%是消极回复。但是积极回复和消极回复的文本都是写在配置文件中的,并不是随机。
    namco1992
        10
    namco1992  
    OP
       2016-08-29 23:35:19 +08:00
    @huangtao728 还有就是这个心情阈值只是影响回复的内容,并不会真的拒绝执行指令,当然想要真的拒绝执行指令也不是不可以...
    scnace
        11
    scnace  
       2016-08-29 23:37:01 +08:00 via Android
    吃灰一年的来看看 。。。然后继续吃灰
    namco1992
        12
    namco1992  
    OP
       2016-08-29 23:37:34 +08:00
    @cnkuner 呃,保证连接自己的 wifi 并且保护 wifi 安全风险会小一点吧...
    huangtao728
        13
    huangtao728  
       2016-08-29 23:54:00 +08:00 via Android
    @namco1992
    挺有意思啊,相当于加入了情绪的积累?
    不过我以为是太过频繁发问就消极回复,消极程度递增...
    a302800411
        14
    a302800411  
       2016-08-30 00:19:44 +08:00
    树莓派这个东西,做语音助手,最主要的问题在于,远距离( 5m )声音采集和降噪。
    http://www.xfyun.cn/services/mic#list_wrap 讯飞的五麦环形阵列
    namco1992
        15
    namco1992  
    OP
       2016-08-30 09:16:31 +08:00
    @a302800411 有条件当然可以上更好的装备,但是我只是想让吃灰的树莓派发挥下余热,花点小成本还 ok 。如果专门为了这个买个麦克风阵列,就有点背离初衷了呢~
    namco1992
        16
    namco1992  
    OP
       2016-08-30 09:21:12 +08:00
    @huangtao728 你的想法也不错啊,但是这个功能只是锦上添花做着玩玩而已,所以暂时还没考虑更复杂的逻辑
    wensonsmith
        17
    wensonsmith  
       2016-08-30 09:30:37 +08:00
    支持! 好项目~
    lan894734188
        18
    lan894734188  
       2016-08-30 09:38:10 +08:00 via Android
    安个 Google now
    ijse
        19
    ijse  
       2016-08-30 09:38:24 +08:00
    之前做过一个,用的是国外一个开源语音识别项目,配置起来很麻烦。。

    最终效果也不太好,麦克风稍离远一点,识别成功率直线下降
    namco1992
        20
    namco1992  
    OP
       2016-08-30 09:42:09 +08:00
    @ijse 是的,我也尝试了很多方法,最后选了百度语音的 API ,并且也没有选用 SDK ,就是为了最大程度上做到开箱即用,不要配置太麻烦,把热情都磨没了。
    然后识别率的话...只能说一分钱一分货,不差钱就可以像上面哥们一样上阵列...
    namco1992
        21
    namco1992  
    OP
       2016-08-30 09:45:31 +08:00
    @lan894734188 去年的时候尝试过 google 的 TTS ,现在貌似也不对外提供服务了。并且由于中国国情,使用起来也不甚方便。至于 google now 还没有尝试过呢~
    Phariel
        22
    Phariel  
       2016-08-30 09:52:40 +08:00 via Android
    淘宝上有卖科大讯飞 TTS 的 Arduino 模块 我买了一个还没用过 太懒了。。。
    anym0us
        23
    anym0us  
       2016-08-30 09:55:33 +08:00
    还能有其他玩法嘛,买来装了个 KALI 然后嘿嘿嘿,
    goreliu
        24
    goreliu  
       2016-08-30 09:58:30 +08:00
    问题是,如果在手机上就可以实现,为什么要常年开着一个树莓派在那耗电。而且天气预报之类还是看比听更直观。语言提醒的话,总不能抱着树莓派各地跑,而手机要方便很多。

    很多和树莓派相关的用法,都存在这个问题。
    namco1992
        25
    namco1992  
    OP
       2016-08-30 10:16:26 +08:00
    @goreliu 呃,我只是实现一个摆在家里的语音助手,并没有打算移动它。你可以参考 Amazon 的 Echo 。至于功能的话,我的初衷是我实现两个小功能抛砖引玉,理论上来说有了语音输入和对应的关键词输出,可以自行实现任何功能搭配起来。
    rainsun
        26
    rainsun  
       2016-08-30 10:35:46 +08:00
    手动 mark
    achaocha
        27
    achaocha  
       2016-08-30 10:50:24 +08:00
    手动 mark
    Flygoat
        28
    Flygoat  
       2016-08-30 10:59:06 +08:00 via iPad
    借楼问一下各位知道 RPI3 有 Aarch64 下 HardFP 的编译器吗?还有 VideoCore IV 的 VC04_services 驱动有 Aarch64 的替代品吗?
    t0byxdd
        29
    t0byxdd  
       2016-08-30 11:00:33 +08:00
    表示树莓派现在就做梯子用。。。
    wujunze
        30
    wujunze  
       2016-08-30 11:03:51 +08:00
    感谢分享 可以试试
    tabris17
        31
    tabris17  
       2016-08-30 12:03:13 +08:00
    声音传感器唤醒树莓派这个怎么弄?
    ksc010
        32
    ksc010  
       2016-08-30 12:30:54 +08:00
    楼主用的 usb 的麦克吗?
    我想适配蓝牙耳机的
    missdeer
        33
    missdeer  
       2016-08-30 14:01:29 +08:00
    其实我想要楼主的麦克风 /扬声器 /传感器 taobao 链接
    namco1992
        34
    namco1992  
    OP
       2016-08-30 14:03:32 +08:00
    @missdeer ::doge:: 这个随便找吧,我也是买的最普通的,那些卖数电模电器件的店都有的
    namco1992
        35
    namco1992  
    OP
       2016-08-30 14:11:39 +08:00
    @tabris17 首先设定好你的传感器信号输入端,我是用的 4 ,然后设置初始电平,如果是初始高电平,亦即检测到下降沿时唤醒树莓派,然后搞一个 loop 持续监测就可以了。代码你可以参考 https://github.com/namco1992/voicetools/blob/master/examples/raspi_assistant/assistant.py
    namco1992
        36
    namco1992  
    OP
       2016-08-30 14:16:01 +08:00
    @ksc010 我是用的 USB 的麦克风,蓝牙的确没有试过,我的是 2 代树莓派,也没买蓝牙适配器。蓝牙的话可能声音的输入输出都需要另外设置。
    tabris17
        37
    tabris17  
       2016-08-30 14:17:38 +08:00
    @namco1992 就是树莓派通过 GPIO 连接传感器,然后树莓派上跑个进程,轮询传感器的数据。也就是说树莓派是一直“醒”着的咯?否则怎么跑进程轮询呢?
    namco1992
        38
    namco1992  
    OP
       2016-08-30 14:32:30 +08:00
    @tabris17 我对“醒”的定义是树莓派接收到声音信号,进入接收语音指令的状态。在没有接收到声音信号时,肯定是需要一个进程来进行下降沿检测,但是我认为这时候并不是“醒”。
    tabris17
        39
    tabris17  
       2016-08-30 14:39:43 +08:00
    @namco1992 原来如此,明白了,谢谢啦
    xuecat
        40
    xuecat  
       2016-08-30 16:27:38 +08:00
    唉,我还是吃灰吧!我估计我配不来。
    namco1992
        41
    namco1992  
    OP
       2016-08-30 16:47:31 +08:00
    @tabris17 不客气~
    namco1992
        42
    namco1992  
    OP
       2016-08-30 16:48:41 +08:00
    @xuecat 哈哈,我觉得我把步骤写得比较详尽了呢,应该不至于太复杂吧。不试试怎么就说做不来呢
    vikeria
        43
    vikeria  
       2016-08-30 22:09:07 +08:00 via iPhone
    吃灰加一,偶尔拿出来跑点东西
    cpp255
        44
    cpp255  
       2016-08-30 22:19:51 +08:00
    吃灰中,之前还当下载用了
    mumuy
        45
    mumuy  
       2016-08-31 08:59:53 +08:00
    3 出来的时候就买了,一直没用
    namco1992
        46
    namco1992  
    OP
       2016-08-31 09:12:55 +08:00
    @mumuy 3 自带了 wifi 和蓝牙,应该还是会方便很多吧
    lavande
        47
    lavande  
       2016-08-31 11:54:18 +08:00
    我之前也有这样的想法,实际上研究了好一阵子,发现有不少开源的代码可以用,然而不知道买什么样的扬声器和麦克风!同求淘宝链接示范。。。。。
    namco1992
        48
    namco1992  
    OP
       2016-08-31 14:17:13 +08:00
    @lavande 麦克风搜“树莓派 麦克风”,扬声器就搜“小音箱 3.5mm ”,或者你想用 USB 接口的也行。主要是我之前买的店家已经下架了,所以你自行挑选就好了,都大同小异。
    ThomasZ
        49
    ThomasZ  
       2016-08-31 14:50:16 +08:00
    看到这个我才想起来我还有一块 pi 。。。。 回来好好研究一下这个
    lavande
        50
    lavande  
       2016-08-31 16:04:42 +08:00
    @namco1992 好嘞,多谢
    mimicom
        51
    mimicom  
       2016-09-02 22:12:33 +08:00
    艾玛. 哈哈. 早就有这个想法, 还注册了讯飞的 api . 还没用.
    mimicom
        52
    mimicom  
       2016-09-02 22:52:06 +08:00
    怎么百度的 sdk 除了安卓就是 ios 的. 没有 linux / windows 平台的啊.
    namco1992
        53
    namco1992  
    OP
       2016-09-03 10:47:29 +08:00
    @mimicom 所以我才用的 API 啊...如果你要用 SDK 的话,还是讯飞的最全最强吧,只是百度的比较接互联网的地气而已。
    lan894734188
        54
    lan894734188  
       2016-09-20 13:30:29 +08:00 via Android
    @namco1992 GCP 有提供 api
    min614130
        55
    min614130  
       2016-10-25 14:39:58 +08:00
    能问个问题吗? record.wav 是做什么用的?需要提前录音放进去吗?报错提示 No such file or directory: 'record.wav'
    namco1992
        56
    namco1992  
    OP
       2016-10-25 15:58:35 +08:00   ❤️ 1
    @min614130 “ record.wav ”是一个缓存文件,存储了你最后一次录音,在后续做语音识别时会用到。

    然后建议你贴出完整的 traceback 信息,不然我也没法判断是哪里出了问题。

    最后你可以把问题提至: https://github.com/namco1992/voicetools/issues
    min614130
        57
    min614130  
       2016-10-26 08:44:12 +08:00
    @namco1992 谢谢,问题解决了
    mrcong
        58
    mrcong  
       2017-06-16 13:22:51 +08:00
    我的树莓派一边吃灰一边跑打印机 airPrint 服务
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   915 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:21 · PVG 04:21 · LAX 12:21 · JFK 15:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.