无人驾驶之交通识别项目--用Python实现语音播放“提示”

简介: 无人驾驶之交通识别项目--用Python实现语音播放“提示”

 我们的项目想基于python实现语音提示的功能。


1.首先尝试了python内部库pyttsx3


直接通过pip安装即可使用

import pyttsx3 as pyttsx
# 调用初始化方法,获取讲话对象
engine = pyttsx.init()
engine.say('hello world')
engine.runAndWait()

得到的语音感觉有些生硬,然后尝试使用百度API

2.百度API语音合成

创建应用后领取额度,保存应用中自己的API相关参数API KEY 和SECRET KEY

参考官方文档,戳这跳转

写自己的代码

# -*- coding: utf-8 -*-
"""
Created on Mon Apr 19 15:08:18 2021
@author: ASUS
"""
# coding=utf-8
import sys
import json
# 保证兼容python2以及python3
IS_PY3 = sys.version_info.major == 3
if IS_PY3:
    from urllib.request import urlopen
    from urllib.request import Request
    from urllib.error import URLError
    from urllib.parse import urlencode
    from urllib.parse import quote_plus
else:
    import urllib2
    from urllib import quote_plus
    from urllib2 import urlopen
    from urllib2 import Request
    from urllib2 import URLError
    from urllib import urlencode
# 替换你的 API_KEY
API_KEY = '111111111111111111111111'
# 替换你的 SECRET_KEY
SECRET_KEY = '2222222222222222222222222222222'
# 大姚的订单信息内容文本
TEXT = "请注意,前方限速!Attention, speed limit ahead"
TTS_URL = 'http://tsn.baidu.com/text2audio'
"""  TOKEN start """
TOKEN_URL = 'http://openapi.baidu.com/oauth/2.0/token'
"""
    获取token
"""
def fetch_token():
    params = {'grant_type': 'client_credentials',
              'client_id': API_KEY,
              'client_secret': SECRET_KEY}
    post_data = urlencode(params)
    if (IS_PY3):
        post_data = post_data.encode('utf-8')
    req = Request(TOKEN_URL, post_data)
    try:
        f = urlopen(req, timeout=5)
        result_str = f.read()
    except URLError as err:
        print('token http response http code : ' + str(err.code))
        result_str = err.read()
    if (IS_PY3):
        result_str = result_str.decode()
    result = json.loads(result_str)
    if ('access_token' in result.keys() and 'scope' in result.keys()):
        if not 'audio_tts_post' in result['scope'].split(' '):
            print ('please ensure has check the tts ability')
            exit()
        return result['access_token']
    else:
        print ('please overwrite the correct API_KEY and SECRET_KEY')
        exit()
"""  TOKEN end """
if __name__ == '__main__':
    token = fetch_token()
    tex = quote_plus(TEXT)  # 此处TEXT需要两次urlencode
    params = {'tok': token, 'tex': tex, 'cuid': "quickstart",
              'lan': 'zh', 'ctp': 1}  # lan ctp 固定参数
    data = urlencode(params)
    req = Request(TTS_URL, data.encode('utf-8'))
    has_error = False
    try:
        f = urlopen(req)
        result_str = f.read()
        headers = dict((name.lower(), value) for name, value in f.headers.items())
        has_error = ('content-type' not in headers.keys() or headers['content-type'].find('audio/') < 0)
    except  URLError as err:
        print('http response http code : ' + str(err.code))
        result_str = err.read()
        has_error = True
    save_file = "error.txt" if has_error else u'限速.mp3'
    with open(save_file, 'wb') as of:
        of.write(result_str)
    if has_error:
        if (IS_PY3):
            result_str = str(result_str, 'utf-8')
        print("tts api  error:" + result_str)
    print("file saved as : " + save_file)

生成了我们所需要的MP3文件


3.播放MP3音频文件


①使用playground库


20210419162435480.png

首先尝试了playsound库 但是一直报 UnicodeDecodeError异常,未能解决问题

并将上文代码中所有的’UTF-8’改为了’gbk’


②使用pygame库


from pygame import mixer 
import time
mixer.init()
mixer.music.load('xx.mp3')
mixer.music.play()
time.sleep(5)
mixer.music.stop()

正常播放!

也可以尝试其他的库

基于55个类别的语音文件成功生成:

20210421113222324.png

参考代码:

# -*- coding: utf-8 -*-
"""
Created on Mon Apr 19 15:08:18 2021
@author: ASUS
"""
# coding=utf-8
import sys
import json
# 保证兼容python2以及python3
IS_PY3 = sys.version_info.major == 3
if IS_PY3:
    from urllib.request import urlopen
    from urllib.request import Request
    from urllib.error import URLError
    from urllib.parse import urlencode
    from urllib.parse import quote_plus
else:
    import urllib2
    from urllib import quote_plus
    from urllib2 import urlopen
    from urllib2 import Request
    from urllib2 import URLError
    from urllib import urlencode
