机器人应用

智能机器人(13):语音识别

  • 1、语音处理

语音处理包括两部分:(1) 一块是语音识别SR:Speech Recognition,也称为自动语音识别ASR:Automatic Speech Recognition;(2) 另一块是语音合成SS:Speech Synthesis,也称为TTS:Text-To-Speech。
语音处理目前多为基于语音识别芯片的嵌入实现,也有靠软件实现的例如商用的IBM的Viavoice和MS的SAPI以及开源的Sphinx和Julius等,都是些面向非特定人的大词汇量的连续语音识别系统。

  • 2、语音识别

语音识别,属于模式识别的一种应用,将未知的输入语音的模式和已知语音库里的参考模式逐一比较,所获得的最佳匹配的参考模式即为识别出来的结果。
语音识别目前大多是基于统计模式的,主流算法有基于参数模型的隐式马尔可夫模型HMM方法、基于人工神经网络ANN和支持向量机SVN的识别方法等。

  • 3、识别模型

(1)根据语音的机理,语音识别大框架可以分为语音层和语言层两个层级,可以理解为语音层 即子音母音或者叫声母韵母,而语言层则是sequence of words。(2) 根据功能,连续语音识别系统,主要分为特征提取,声学模型训练,语言模型训练、解码器和搜索算法四大块。

更琐碎的分为:
1、预处理。滤除次要信息和背景噪声,对语音信号作端点检测从而找出语音始末位置,假设在10-30ms内语音是平稳的从而将语音分帧。
2、特征提取。背景过滤,保留能够反映语音本质特征的信息,取出反映语音信号特征的关键参数形成特征向量序列,获得特征向量后由此特征向量通过计算余弦值可以初步获得被选的单词文本。
特征提取方法都是频谱衍生的,sphinx是用Mel频率倒谱系数MFCC。首先用FFT将时域信号转化成频域,之后对它的对数能量谱依照Mel刻度分布的三角滤波器组进行卷积,最后对各滤波器输出所构成的向量进行离散余弦变换DCT,取其前N个系数。sphinx用大概10ms的帧frames去分割语音波形,然后对每帧提取可以代表该帧语音的39个数字,这39个数字就是该帧语音的MFCC特征,即特征向量。
3、字典,用于选练声学模型。
4a、声学模型,通常是隐式马尔科夫模型,从而由声音特征可以获得音素单元。
4b、声学模型训练,由训练语音库的特征参数训练出声学模型参数。语音识别时将待识别的语音的特征参数同声学模型进行匹配得到识别结果。目前语音识别系统多用隐式马尔可夫模型HMM进行声学模型建模。HMM模型的建模单元,可以是音素,音节,词等各个层次。对于小词汇量的语音识别系统,可以用音节进行建模。对于词汇量大的识别系统,一般选取音素即声母/韵母进行建模。识别规模越大识别单元选取的越小。HMM是对语音信号的时间序列结构建立统计模型,将其看作一个数学上的双重随机过程:一个是用具有有限状态数的Markov链来模拟语音信号统计特性变化的隐含(马尔可夫模型的内部状态外界不可见)的随机过程,另一个是与Markov链的每一个状态相关联的外界可见的观测序列(通常就是从各个帧计算而得的声学特征)的随机过程语音识别中使用HMM,通常是用从左向右单向、带自环、带跨越的拓扑结构来对识别基元建模,一个音素就是一个三至五种状态的HMM,一个词就是构成词的多个音素的HMM串行起来构成的HMM,而连续语音识别的整个模型就是词和静音组合起来的HMM。

5a、语言模型,训练文本序列,除了包括前述字典,还有额外材料。
5b、语言模型训练,语言模型是用来计算一个句子出现概率的概率模型。它主要用于决定哪个词序列的可能性更大,或者在出现了几个词的情况下预测下一个即将出现的词语的内容。换个说法即语言模型是用来约束单词搜索的。语言模型分为字典知识、语法知识、句法知识三个层次,Sphinx中是采用二元语法和三元语法的统计语言概率模型,也就是通过前一个或两个单词来判定当前单词出现的概率P(w2| w1),P(w3| w2, w1)。
6、解码和搜索算法,通过语言模型和字典,给出概率可能的结果。
解码即指语音技术中的识别过程。根据己经训练好的HMM声学模型、语言模型及字典建立一个识别网络,根据搜索算法在该网络中寻找最佳的一条路径,这个路径就是能够以最大概率输出该语音信号的词串。所以解码操作即指搜索算法:是指在解码端通过搜索技术寻找最优词串的方法。为在搜索中利用各种知识源,通常要进行多遍搜索,第一遍使用代价低的知识源(如声学模型、语言模型和音标词典),产生一个候选列表或词候选网格,在此基础上进行使用代价高的知识源(如4阶或5阶的N-Gram、4阶或更高的上下文相关模型)的第二遍搜索得到最佳路径。

