84 lines
2.5 KiB
Python
84 lines
2.5 KiB
Python
"""
|
|
SYN6288
|
|
|
|
Micropython library for the SYN6288(speech synthesis)
|
|
=======================================================
|
|
#Preliminary composition 20220805
|
|
|
|
dahanzimin From the Mixly Team
|
|
"""
|
|
import time
|
|
from micropython import const
|
|
|
|
REG_PLAY_SST = const(0x01)
|
|
#REG_BAUD_SST = const(0x31)
|
|
#REG_STOP_SST = const(0x02)
|
|
#REG_PAUSE_SST = const(0x03)
|
|
#REG_RESUME_SST = const(0x04)
|
|
#EG_QUERY_SST = const(0x21)
|
|
#EG_DOWN_SST = const(0x88)
|
|
|
|
class SYN6288:
|
|
def __init__(self, uart):
|
|
self._uart=uart
|
|
self._uart.init(baudrate=9600)
|
|
self._state=False
|
|
self._volume="[v10]"
|
|
|
|
def _wreg(self, reg, val5=0,val3=None, data=None):
|
|
'''Write memory address'''
|
|
buffer=[0xFD,0x00,0x00,reg]
|
|
eec=0
|
|
|
|
if not val5 is None and not val3 is None :
|
|
buffer.append((val3 & 0x07) | (val5 << 3))
|
|
if not data is None:
|
|
for char in data:
|
|
buffer.append(ord(char) >> 8)
|
|
buffer.append(ord(char) & 0xFF)
|
|
|
|
buffer[2]= len(buffer)-2
|
|
for i in range(len(buffer)):
|
|
eec^=int(buffer[i])
|
|
buffer.append(eec)
|
|
|
|
self._uart.write(bytes(buffer))
|
|
|
|
def volume(self,vol=None):
|
|
if vol is None:
|
|
return int(self._volume[2:-1])
|
|
if not 0 <= vol <= 16:
|
|
raise ValueError("The effective range of volume value is 0~16")
|
|
else:
|
|
self._volume="[v{}]".format(vol)
|
|
|
|
def synthesis(self, data, music=0, blocking=True):
|
|
"""Support uincode coded speech synthesis"""
|
|
self._wreg(REG_PLAY_SST,music,3,self._volume+str(data))
|
|
time.sleep(0.1)
|
|
while blocking :
|
|
if not self.status():
|
|
break
|
|
|
|
def status(self):
|
|
"""Playback status (true is playing)"""
|
|
if self._uart.any():
|
|
state= self._uart.read()
|
|
if state==b'A':
|
|
self._state = True
|
|
if state==b'O':
|
|
self._state = False
|
|
return self._state
|
|
|
|
def hint_tones(self,number, blocking=True):
|
|
"""Play built-in prompt tone"""
|
|
if number <25:
|
|
tones="sound"+chr(ord("a")+number)
|
|
elif number <33:
|
|
tones="msg"+chr(ord("a")+number-25)
|
|
elif number <48:
|
|
tones="ring"+chr(ord("a")+number-33)
|
|
else:
|
|
raise ValueError("Input out of range")
|
|
self.synthesis(tones,blocking=blocking)
|