# 替换你的 API_KEY
API_KEY = 'yZGnzL2cx2AzBHGTFh5suOHt'
# 替换你的 SECRET_KEY
SECRET_KEY = 'cTlsySaXhY90HhZVciBstcv7Cs1SnIFB'
# 大姚的订单信息内容文本
#TEXT = "请注意,前方限速!Attention, speed limit ahead"
classes = ["请注意,前方消防通道,禁止停车!",
           "请注意,前方行人和非机动车禁止通行!",
           "请注意,前方禁止电动自行车通行!",
           "请注意,前方禁止通行!",
           "请注意,前方禁止三轮车机动车通行!",
           "请注意,前方禁止拖拉机驶入!",
           "请注意,前方禁止非机动车入内!",
           "请注意,前方禁止禁止驶入!",
           "请注意,前方禁止大型客车驶入!",
           "请注意,前方禁止畜力车进入!",
           "请注意,前方禁止机动车驶入!",
           "请注意,前方禁止小型客车驶入!",
           "请注意,前方禁止二轮摩托车驶入!",
           "请注意,前方禁止人力货运三轮车进入!",
           "请注意,前方禁止载货汽车驶入!",
           "请注意,前方禁止汽车拖、挂车驶入!",
           "请注意,前方禁止某两种车驶入!",
           "请注意,前方禁止人力客运三轮车进入!",
           "请注意,前方禁止人力车进入!",
           "请注意,前方禁止向左转弯!",
           "请注意,前方禁止直行和向左转弯!",
           "请注意,前方解除禁止超车!",
           "请注意,前方禁止向右转弯!",
           "请注意,前方禁止直行和向右转弯!",
           "请注意,前方禁止停车!",
           "请注意,前方禁止直行!",
           "请注意,前方禁止掉头!",
           "请注意,前方禁止长时停车!",
           "请注意,前方禁止行人进入!",
           "请注意,前方禁止向左向右转弯!",
           "请注意,前方禁止超车!",
           "请注意,前方禁止鸣喇叭!",
           "请注意,前方限制宽度!",
           "请注意,前方限制速度!",
           "请注意,前方减速让行!",
           "请注意,前方限制高度!",
           "请注意,前方解除限制速度!",
           "请注意,前方路段会车让行!",
           "请注意,前方路段限制质量!",
           "请注意,前方路段停车检查!",
           "请注意,前方路段限制轴重!",
           "请注意,前方停车让行!",
           "请注意,前方禁止运输危险物品车辆驶入!",
           "请注意,前方海关!",
           "请注意,前方区域禁止长时停车!",
           "请注意,前方解除禁止区域停车!",
           "请注意,前方区域禁止停车!",
           "请注意,前方区域禁止停车解除!",
           "请注意,前方区域限制速度!",
           "请注意,前方区域限制速度解除!",
           "请注意,前方禁止电动三轮车驶入!",
           "请注意,前方禁止小客车右转!",
           "请注意,前方禁止载货汽车左转!",
           "请注意,前方有警告标志!",
           "请注意,前方有指示标志!",]
classes_eng = ['Fire Exit. No Parking',
            'Pedestrians and non-motor vehicles are prohibited',
            'Prohibition of electric bicycles',
            'No thoroughfare',
            'Prohibition of tricycles and motor vehicles',
            'Prohibit tractors from entering!',
            'Prohibition of non-motorized vehicles',
            'No Entry',
            'Ban large passenger vehicles from entering',
            'Ban animal-drawn vehicles entering',
            'Prohibit motorized vehicles',
            'Prohibition of entry of small passenger cars',
            'Two-wheeled motorcycles are prohibited',
            'Prohibition of human-powered cargo tricycles from entering',
            'Prohibit laden car into',
            'It is forbidden to tow or trailer vehicles',
            'Prohibit certain two types of vehicles from entering',
            'Human-powered passenger tricycles are prohibited from entering',
            'No rickshaws are allowed',
            'Prohibited left turn',
            'Prohibited left turn and straight',
            'Lifting the prohibition on overtaking',
            'Prohibited right turn',
            'Prohibited right turn and straight',
            'No parking',
            'Prohibition straight',
            'No U-turn',
            'No long-term parking',
            'Prohibit pedestrians entering',
            'No left or right turn',
            'No Overtaking',
            'Prohibit honking',
            'Limit width',
            'Limit speed',
            'Slow down and give way',
            'Limit height',
            'Speed restrictions lifted',
            'Give Way to Oncoming Vehicles',
            'Limit weight',
            'Parking inspection',
            'Limit axle load',
            'Park to give way',
            'Prohibit entry of vehicles transporting dangerous goods',
            'customs',
            'Long time parking is prohibited in the area',
            'Long-term parking prohibited in the area lifted',
            'Parking prohibited area',
            'Regional no parking lifted',
            'Regional speed limit',
            'Area speed limit lifted',
            'Prohibition of electric tricycles',
            'Prohibition of right turning of passenger cars',
            'No left turn for trucks',
            'Warning signs',
            'mandatory sign']
