代码地址如下:
http://www.demodashi.com/demo/13153.html

概述:

本demo是ros下基于百度语音的,语音识别和语音合成,能够实现文字转语音,语音转文字的功能。

详细:

1. 安装库与环境

首先确保已经安装了以下两个库文件。

1.1 Python 音频处理库 PyAudio

  1. python -m pip install pyaudio

1.2 Python 音频处理库 vlc

  1. pip install python-vlc

1.3 ROS

确保安装了ROS

http://wiki.ros.org/indigo

2. 实时语音识别与语音合成

2.1 运行

Speech Recognition(语音识别):

  1. roslaunch simple_voice simple_voice.launch

Text To Speech(语音合成):

  1. roslaunch simple_voice simple_speaker.launch

2.2 概述

在运行前先确保安装了python的pyaudio 以及 vlc 库文件.

百度语音识别为开发者提供业界优质且免费的语音服务,通过场景识别优化,,准确率达到90%以上,让您的应用绘“声”绘色。

本文中的语音识别功能:采用百度语音识别库,实现语音转化为文字的功能,并且输出为ros话题。

本文中的语音合成功能:采用百度语音识别库,实现将文字转化为语音并且存储为mp3/wav文件。

2.3 Node

包中一共有3个节点:

  • node_main.py
  • simple_speek.py
  • voice_node.py.

node_main.py 是TTS(Text To Speech)的demo节点, 该demo是和laser scanner一起运行的,当laser检测到一个障碍物,node_main将会触发simple_speek.py让机器说出英语或者汉语 'excuse me', 'make a way for me pls'或者'请让一下',等话语。

simple_speek.py 将会订阅 std_msgs/String 消息类型的话题,并且将该话题中输入的文字转化为语音

voice_node.py 将会识别您在5秒内说出的话语并且输出到终端上。

2.4 订阅的 Topic

TTS(Text To Speech - simple_speek.py):

  1. /speak_string(std_msgs/String)

语音合成节点中机器将会说出的文字。

Demo(node_main.py):

  1. /SpeakerSubTopic (std_msgs/String )

这个是也是一个语音合成的demo节点,是用来触发Text To Speech - simple_speek.py节点的,您可以随意更改SpeakerSubTopic中的文本。

当您给该节点发布stop将会立刻出发Text To Speech - simple_speek.py节点开始说话了。

2.5 发布的 Topic

Demo (node_main.py):

  1. /speak_string(std_msgs/String )

该话题将会定义机器的语音合成(TTS)说什么。

Speech Recognition(voice_node.py):

  1. /Rog_result(std_msgs/String )

这个是语音识别程序,功能是将语音转化为文字。

触发是在终点中输入ENTER

3. 实现过程的部分代码展示

simple_speek.py中播放合成语音部分:

  1. def play_video(self,file_):
  2. #print '\n start speaking ', "file://%s"%file_
  3. rospy.loginfo('start speaking ')
  4. player = vlc.MediaPlayer("file://%s"%file_)
  5. player.play()
  6. rospy.sleep(1)
  7. while player.is_playing():
  8. pass
  9. #self.pub.publish('PENDING')
  10. rospy.loginfo('done\n')

simple_speek.py中订阅消息部分:

  1. class speeker():
  2. def __init__(self):
  3. self.define()
  4. rospy.Subscriber('speak_string', String, self.SpeedCB, queue_size=1)
  5. rospy.Timer(rospy.Duration(self.ResponseSensitivity), self.TimerCB)
  6. rospy.spin()

simple_speek.py中语音合成部分:

  1. def SpeedCB(self, data):
  2. with self.locker:
  3. speak_string = data.data
  4. if self.TalkNow:
  5. self.WavName = speak_string
  6. self.TalkNow = False
  7. self.mp3file = '%s'%self.path + self.WavName + '.%s'%self.FORMAT
  8. if os.path.exists(r'%s'%self.mp3file):
  9. self.play_video(self.mp3file)
  10. else:
  11. self.speek(speak_string)

voice_node.py 触发部分

  1. def __init__(self):
  2. if_continue=''
  3. while not rospy.is_shutdown() and if_continue == '':
  4. self.define()
  5. self.recode()
  6. words = self.reg()
  7. reg = rospy.Publisher('Rog_result', String, queue_size=1)
  8. reg.publish(words)
  9. #self.savewav("testing")#testing
  10. if_continue = raw_input('pls input ENTER to continue')

voice_node.py 语音识别部分

  1. while True and NO_WORDS:
  2. time_out -= 1
  3. print 'time_out in', time_out # 读入NUM_SAMPLES个取样
  4. string_audio_data = stream.read(self.NUM_SAMPLES) # 将读入的数据转换为数组
  5. audio_data = np.fromstring(string_audio_data, dtype=np.short)
  6. # 查看是否没有语音输入
  7. NO_WORDS -= 1
  8. if np.max(audio_data) > self.UPPER_LEVEL:
  9. NO_WORDS=self.NO_WORDS
  10. print 'self.NO_WORDS ', NO_WORDS
  11. print 'np.max(audio_data) ', np.max(audio_data)
  12. # 计算大于LOWER_LEVEL的取样的个数
  13. large_sample_count = np.sum( audio_data > self.LOWER_LEVEL )
  14. # 如果个数大于COUNT_NUM,则至少保存SAVE_LENGTH个块
  15. if large_sample_count > self.COUNT_NUM:
  16. save_count = self.SAVE_LENGTH
  17. else:
  18. save_count -= 1
  19. # 将要保存的数据存放到save_buffer中
  20. if save_count < 0:
  21. save_count = 0
  22. elif save_count > 0 :
  23. save_buffer.append( string_audio_data )
  24. else:
  25. pass
  26. # 将save_buffer中的数据写入WAV文件,WAV文件的文件名是保存的时刻
  27. if len(save_buffer) > 0 and NO_WORDS==0:
  28. self.Voice_String = save_buffer
  29. save_buffer = []
  30. rospy.loginfo( "Recode a piece of voice successfully!")
  31. elif len(save_buffer) > 0 and time_out==0:
  32. self.Voice_String = save_buffer
  33. save_buffer = []
  34. rospy.loginfo( "Recode a piece of voice successfully!")
  35. else:
  36. pass