4、sphinx

Sphinx产生于卡内基梅隆大学CMU,最早由李开复Kai-Fu Lee开发于1987年,是一个大词汇非特定人连续语音识别系统。pocketSphinx是Sphinx的桌面版,词汇量中等计算量较小。
组成包括以下:
1、Sphinxbase — Pocketsphinx所需要的支持库,主要完成的是语音信号的特征提取;
2、Pocketsphinx —用C语言编写的轻量级识别库,主要是进行识别的。
3、Sphinx3 — 为语音识别研究用C语言编写的解码器
3、Sphinxtrain —声学模型训练工具
4、CMUclmtk —语言模型训练工具

  • 5、Linux应用

1、安装需要的pocketsphinx包
$ sudo apt-get install pocketsphinx-hmm-wsj1 #install HMM of Pocket Sphinx
$ sudo apt-get install pocketsphinx-lm-wsj #install LM of Pocket Sphinx
$ sudo apt-get install python-pocketsphinx #install the Python extension of Pocket Sphinx
2、验证能够跑得起来
$ pocketsphinx_continuous
READY….
出现ready安装成功
3、文件说明
(1)安装后,模型位于/usr/share/pocketsphinx/model文件夹,里面hmm表示隐马尔可夫声学模型,lm表示language model语言模型。
(2)语言模型,lm/en_US文件夹,包括cmu07a.dic和hub4.5000.DMP。
(3)声学模型,hmm/en_US/hub4wsj_sc_8k文件夹,包括:feat.params/mdef/means/noisedict/sendump/transition_matrices/variances
4、再用默认的模型测试下
$ pocketsphinx_continuous -hmm /usr/share/pocketsphinx/model/hmm/en_US/hub4wsj_sc_8k -lm /usr/share/pocketsphinx/model/lm/en_US/hub4.5000.DMP -dict/usr/share/pocketsphinx/model/lm/en_UScmu07a.dic
$ pocketsphinx_continuous -lm  ~/catkin_ws/src/rbx1/rbx1_speech/config/nav_commands.lm  -dict ~/catkin_ws/src/rbx1/rbx1_speech/config/nav_commands.dic

5、怎样建立英文的语言模型
(1)建立语料库,vi corpus.txt
(2)利用在线工具LMTool建立语言模型,http://www.speech.cs.cmu.edu/tools/lmtool.html,COMPILE KNOWLEDGE BASE。
(3)把得到的文件解压,即可得到.dic和.lm文件。
$ tar xzf ***.tar.gz
测试:
$ pocketsphinx_continuous -hmm /usr/share/pocketsphinx/model/hmm/en_US/hub4wsj_sc_8k -lm /usr/share/pocketsphinx/model/lm/en_US/hub4.5000.DMP -dict /usr/share/pocketsphinx/model/lm/en_UScmu07a.dic
英文的识别,尚好,还可以。

6、如何建立中文普通话的语言模型
官网上:声学模型,是zh_broadcastnews_16k_ptm256_8000.tar.bz2;语言模型,是zh_broadcastnews_64000_utf8.DMP;字典文件,是zh_broadcastnews_utf8.dic。
如果自安装:pocketsphinx-0.7/model/hmm/zh/tdt_sc_8k目录下是中文声学模型,pocketsphinx-0.7/model/lm/zh_CN目录下是中文语言模型,
(1)下载中文普通话语言模型MandarinLanguageModel:zh_broadcastnews_utf8.dic和zh_broadcastnews_64000_utf8.DMP。
(2)下载中文普通话新闻播音声学模型MandarinBroadcastNewsAcousticModels:zh_broadcastnews_16k_ptm256_8000文件夹
(3)解压缩
$ tar xjf zh_broadcastnews_16k_ptm256_8000.tar.bz2
(4)得到的声学模型包括以下:feat.params/mdef/means/noisedict/sendump/transition_matrices/mixture_weights/variances
(3)测试,
$ pocketsphinx_continuous -hmm ~/zdhSpeech2/zh_broadcastnews_ptm256_8000 -lm ~/zdhSpeech2/zh_broadcastnews_64000_utf8.DMP -dict ~/zdhSpeech2/zh_broadcastnews_utf8.dic
中文的是被效果,不咋的,估计还是得训练模型。

