分类目录归档:业余研究

会说话的树莓派,将文字转换为语音

树莓派带了个音频输出接口,可外接小音箱。要是能实现文本到语音转换(text2speech)的话。 它的可玩性大大的提高了,比如 起床的时候语音播报天气、朗读电子邮件…更多的发挥你的想象力吧

这里介绍两种方式:1.通过本地程序转换 2使用在线api接口,这个需要联网

本地通过软件转换

我使用的是festival 一个免费的文字转语音软件,不需要联网。

在树莓派上可直接安装

安装好后 测试下

直接输入festival可进入交互方式

或者直接通过命令行

festival 默认带的声音kal_diphone效果并不好(呃,有点模糊,电音效果?)

官方也有其他的声音,效果也不错online demo 遗憾的是这些没有开放下载

在官方FAQ http://www.cstr.ed.ac.uk/projects/festival/demofaq.html#voices

Q:I really like your demo, where can I download voice XYZ?

A: ….

The good news, though, is that we’re currently putting together a portfolio of dozens and dozens (really!) of voices which will be available to download shortly. Some voices will be available for commercial use only, some for non-commercial use only, and indeed some for both.

不知道shortly是什么时候

但是我们可以选择安装一些第三方的语音库,下面介绍两个

mbroal

官方mbroal安装说明

我按照说明做了一下,路径稍微有点不同,上面说要解压 festvox_us1到 /usr/share/festival/lib/voices, 而实际目录是/usr/share/festival/voices/ 不然会报错,可能跟festival的版本有关系

1.Install the festival voice wrapper. 安装 festvox_us1

2.Get the MBROLA voice and binary. 到 http://tcts.fpms.ac.be/synthesis/mbrola.html

下载 MBROLA binary 和 MBROLA Voices

分别选择

Raspberri_pi 注意binary要选择适用于树莓派的版本

us2: American English Male (6.3Mb) Babel Technology 也可以选择其它声音

压缩包中的文件 $ wget http://tcts.fpms.ac.be/synthesis/mbrola/bin/raspberri_pi/mbrola.tgz #里面只有一个二进制文件mbrola,把它解压到 /usr/local/bin下 $ tar -xzvf mbrola.tgz -C /usr/local/bin/

最后目录结构看起来是这样的

查看 已安装的语音

选择声音,测试下

嗯 比自带的那个声音好点…

cmu(更接近真人声音的)

1.安装 festlex-cmu

2.下载 cmu

选择声音,测试下

声音又上了一个档次,但是解析的时候能明显感觉出来有延迟。估计放到配置高点的电脑上会好些。

可以在配置文件中设置默认的声音

在线tts api接口

找到两个

1.tts-api这个接口是免费的,效果还行,起码比festival好

http://tts-api.com/tts.mp3?q=hello+world.

2.google翻译的接口

这个接口并不是官方正式提供的,不过从速度,声音效果来说是最好的(非常好!),网速好的话基本上感觉不出来延迟

点这里测试下

http://translate.google.com/translate_tts?ie=UTF-8&tl=en&q=hello+world

三个参数 q=要转换的文字; tl=文字的语言 中文选择zh-cn; ie 要转换的文字q的编码方式;

上面接口返回音频格式是mp3的,可使用mpg123 直接播放

上面两种方式可以结合着使用,比如在为联网的时候使用festival,联网使用效果更好的在线接口

参考

给树莓派添加重启关机按钮

最近一段时间开始捣鼓树莓派了,弄的都是试验性质的。经常会出现些问题 导致连不上树莓派可能是卡死或者断网什么的,有没有显示器也不知道到底是什么情况。 没办法只有拔掉电源重启了。

后来想想长期这样弄也不是办法SD卡禁不起折腾啊,于是就想办法给它添加了个“关机和重启按钮”。

这里实现上用了GPIO接口,通过读取一个接口的高低状态然后调用 重启以及关机命令。

我的pi是B版v1。GPIO接口和v2稍微不一样。具体看下图 把代码的接口定义替换成对应的就行了

rasberrypi GPIO

下面这个两幅图更容易看

树莓派v1 GPIO接口定义 树莓派v2 GPIO接口定义

另外使用pin的编号有两种方式

  1. Board Pin 这种是自然排序的,重p1到p26
  2. BCM GPIO Broadcom的编号方法 (上图中的绿色方块部分GPIO*)

我在代码中使用的是 *BCM *。

这里用到了两个GPIO接口,7和17 你也可以自己修改下。 一个用来接收按键信号,另外一个驱动led显示状态

led有三个状态 长亮:正在重启, 闪动:正在关机, 不亮:等待状态。

面包板连接 树莓派重启面包板连接图
若你有杜邦线的话也可以不通过面包板连接,按钮那个GND的线也不是必须的,用手直接触摸 GPIO7 也能起到把这个电压拉低的效果

实现代码

使用方法

按一下按钮 系统进入重启状态倒计时10秒,在这段时间内你可以接着按一下切换到关机状态。 按第三下取消关机进入等待状态。这三种状态可通过按按钮不断切换。

参考

上拉电阻和下拉电阻

使用 RPI.GPIO 模块的输入(INPUT)功能

RPI.GPIO WIKI

把树莓派打造成智能无线路由器(可对国外网站自动选择线路)