4. 项目文件结构

ros下基于百度语音的,语音识别和语音合成

代码地址如下:
http://www.demodashi.com/demo/13153.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

ros下基于百度语音的,语音识别和语音合成的更多相关文章

  1. QT调用百度语音REST API实现语音合成

    QT调用百度语音REST API实现语音合成 1.首先点击点击链接http://yuyin.baidu.com/docs/tts 点击access_token,获取access_token,里面有详细 ...

  2. ros实例_百度语音+图灵

    1 百度语音模块 参考http://blog.csdn.net/u011118482/article/details/55001444 1.1 百度语音识别包 git clonehttps://git ...

  3. python调用百度语音(语音识别-斗地主语音记牌器)

    一.概述 本篇简要介绍百度语音语音识别的基本使用(其实是斗地主时想弄个记牌器又没money,抓包什么的又不会,只好搞语音识别的了) 二.创建应用 打开百度语音官网,产品与使用->语音识别-> ...

  4. 百度语音+react+loopback实现语音合成返回播放

    1.在百度语音中创建自己的项目,需要拿到APP_ID.API_KEY.SECRET_KEY. 2.loopback端提供接口服务,在./boot目录下新建root.js文件,编写不依赖模型的自定义接口 ...

  5. 转:基于科大讯飞语音API语音识别开发详解

    原文来自于: http://www.52wulian.org/android_voice/ 最近项目需要用到android语音识别,立马就想到科大讯飞,结合官方实例及阅读API文档,初步的完成了And ...

  6. BaiduSpeechDemo【百度语音SDK集成】(基于v3.0.7.3)

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本Demo将百度语音SDK(其中一部分功能)和自定义的UI对话框封装到一个module中,便于后续的SDK版本更新以及调用. 本De ...

  7. BaiduSpeechDemo【百度语音SDK集成】(基于v3.0.8.1)

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 上一篇集成的是V3.0.7.3版本的SDK<BaiduSpeechDemo[百度语音SDK集成](基于v3.0.7.3)> ...

  8. Android 通过调用系统,如接口 谷歌语音、百度语音、科大讯飞语音等语音识别方法对话框

    现在app在发展过程中会集成一些语音识别功能,不具有其自己的显影剂一般正在开发的语音识别引擎,所以在大多数情况下,它是选择一个成熟的语音识别引擎SDK集成到他们的app在. 平时,这种整合被分成两个, ...

  9. C# 10分钟完成百度语音技术(语音识别与合成)——入门篇

    我们已经讲了人脸识别(入门+进阶).图片识别(入门).下面是链接: C# 10分钟完成百度人脸识别——入门篇 C# 30分钟完成百度人脸识别——进阶篇(文末附源码) C# 10分钟完成百度图片提取文字 ...

随机推荐

  1. C# WinForm开发 取消窗体关闭按钮

    //禁用窗体的关闭按钮 private const int CP_NOCLOSE_BUTTON = 0x200; protected override CreateParams CreateParam ...

  2. 【转】如何只用CSS做到完全居中

    英文原版链接:http://codepen.io/shshaw/full/gEiDt 我们都知道 margin:0 auto; 的样式能让元素水平居中,而 margin: auto; 却不能做到垂直居 ...

  3. Codeforces 723 A. The New Year: Meeting Friends

    A. The New Year: Meeting Friends time limit per test 1 second memory limit per test 256 megabytes in ...

  4. 51nod 1129 字符串最大值

    首先我们可以想到的是,既然求的是前缀的长度,就意味着一定是从1开始的,那么我们可以直接用下 标表示每一个前缀.但是可能存在几个前缀互相包含的情况,比如:abababa我们可以看见的是aba中包含着ab ...

  5. java应用高内存占用

    在java虚拟机中,内存分为三个代:新生代(New), 老生代(Old).永久代(Perm) 新生代: 新建的对象都存放这里老生代:存放从新生代中迁移过来的生命周期较久的对象.新生代和老生代共同组成了 ...

  6. 详解jQuery的选择器

    1.基本选择器 基本选择器是jQuery中最常用的选择器,也是最简单的选择器,它通过元素id.class和标签名等来查找DOM对象.在网页中,每个id名称只能使用一次,class允许重复使用. ♠ # ...

  7. [BZOJ 2743] 采花

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2743 Algorithm: 此题询问区间内出现次数超过1个的数字 明显在线做无从下手,无 ...

  8. Spoj Query on a tree III

    题目描述 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑点,若无,输出 ...

  9. [CF418E]Tricky Password

    题意:有一个无限行$n$列的数表$a_{i,j}$,对于第$i\geq2$行,$a_{i,j}$为$a_{i-1,j}$在$a_{i-1,1\cdots j}$中出现的次数,要维护这个数表,支持修改第 ...

  10. Scala实战高手****第15课:Scala类型参数编程实战及Spark源码鉴赏

    1.Scala的类和方法.函数都可以是泛型 2.上界:表示泛型的类型必须是某种类型或者其类型的子类,语法:<: ,对类型进行限定 3.下界:表示泛型的类型必须是某种类型或者其类型的父类,语法:& ...