7、语言模型的训练
(0)准备语料库,产生词汇表,每个utterances由 <s> 和 </s>分隔,结尾不留“n”。
#vi weather.txt
(1)命令text2wfreq:统计文本文件中每个词出现的次数,得到后缀为wfreq的文件。命令wfreq2vocab:统计文本文件中含有多少个词,即有哪些词。
# text2wfreq < weather.txt | wfreq2vocab > weather.tmp.vocab
(2)text2idngram:列举文本中出现的每一个n元语法。产生一个二进制文件,含有一个n元数组的数值排序列表,对应于与词有关的的N-Gram。
# text2idngram -vocab weather.vocab  -idngram weather.idngram < weather.closed.txt
(3)idngram2lm:输入文件包括一个idngram文件,一个vocab文件和一个ccs文件,输出是一个后缀为binlm的语言模型文件。其中ccs文件指句首和句尾的静音<s>和</s>
#idngram2lm -vocab_type 0 -idngram weather.idngram -vocab weather.vocab -arpa weather.arpa
(4)命令binlm2arpa:是将binlm文件转换为实验中需要的arpa格式语言模型文件。
(5)#sphinx_lm_convert -i weather.arpa -o weather.lm.DMP
如果语言模型比较大,最好就转换为CMU的二进制格式 (DMP),这样可以加快加载语言模型的速度,减少解码器初始化的时间。但小模型来说就这个必要,因为sphinx3能处理这两种后缀名的语言模型文件。
(6)这样最终生成了语言模型weather.lm.DMP,此文件为解码器端所需要的文件格式
8、声音模型的改进
(1)创建语料库,共需要四个文件:
arctic20.txt,文本文件:里面是中文的句子
arctic20.fileids,控制文件:记录语音文件(读arctic20.txt里面的句子的录音)的路径
arctic20.transcription,脚本文件:中文句子和语音文件的对应关系
arctic20.dic,字典文件:记录arctic20.txt里面的句子因素的音标组成
(2)声音录制:
$ sudo apt-get install sox
$ vi rec_wav.sh
$ for i in `seq 1 12`; do
fn=`printf arctic_%04d $i`;
read sent; echo $sent;
rec -r 16000 -e signed-integer -b 16 -c 1 $fn.wav 2>/dev/null;
done < arctic20.txt
$ chmod 777 rec_wav.sh
这个脚本会显示一句话然后进入录音,把这个句子读出来然后按ctrl+c显示下一句话然后录音,如此循环。
测试下,逐个播放:
for i in *.wav; do play $i; done
(3)适应声学模型
首先拷贝默认的pocketsphinx自带的中文声学模型到当前目录下
$ cp -a /usr/local/share/pocketsphinx/model/hmm/zh/tdt_sc_8k/ .
对录制的wav语音文件提取MFCC特征,而且须用和默认的模型相同的声学模型参数去提取这些特征,他们存储在声学模型目录的feat.params文件中。
$ sphinx_fe -argfile tdt_sc_8k/feat.params -samprate 16000 -c arctic20.fileids -di . -do . -ei wav -eo mfc -mswav yes
这样在当前文件夹下就会对每一个语音文件生成一个*.mfc后缀的特征文件,可能将其修改为*..mfc

  • 9、(离线识别英文)的Python脚本

这个识别.wav文件的语音,不需要安装流框架
#!/usr/bin/env python
import sys
#In Ubuntu 14.04.2, the pocketsphinx module error first import and ok the second import.
#The following code is a temporary fix
try:
import pocketsphinx
except:
import pocketsphinx
if __name__ == “__main__”:
hmdir = “/usr/share/pocketsphinx/model/hmm/en_US/hub4wsj_sc_8k”
lmdir = “/usr/share/pocketsphinx/model/lm/en_US/hub4.5000. DMP”
dictd = “/usr/share/pocketsphinx/model/lm/en_US/cmu07a.dic”

wavfile = sys.argv[1]
speechRec = pocketsphinx.Decoder( hmm = hmdir, lm = lmdir, dict = dictd)
wavFile = file( wavfile,’rb’)
speechRec.decode_raw( wavFile)
result = speechRec.get_hyp()
print “nnnDetected text:>”, result

  • 10、安装GStreamer framework语音包

$ sudo apt-get install gstreamer0.10-pocketsphinx
# 如果有问题,需要安装这个plugin使得获取GConf信息
$ sudo apt-get install gstreamer0.10-gconf
安装GStreamer Python binding从而python可以使用GStreamer APIs
$ sudo apt-get install python-gst0.10

  • 11、(在线识别英文)的Python脚本

#!/usr/bin/env python
import gobject
import sys
import pygst
# above should before gstreamer

pygst.require(‘0.10’)
gobject.threads_init()
import gst

#mode to handle kbd interuption
import signal

