无人驾驶之交通识别项目--用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
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
318 1
|
2月前
|
API 语音技术 开发者
Python 项目打包,并上传到 PyPI,分享项目
本文介绍了如何使用 Poetry 打包并发布一个 Python 项目至 PyPI。内容包括:项目创建、配置 `pyproject.toml` 文件、构建软件包、上传至 PyPI、安装与使用。通过实例 iGTTS 展示了从开发到发布的完整流程,帮助开发者快速分享自己的 Python 工具。
|
2月前
|
人工智能 Shell Python
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
212 0
|
5月前
|
监控 大数据 API
Python 技术员实践指南:从项目落地到技术优化
本内容涵盖Python开发的实战项目、技术攻关与工程化实践,包括自动化脚本(日志分析系统)和Web后端(轻量化API服务)两大项目类型。通过使用正则表达式、Flask框架等技术,解决日志分析效率低与API服务性能优化等问题。同时深入探讨内存泄漏排查、CPU瓶颈优化,并提供团队协作规范与代码审查流程。延伸至AI、大数据及DevOps领域,如商品推荐系统、PySpark数据处理和Airflow任务编排,助力开发者全面提升从编码到架构的能力,积累高并发与大数据场景下的实战经验。
Python 技术员实践指南:从项目落地到技术优化
|
7月前
|
程序员 测试技术 开发工具
怎么开发Python第三方库?手把手教你参与开源项目!
大家好,我是程序员晚枫。本文将分享如何开发Python第三方库,并以我维护的开源项目 **popdf** 为例,指导参与开源贡献。Popdf是一个PDF操作库,支持PDF转Word、转图片、合并与加密等功能。文章涵盖从fork项目、本地开发、单元测试到提交PR的全流程,适合想了解开源贡献的开发者。欢迎访问[popdf](https://gitcode.com/python4office/popdf),一起交流学习!
265 21
怎么开发Python第三方库?手把手教你参与开源项目!
|
10月前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
498 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
8月前
|
Docker Python 容器
Docker——阿里云服务器使用Docker部署python项目全程小记
本文记录了我在阿里云服务器上使用Docker部署python项目(flask为例)的全过程,在这里记录和分享一下,希望可以给大家提供一些参考。
999 1
|
11月前
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
261 33
|
存储 数据可视化 数据挖掘
Python数据分析项目:抖音短视频达人粉丝增长趋势
Python数据分析项目:抖音短视频达人粉丝增长趋势