本文的目的是教大家访问特定网站时走加密线路(vpn)时更加方便不用来回切换网络

前提

能有正常上网的环境 即pi插上网线后就能上网(如何上网不在此文讨论范围)

  1. 树莓派一个 (B型的带有线网卡)
  2. USB无线网卡一个( 我的是在京东上买的 二十块钱左右)
  3. vpn账户一个,并且能正常连通上网

我这里用的是openvpn,如果你有国外vps 如何配置请查看  OpenVPN安装配置教程

在这里我只简单说下客户端的配置

开始配置

eth0是我的有线网卡 已经获自动获取了ip(我现在就是通过有线ssh控制pi的)

wlan0就是那个无线网卡了(一般情况下是wlan0,若没有的话,你可以输入lsusb,看一下有没有显示出 你的无线网卡设备 。没有的就是驱动问题。)

修改 网络配置文件 给wlan0设置固定ip 在这里我设置的是192.168.10.1

注意一定不要和eth0在同一个网段
另外若你启用了wicd等网络管理服务请关闭

1 vpn客户端配置

安装openvpn,这里我们只是用它的客户端功能(如何配置,看上面的连接)

下面是我的配置文件

需要注意的是

这几个证书文件最好写成得路径,否则执行命令

会提示找不到这几个文件
只有cd /etc/openvpn/ 然后 openvpn client.conf 才行
若配置的没有有问题的话 输入ifconfig 会多出来一个虚拟网络设备tun0

记住这两个地址 inet addr:10.2.2.10 P-t-P:10.2.2.9 待会要用到

2 安装路由软件

下一步就是安装两个软件hostapd isc-dhcp-server

1) AP热点 hostapd 服务

刚开始的时候可以不加密直接使用默认配置就行 只需要修改下 ssid 和channel

注意: 默认是不加密的连接,建议等你完全测试成功了再修改为wpa加密的(配置文件中有各种模版)

2) ip地址自动分配 dhcpd服务

注意:

  1. 配置文件中的网段,子网掩码,以及网关要和给wlan0设置的静态ip【相对应】wlan0就是这个网段的网关)
  2. dns目前最好是配置成google的dns。因为国内的在根上都被污染了, google的dns走vpn的话没问题不会被污染,相应的解析速度也会变慢

(还有一种解决办法就是修改hosts,但是这个太麻烦,国外大网站不止一个域名,ip地址也是多个,收集这些信息也挺麻烦,相对来说收集国外网站ip段来说还是容易的)

3) 全部配置完毕后 ,启动服务

or

hostapd -ddK /etc/hostapd.conf #方便查看调试信息

4. 连接测试

现在你拿出手机搜索一下无线信号 有没有 [test_ap] 然后连接上试试。

若能成功连接并且获取ip,则表明你的pi无线路由器了

但是现在你得到手机还不能上网
需要设置一下NAT转发,即把wlan0上的网络连接转发到eth0上面通过有线来上网

3. 路由转发

———-分割线下面这些 觉得麻烦的可以不看,我在后面提供了一个脚本 不过最好还是看一下,有助于理解————-

  • 1)
    将192.168.10.0/24 这个网段的流量转发到 eth0上
    注意:192.168.2.11 是eth0的ip

    目前位置,手机连上无线后应该就能上网了,但访问国外网站还是不行的
  • 2)

    下面事例中我用8.8.8.8 代指国外ip ,你可以任意修改成“任意国外ip地址”

    将192.168.10.0/24 并且是去往8.8.8.8(任意国外ip地址) 的流量通过 10.2.2.10转发出去

  • 3)
    注意:目前默认的网关仍然是eth0 192.168.2.1
    看一下下面的路由表 默认是从 192.168.2.1出去的

    所以我们要添加一个路由项 (10.2.2.9 就是上面tun0 p-t-p 那一项,我的理解就是vpn的虚拟网关)。
    把去往8.8.8.8的流量路由到vpn上面去,不走原来的路线了

    用traceroute命令可以看到 现在走的是vpn

    若你只设置8.8.8.8的路由而不设置该ip的NAT转发,在pi上没有什么问题,会按照你的设置自动选择线路

    但是无线网络下面的终端(手机等)还是只能访问国内的ip地址 你设置的“国外ip”将不能访问(假如原来能访问的话hehe)

    总的来说 路由规则,NAT转发缺一不可

    vpn

  • 4)
    现在国外的网站能访问了,我们再把第一步在重复一遍 设置默认转发规则
    *注意:这一步一定要放到最后执行 *iptables规则就像一个筛子 第一层被挡住以后就不会往下走了

—————————–结束——————————–

我写了个脚本,python写的(shell不是很熟悉)

可以把一些网段自动转换称shell脚本 已经传到了 git@osc 上面

你可以 用git检出一份

或者直接下载zip压缩包

check.py 检查你前几步的设置是否有效
若你用的是openvpn 一般不需要修改,直接运行即可

安照提示运行上述命令

然后执行

以后若ip信息都没有变化的话 ,直接运行如下命令即可

最后

  1. route表是我从网上搜集的,只有几个常用的网段,不是很全。
  2. 上述过程我检查了几遍,但难免有疏漏的地方。若您发现请指正

原文地址