def signal_handle( signal, frame):
print “Ctrl+C pressed”
sys.exit( 0)

#Implementation of Speech recognition class
class Speech_Recog( object):

#Initializing gstreamer pipeline and pocket sphinx element
def __init__(self):
self.init_gst()
#The following code create a gstreamer pipeline with pipeline description.
#The required descriptors needed for the code is given as parameters.
def init_gst(self):
self.pipeline = gst.parse_launch(‘gconfaudiosrc ! audioconvert ! audioresample ‘ + ‘! vader name = vad auto-threshold = true ‘ + ‘! pocketsphinx

name = asr ! fakesink’)
#Accessing pocket sphinx element from gstreamer pipeline
asr = self.pipeline.get_by_name(‘asr’)
#Connecting to asr_result function when a speech to text conversion is completed
asr.connect(‘result’, self.asr_result)
#User can mention lm and dict for accurate detection
#asr.set_property(‘lm’, ‘/home/user/mylanguagemodel.lm’)
#This option will set all options configured well and can start recognition
asr.set_property(‘configured’, True)
#Pausing the GStreamer pipeline at first.
self.pipeline.set_state( gst.STATE_PAUSED)

#Definition of asr_result
def asr_result( self, asr, text, uttid):
#Printing the detected text
print “Detected Text =>”, text
#This function will start/ stop Speech recognition operation
def start_recognition( self):
vader = self.pipeline.get_by_name(‘vad’)
vader.set_property(‘silent’, False)
#Waiting for a key press to start recognition
raw_input(“Press any key to start recognition:>”)
#Start playing the pipeline
self.pipeline.set_state( gst.STATE_PLAYING)
#Waiting for stopping the recognition
raw_input(“Press any key to stop recognition: >”)
vader = self.pipeline.get_by_name(‘vad’)
#Setting silent property of VADER to True
vader.set_property(‘silent’, True)
#Pausing GStreamer pipeline
self.pipeline.set_state(gst.STATE_PAUSED)

if __name__ == “__main__”:
app_object = Speech_Recog()
signal.signal( signal.SIGINT, signal_handle)
while True:
app_object.start_recognition()

  • 12、ROS的node

1、安装ROS的pocketSphinx包
$ cd ~/catkin_ws
$ git clone https://github.com/mikeferguson/pocketsphinx
$ catkin_make
2、后面这两个可能需要
$ sudo apt-get install ros-indigo-audio-common
$ sudo apt-get install ros-indigo-pocketsphinx
2、测试
运行robocup节点
$ roslaunch pocketsphinx robocup.launch
订阅主题,查看识别结果
$ rostopic echo /recognizer/output
例如
j

 

智能机器人(11):声音操作

声音操作主要涉及audio-common这个stack,包括:

audio_capture,记录从microphone记录音频并发布音频消息到/audio这个topic;audio_play,监听/audio并输出音频到speaker;audio_common_msgs,消息定义;sound_play,播放音频文件或者合成语音;最常用到audio_capture和audio_play这两个package。

1、硬件

1.1、验证声卡
$ cat /proc/asound/cards
0 [AudioPCI       ]: ENS1371 – Ensoniq AudioPCI
———————Ensoniq AudioPCI ENS1371 at 0x2080, irq 16
如果必要设置下默认的声卡序号:
$ asoundconf set-default-card 0

2、驱动

2.1、安装相应版本驱动
$ sudo apt-get install ros-hydro-audio-common
2.2、测试
验证gstreamer在ALSA下工作正常,可以采集音频、播放音频:
$ gst-launch-0.10 alsasrc ! audioconvert ! audioresample ! alsasink

3、测试

3.1、audio_capture:采集音频
$ roslaunch audio_capture capture.launch
这产生/audio这个topic,查看下数据:
$ rostopic hz /audio
如果要保存文件,是:
$ roslaunch audio_capture capture_to_file.launch
这个是mp3格式的,要用sox播放需要先转换成wav格式:
$ lame –decode out1.mp3 outwav1.wav
$ play outwav1.wav
如果要直接播放,需要下载解码器:
$ sudo apt-get install libsox-fmt-mp3
>>>这个通常是run在远程机器上。
3.2、audio_play:播放音频
$ roslaunch audio_play play.launch
这样是个应声虫,microphone接收到啥,speaker就播放啥。
>>>这个通常是run在本地机器上。
3.3、sound_play:播放声音
$ rosrun sound_play soundplay_node.py
注意这个node是必需要首先加载的,多出了/robotsound这个topic。
>>>这个通常是run在远程机器上。
3.4、然后直接播放需要合成的音频:
$ rosrun sound_play say.py “hello world”
或者播放音频文件:
$ rosrun sound_play play.py  /opt/ros/hydro/share/sound_play/sounds/say-beep.wav
要注意这个是全路径。
如果需要即时停止所有音频:
$ rosrun sound_play shutup.py
>>>这个通常是run在本地机器上。

