嵌入式人工智能(28-基于树莓派4B的语音播报模块-SYN6288)

1、语音播报模块

语音播报在一些嵌入式场景中很常见,广泛应用于游戏篮球机音效语音播报,跑步机语音导航,按摩椅语音操作指引,设备故障提示,设备操作引导语音,车载安全语音警示,公共场所语音提示,营业厅温馨语音提示等等。

我这里正好有一个语音播报套件cnTTS,通过USBToTTL线驱动,实现串口发送的数据语音播报。

2、SYN6288中文语音合成芯片

将cnTTS语音播报套件拆开可以查看使用的芯片,上面没有激光刻印,看不清楚,只能到网上找资料,目前用的最多的2款语音芯片一个是SYN6288,另一个是JR6001。JR6001是16脚贴片封装,而SYN6288是28脚贴片封装。我这边打开看也没有28脚,经问询厂家使用的是SYN6288。不管这么多了,按SYN6288芯片来使用。

 SYN6288中文语音合成芯片是北京宇音天下科技有限公司于2010年初推出的一款性/价比更高,效果更自然的一款中高端语音合成芯片。SYN6288通过异步串口(UART)通讯方式,接收待合成的文本数据,实现文本到语音(或 TTS语音)的转换。
宇音天下于 2002年最早研制出国内首款语音合成芯片0SYN06188。公司最新推出的SYN6288语音合成芯片,继承了0SYN06188语音芯片的优秀特点:最小SSOP28L贴片封装、硬件接口简单、低功耗、音色清亮圆润、极高的性/价比;除此之外,SYN6288在识别文本/数字/字符串更智能、更准确,语音合成自然度更好、可懂度更高。SYN6288语音合成效果和智能化程度均得到大幅度提高,是一款真正面向中高端行业应用领域的中文语音合成芯片。

3、语音播报模块测试

在开始使用前,先进行下芯片或模块测试,看看输出语音是否正常,我们先进行连线,该模块一共引出4根线,红色接5V供电,这个一定要注意,如果接3.3V,出现语音不清晰的现象。黑色接GND,黄色是接收数据线,接受来自单片机的数据,接USBToTTL模块的TXD,白色是发送数据线,由于没有语音输入,因此该线不接也是可以的,如果要接就接SBToTTL模块的RXD。

接好后插入PC的USB端口。

(1)应用程序测试

插上之后会有提示音,打开宇音天下PC测试程序。

这里只有2个COM口,需要到设备管理器查询我们所使用的COM是否为1和2,如果不是1和2,需要手工设置下。 

 设置好就可以播放文本了。这个应用程序比较老了,一直没有更新,所以只支持串口1、2。语音播报能听,但是整体效果一般,人声阅读没有情感,较为生硬,这里可做做文章,研究下基于情感的阅读芯片。

(2)串口程序发送测试

只要选对串口,设置好波特率,停止位等相关参数,那么就可以使用这个模块。

当点击发送,就会以该文本中文字符的GBK编码数据通过串口发送到语音播报模块,然后它就发出相应的声音。有了这个串口,我感觉使用应该非常简单了。

4、实验代码与现象

红线接5V,黑线接GND,黄线接TXD0,物理引脚8,白色线可以不接。实验完成功能:当按键按下,LED灯亮,语音播报照明灯已经打开一次!再次按下,LED灯灭,语音播报照明灯已经关闭一次。

import serial
import RPi.GPIO as GPIO
import time
import threading
# 指定编号规则为BOARD
GPIO.setmode(GPIO.BOARD)
# 关闭警告
GPIO.setwarnings(False)
# 设置输入引脚
global channel
channel = 13
led = 11
#设置GPIO11输出模式
GPIO.setup(led,GPIO.OUT)
# 设置GPIO输入模式, 使用GPIO内置的上拉电阻, 即开关断开情况下输入为HIGH
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)

global Light_Flag
Light_Flag=False

def Buttom_check():
    global Light_Flag
    while True:
        if GPIO.input(channel)==GPIO.LOW:
            time.sleep(0.15)
            if GPIO.input(channel)==GPIO.LOW:
                print('Button pressed.')
                Light_Flag=~Light_Flag
                print(Light_Flag)
                break
         

def other_thread_work():
    if Light_Flag:
        GPIO.output(led,GPIO.LOW)
        pl.write(bytes('照明灯已经打开!','gb2312'))
    else:
        GPIO.output(led,GPIO.HIGH)
        pl.write(bytes('照明灯已经关闭!','gb2312'))


if __name__=='__main__':
    #指定串口设备,设置波特率/打开串口,如果已经打开就不用了
    DEVICE = "/dev/ttyS0"
    pl=serial.Serial(DEVICE,baudrate=9600)
    lock = threading.Lock()
    try:
        while True:
            # 启动按键检测线程
            t0 = threading.Thread(target=Buttom_check)
            t0.start()
            # 创建并启动线程
            t1 = threading.Thread(target=other_thread_work)
            t1.start()
            t0.join()
            t1.join()

    except KeyboardInterrupt:
        print('程序结束')
    finally:
        GPIO.cleanup()

本代码可能和之前的代码有所不同,结构有所变化,主要是增加了多线程处理。我也是不得已而为之,后面会单独写内容来介绍。主要问题有以下几个。

(1)按键检测需要放到死循环里面不停检测,还要注意消抖的问题

(2)串口发送字节如果放到循环里面,必须要给time.sleep函数延时,不然它会将数据接收到缓冲区,程序结束才会播报。

(3)程序功能只让播报一次,不能一直播报,不然影响作息。

(4)如果放到循环里面,即便播报一次,也需要给几秒的延时,不然没有时间响应,但是一旦给延时,CPU就不能响应按键,按键就会失灵,这也是嵌入式开发常见的问题。等有时间详细给同学们解释。

语音播报

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值