TTS_URL = 'http://tsn.baidu.com/text2audio'
"""  TOKEN start """
TOKEN_URL = 'http://openapi.baidu.com/oauth/2.0/token'
"""
    获取token
"""
def fetch_token():
    params = {'grant_type': 'client_credentials',
              'client_id': API_KEY,
              'client_secret': SECRET_KEY}
    post_data = urlencode(params)
    if (IS_PY3):
        post_data = post_data.encode('gbk')
    req = Request(TOKEN_URL, post_data)
    try:
        f = urlopen(req, timeout=5)
        result_str = f.read()
    except URLError as err:
        print('token http response http code : ' + str(err.code))
        result_str = err.read()
    if (IS_PY3):
        result_str = result_str.decode()
    result = json.loads(result_str)
    if ('access_token' in result.keys() and 'scope' in result.keys()):
        if not 'audio_tts_post' in result['scope'].split(' '):
            print ('please ensure has check the tts ability')
            exit()
        return result['access_token']
    else:
        print ('please overwrite the correct API_KEY and SECRET_KEY')
        exit()
"""  TOKEN end """
if __name__ == '__main__':
#    token = fetch_token()
#    ,len(classes)
    for i in range(len(classes)):
        print(i)
        token = fetch_token()
        TEXT = classes[i]
        print(TEXT)
        tex = quote_plus(TEXT)  # 此处TEXT需要两次urlencode
        params = {'tok': token, 'tex': tex, 'cuid': "quickstart",
                  'lan': 'zh', 'ctp': 1}  # lan ctp 固定参数
        data = urlencode(params)
        req = Request(TTS_URL, data.encode('gbk'))
        has_error = False
        try:
            f = urlopen(req)
            result_str = f.read()
            headers = dict((name.lower(), value) for name, value in f.headers.items())
            has_error = ('content-type' not in headers.keys() or headers['content-type'].find('audio/') < 0)
        except  URLError as err:
            print('http response http code : ' + str(err.code))
            result_str = err.read()
            has_error = True
#        save_file = "error.txt" if has_error else u'限速.mp3'
        save_file = classes_eng[i] + '.mp3'
        with open(save_file, 'wb') as of:
            of.write(result_str)
        if has_error:
            if (IS_PY3):
                result_str = str(result_str, 'gbk')
            print("tts api  error:" + result_str)
        print("file saved as : " + save_file)
相关文章
|
2月前
|
机器学习/深度学习 数据采集 数据可视化
Python 数据分析:从零开始构建你的数据科学项目
【10月更文挑战第9天】Python 数据分析:从零开始构建你的数据科学项目
65 2
|
26天前
|
存储 数据可视化 数据挖掘
Python数据分析项目:抖音短视频达人粉丝增长趋势
Python数据分析项目:抖音短视频达人粉丝增长趋势
|
1月前
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
29 4
|
1月前
|
机器学习/深度学习 自然语言处理 API
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程。通过简单的代码示例,展示如何将文本转换为自然流畅的语音,适用于有声阅读、智能客服等场景。
225 3
|
1月前
|
弹性计算 Linux iOS开发
Python 虚拟环境全解:轻松管理项目依赖
本文详细介绍了 Python 虚拟环境的概念、创建和使用方法,包括 `virtualenv` 和 `venv` 的使用,以及最佳实践和注意事项。通过虚拟环境,你可以轻松管理不同项目的依赖关系,避免版本冲突,提升开发效率。
91 3
|
1月前
|
数据采集 存储 分布式计算
超酷炫Python技术:交通数据的多维度分析
超酷炫Python技术:交通数据的多维度分析
|
2月前
|
JSON 搜索推荐 API
Python的web框架有哪些?小项目比较推荐哪个?
【10月更文挑战第15天】Python的web框架有哪些?小项目比较推荐哪个?
76 1
|
2月前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
72 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
2月前
|
存储 开发工具 Python
【Python项目】外星人入侵项目笔记
【Python项目】外星人入侵项目笔记
46 3
|
2月前
|
前端开发 JavaScript API
惊呆了!学会AJAX与Fetch API,你的Python Web项目瞬间高大上!
在Web开发领域,AJAX与Fetch API是提升交互体验的关键技术。AJAX(Asynchronous JavaScript and XML)作为异步通信的先驱,通过XMLHttpRequest对象实现了局部页面更新,提升了应用流畅度。Fetch API则以更现代、简洁的方式处理HTTP请求,基于Promises提供了丰富的功能。当与Python Web框架(如Django、Flask)结合时,这两者能显著增强应用的响应速度和用户体验,使项目更加高效、高大上。
54 2
下一篇
DataWorks