4、源代码方式

这个部分是不必要的。如果需要,先卸载前述驱动包
$ sudo apt-get removeros-hydro-audio-common
安装最新代码
$ cd ~/catkin_ws/src
$ git clone https://github.com/ros-drivers/audio_common.git
$ rosdep install audio_common
#All required rosdeps installed successfully
$ cd ~/catkin_ws
$ catkin_make
如果出错:
$ sudo apt-get install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
上面这个0.10是ubuntu12.04的默认版本,如果提示需要1.0:
sudo add-apt-repository ppa:gstreamer-developers/ppa
sudo apt-get update
sudo apt-get install gstreamer1.0*
此路不通ppa源不可用:
sudo apt-get install ubuntu-restricted-extras
这个市浩大的一堆,慢慢下。
catkin_make后要更新
$ source ~/catkin_ws/devel/setup.bash

5、建立声音接口

建立一个node,利用sound_play作为wrapper来控制声音。注意用node给robotsound这个topic发消息,而不是建立消息。
这里把这个node命名为yak_node,用来处理SoundClient()和sound_play。SoundClient要注意避免超载报错,其参数可以是wav的文件名或者要合成语音的文本。
需要把所有音频资料防止同一个路径下,而且注意只支持wav和ogg格式的音频。
用户的音频采用yak形式publishe到yak这个topic,而yak_node这个node同样是subscribe到yak这个topic。

#!/usr/bin/env python
import roslib; roslib.load_manifest(‘sound_yak’)
import rospy, os, sys
from sound_play.msg import SoundRequest
from sound_play.libsoundplay import SoundClient
from sound_yak.msg import yak_cmd

# directory with sound assets – change as needed
soundAssets = ‘/home/shiloh/devel/audio_assets/’
# duration of yak throttle
throttle = 3 # seconds

def sound_translator(data):
#segmentation fault if too many sound commands given in short period
print data
global allow_yak
if rospy.Time.now() <= allow_yak: # Throttles yak to avoid
print(“Sound throttled”)      # SoundClient segfault
return
# when to reallow yak
allow_yak = rospy.Time.now() + rospy.Duration.from_sec(throttle)
#process yak commands requires full path names for sound assets
if data.cmd == “wav”:
soundhandle.playWave(soundAssets + data.param)
if data.cmd == “say”:
soundhandle.say(data.param)

def yak_init():
rospy.init_node(‘yak_node’, anonymous = True)
global allow_yak
allow_yak = rospy.Time.now()
rospy.Subscriber(‘yak’, yak_cmd, sound_translator)
rospy.spin()

if __name__ == ‘__main__’:
soundhandle = SoundClient()
rospy.sleep(1)

yak_init()

6、launch脚本
示例launch文件:
<launch>
<node name=”soundplay_node” pkg=”sound_play” type=”soundplay_node.py”/>
</launch>

7、sox瑞士军刀

http://ymkimit.blogspot.com/2014/07/recording-sound-detecting-silence.html#!/2014/07/recording-sound-detecting-silence.html
http://sox.sourceforge.net/sox.html
http://linux.die.net/man/1/rec
http://bbs.chinaunix.net/thread-2005749-1-1.html
http://blog.csdn.net/lijin6249/article/details/51955206

set AUDIODRIVER=oss
rec  -t wav  -r 16000   -b 16  -c 1  aa.wav       silence 1 0.3 1%   1 0.3 1%
自适应记录语音
rec rec.wav  silence 1  0.5 1% 1 1.0 3%
rec   -t wav  -r 16000   -b 16  -c 1   rec.wav   silence 1 0.1 1%   1 2.0  3%  is OKAY
sox -d -e u-law –endian little -b 8 -c 1 -r 8000 -t ul bb.wav silence 1 0.3 1% 1 0.3 1%
-t ossdsp 输入音频源
-w 采样位深w16位b8位
-r 44100 采样频率
-c 2 声道2
/dev/dsp 输入
-t raw 生数据

>>>效果器
效果器主要是声音滤波、频率转换、和声、混响、移相、音量等功能,可以只用一个也可以联合使用。

重低音:
play file.wav bass -20
play file.wav bass +20
bass是给输出结果加上低音效果,-20是低限值,+20是高限值。值愈低,声音愈低,反之则值愈高,声音愈浑厚。

混频器:
play 1234567890.wav   mixer 0.3,0.5,0.8,0.6
mixer效果器,它通过混合或者减少音轨从而减少音轨数,或者通过复制音轨而增加音轨数。0.3是从输入声道的左边到输出声道左边的音量值,0.5是从输入声道的左边到输

出声道右边的音量值,0.8是从输入声道的右边到输出声道左边的音量值,0.6是从输入声道的右边到输出声道右边的音量值。不过对于单声道无效。

节拍器:
play 1234567890.wav  tempo -q 0.8 82 20  16
0.8设置新节拍相对于老节拍的比率,82设置所选算法要划分音频的片段大小,单位毫秒,20是音频长度,依靠它来搜索以寻找重叠点,16是重叠长度。

颤动器:
play 1234567890.wav  tremolo 3.5 60
3.5是颤音频率,单位是赫兹Hz,60是深度百分比,具体来说就是”颤”到多长或深。

回响器:
play 1234567890.wav    echo 0.8 0.88 60 0.4
听起来就象用两个乐器演奏同一个样本一样,0.8是输入音量,0.88是输出音量,60是延迟单位是毫秒,0.4是相对于输入音量的衰减值。
如果延迟时间变长,听起来更象在山顶上的露天演唱会。假如延迟很短,听起来象(金属的)机器人的表演。回响可以多个,echo 0.8 0.9 1000 0.3 1800 0.25;这种回响分对称回声和不对称回声。

和声器:
play 1234567890.wav    chorus 0.7 0.9 55 0.4 0.25 2 -t
55是延迟,0.4是衰减,0.25是调制速度,单位Hz,2是调制深度,典型的延迟在40毫秒(40ms)到60毫秒(60ms),调制速度最好在0.25Hz附近,调制深度2毫秒左右(2ms)。-t使用三

角函数调制,上面的延迟时间有点短,输出有点过载。
play 1234567890.wav    chorus 0.6 0.9 50 0.4 0.25 2 -t 60 0.32  0.4  1.3 -s
-s,表示正弦波调制。
play 1234567890.wav    chorus 0.5 0.9 50 0.4 0.25 2 -t 60 0.32 0.4 2.3 -t 40 0.3 0.3 1.3 -s
这采用了三部和声

缩展器:
让它在低音部分不要那样小声,而在高音部分不要那样刺耳,允许信号动态地压缩或扩展。
play 1234567890.wav    compand 0.3,1 6:-70,-60,-20 -5 -90 0.2 0.3是起音时间(指的是生因忽然变大的时间),1是衰减时间,起 音时间应该比衰减时间短,因为我们的耳朵对忽然变大的声音比对忽然柔和哦的声音更敏感。6:-70是缩展器转换函数表,单位是dB,它跟音频信号的最大幅值有关联,它的意思是很柔软的声音(-70dB以下)仍然保留不变,这将防止缩展器在在乐章转换时从静默忽然飙升音量。但是在-60dB到0dB(最大音量)的声音将被提高,原始音频60dB的动态范围将被压缩成20dB,这样频宽足以享受音乐同时有可以不受路上噪音的影响。这就是-60和-20的意思。-5是额外增益,用来避免削波,-90表示初始化音量从几乎静默开始,这样对于削波现象将有很好的抑制作用。0.2秒是的延迟使得缩展器对于声音的忽然升高有很好的抑制作用。

取得戏剧性效果:
1、将回放速率改为原先的2倍,这个是参数越大速度越慢:
play 1234567890.wav    stretch 0.5
2、改变回放调子和节拍,这个语速越快越逗:
play 1234567890.wav    speed 2
3、升高样本1个短调(100音分),这个声调正的越高越儿童脆否则越老人:
play 1234567890.wav    pitch 100

play 1234567890.wav    pitch 300  speed 2  stretch 0.5

余响器:
play 1234567890.wav    reverb 1 100 100
1是输出音量,600是余响时间,180是延迟时间,延迟时间最好是余响时间的1/4到1/2。只考虑了一面墙的情形,如果还要考虑在多加一面墙,为 reverb 1 600  180 200,依次累加。

pitch 300  speed 2  stretch 2 echo 1 1 100 0.2
pitch 300  speed 1.5  stretch 1 echo 1 1 100 0.2
./web2.sh  –voice_name=xiaorong  “pitch 100  speed 1  stretch 1  echo 1 1 20 0.4”

智能机器人(09):后台系统配置

一、安装 Apache2

$ sudo apt-get install apache2
安装PHP模块:
$ sudo apt-get install php5
安装Mysql:
$ sudo apt-get install mysql-server
其他模块安装:
$ sudo apt-get install libapache2-mod-php5
$ sudo apt-get install libapache2-mod-auth-mysql
$ sudo apt-get install php5-mysql
$ sudo apt-get install php5-gd
或者一揽子:
$ apt-get install php5 libapache2-mod-php5 php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl

二、apache2控制

2.1 此方式安装的启动脚本是 /usr/bin/apache2ctl:
启动:sudo apache2ctl -k start
停止:sudo apache2ctl -k stop
重启:sudo apache2ctl -k restart
2.2 或者用产生的启动和停止文件是:/etc/init.d/apache2:
$ sudo /etc/init.d/apache2 force-reload
$ sudo /etc/init.d/apache2 restart
2.3 或者:
$ sudo service apache2 reload
$ sudo service apache2 restart

三、apache配置

apache2的默认的http配置位于:
/etc/apache2/sites-enabled/00default
在开启了https的ssl模块后需要修改的是
/etc/apache2/sites-enabled/default-ssl.conf

四、 常见错误

4.1 当apache2重启时提示:
* Starting web server apache2
apache2:Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
此时检查配置文件:
$ sudo apache2ctl configtest
AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1. Set the ‘ServerName’ directive globally to suppress this message
解决方法是:
$ sudo vim /etc/apache2/apache2.conf
文件顶端加入:
ServerName 127.0.0.1
或者,
ServerName localhost
再检查:
$ sudo apache2ctl configtest
Syntax OK
然后重启服务:
$ pidof apache2
$ sudo kill -9 $ sudo service apache2 reload
$ sudo service apache2 restart

六、PHP模块

Ubuntu有点特殊,在/etc/apache2/apache2.conf文件通过包含其他配置文件涵盖了所有的apache2系统配置信息。
一种方法就是将两个文件链接到mods-enabled目录下:
$ sudo ln -s /etc/apache2/mods-available/php5.load /etc/apache2/mods-enabled/php5.load
$ sudo ln -s /etc/apache2/mods-available/php5.conf /etc/apache2/mods-enabled/php5.conf
然后重启apache即可。

智能机器人(07):安全证书配置

一、启用 ssl
二、获得证书
三、自建证书
四、服务器的证书部署
五、客户端的证书设置
十、在做一份

对于传输密码或私密信息的http明文没有可靠性可言,需要https,为此需要制作ssl证书。

商业的权威机构用ca来证明某个.crt公钥属于特定组织或个人。.crt证书网站部署的证书文件。.key的私钥可以解密用.crt公钥加密后的信息(小心保管)。而.csr包含了.crt的公钥信息,供网站向CA发起认证请求,中间文件。

一、启用 ssl

$ sudo a2enmod ssl
这条命令相当于做软链接:
$ sudo ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled
$ sudo ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled
对应的停用是:
$ sudo a2dismod ssl

二、获得证书

这个有自签名的和商业购买的两种方式。 大多数浏览器会对自签署的证书报警,可以从价格比较便宜的Comodo购买, 为了购买先产生自己的私钥和请求文件:
$ openssl req -new -newkey rsa:2048 -nodes -keyout mykey.key -out mycsr.csr
然后发送给 Comodo 购买证书:
Root CA Certificate – AddTrustExternalCARoot.crt
Intermediate CA Certificate – COMODORSAAddTrustCA.crt
Intermediate CA Certificate – COMODORSADomainValidationSecureServerCA.crt
Your PositiveSSL Certificate – mycrt.crt

三、自建证书

3.1 创建CA签名
$ sudo openssl genrsa -des3 -out zdh2.key 1024
如果不使用密码去除-des3选项
3.2、创建CSR
$ sudo openssl req -new -key zdh2.key -out zdh2.csr
3.3、自己签发证书
$ sudo openssl x509 -req -days 3650 -in zdh2.csr -signkey zdh2.key -out zdh2.crt
3.4、或者一步完成:
$ sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/apache2/ssl/zdh2.key -out /etc/apache2/ssl/zdh2.crt
上面的: openssl,命令行工具;req,证书类型;-x509,需要生成自签名证书文件,而不是证书请求文件;-nodes,不需要密码保护.key文件,否则每次apache都会提示输入密码;
-days 3650,证书有效期;-newkey rsa:2048: 同时生成rsa私钥和证书;-keyout,命名私钥文件;-out,命名证书文件。

四、服务器的证书部署

4.1、复制到某个目录
$ sudo mkdir /etc/apache2/ssl
$ sudo cp zdh.crt /etc/apache2/ssl …..
4.2、修改配置文件
以上步骤后/etc/apache2/sites-available/目录下会在/etc/apache2/sites-enabled/下有软链接,修改它:
$ sudo vim ……sites-enabled/default-ssl.conf
在段中保证以下内容:
SSLEngine On
SSLOptions +StrictRequire ???
SSLCertificateFile /etc/ssl/certs/zdh.crt
SSLCertificateKeyFile /etc/ssl/private/zdh.key
4.3、监听端口
检查/etc/apache2/ports.conf文件中443>(ssl的端口)
已经监听:
Listen 443
4.4、此时启动apache会提示输密码,如果不想的话在httpd.conf修改IfModule ssl_module 配置:
“SSLPassPhraseDialog exec:/home/admin/xxx/conf/apache_pass.sh”
而 apache_pass.sh 内容就是显示密码:
#!/bin/sh
echo “password”

4.5、测试部署
在客户机从浏览器访问:
https://serverIP
浏览器可能报警证书问题。需要通过下面步骤对客户机的证书做设置。

五、客户端的证书设置

7.1 Chrome
Q: 如果browser是google的chrome的话,会报错“Failed to get access to local media. Error code was Permission Denied”
因为,chrome needs https to use get user media,Updated to secure http and everything works fine.
由于,Starting with Chrome 47, getUserMedia() requests only allowed from secure HTTPS or localhost, so need to setup a self signed ssl certificate for webserver and and access with https://722.20.10.11:8080
所以,如果使用chrome浏览器的话,可以部署自签署证书采用ssl实现https。
如果一定要选择http实现webrtc的话,那就用firefox浏览器不要用chrome。

Q: how to always accept webRTC webcam request in chrome?
if command line:
$ google-chrome “http://localhost” –use-fake-ui-for-media-stream
which avoids the need to grant camera/microphone permissions.
or, on Chrome:
chrome://settings/content#media-stream-mic

APP: List of Chromium Command Line Switches
http://peter.sh/experiments/chromium-command-line-switches/

7.2 Firefox
Q: how to always accept webRTC webcam request in firefox?
Go in url about:config
Search media.navigator.permission.disabled
dbClick or set value to true

7.3 Setup ssl https connection
As mentioned earlier, apps running on Chrome browsers can’t access local cameras and microphones unless the application is hosted from localhost or an SSL server (https).
When you are doing development, it is simplest to get node.js to handle the SSL. Benefits of using SSL:
* Increase end user confidence
* Secure signaling traffic from eavesdroppers
* In Chrome: Browser remembers camera and microphone sharing preference for site. Does not re-ask at each – visit.
* In Chrome: Enables screen sharing API
Before applying, you will need to generate a CSR (Certificate Signing Request). The most common software used for generating CSR’s and handling SSL is OpenSSL,
There are many operating system specific guides available for how to use SSL on your server Self signed certificates are a free method of creating a certificate suitable for development. A warning will occur when browsing your site.
http://www.selfsignedcertificate.com/ <— from thi st ogenerate or, You can create a key and certificate yourself instead of downloading them from this page. This makes your key more secure. To generate a key: $ openssl genrsa -out 172.20.10.3.key 2048 And the certificate: $ openssl req -new -x509 -key 172.20.10.3.key -out 172.20.10.3.cert -days 3650 -subj /CN=172.20.10.3 or, to buy one http://bit.ly/i95aUS 如果是商业购买的,证书链可靠,浏览器不需要设置。 如果是自签名的,需要导入或下载证书,各个浏览器不同。 5.1、Firefox 这个在访问https://serverIP时, 会提示网站不可信任。 那么添加例外就可以: exception->confirm security exception https://serverIP ok,就可以通过ip地址访问。 5.2、Chrome 这个访问https://IP-address,浏览器: Your connection is not private Attackers might be trying to steal your information from 116.50.77.22 (for example, passwords, messages or credit cards). NET::ERR_CERT_COMMON_NAME_INVALID 具体的: This server could not prove that it is 116.50.77.22; its security certificate is not trusted by your computer’s operating system. This may be caused by a misconfiguration or an attacker intercepting your connection. Proceed to 116.50.77.22 (unsafe) 所以,同样需要添加证书: edit->preference->advanced setting->https/ssl->authorities->import->ok. 但是, Chrome非常憎恨自签署证书Why does Chrome hate self-signed certificates so much。 浏览器依然不能像http那样通过IP地址访问服务器,对于https://serverIP这种方式依然报警: Server’s certificate does not match the URL 所以,需要根据证书里Issued to的域名信息修改: $ vi /etc/hosts 10.10.0.1 dehaou14-n501jw $ ping dehaou14-n501jw ok https://dehaou14-n501jw/ ok

十、在做一份

对于webRTC的nodejs使用8080端口的音视频聊天服务,重复上述步骤,生成zdh2_rtc.crt和zdh2_rtc.key,重复上述步骤部署。