Files
mixly3/boards/default/micropython_esp32s3/build/lib/mixgo_nova_voice.py

94 lines
2.6 KiB
Python

"""
mixgo_nova Voice Onboard resources
Micropython library for the mixgo_nova Onboard resources
=======================================================
@dahanzimin From the Mixly Team
"""
import es8374
import ustruct
import music_spk
from machine import Pin
from esp_i2s import I2S
from esp_tts import TTS
from mixgo_nova import onboard_i2c
ob_code = es8374.ES8374(onboard_i2c)
ob_tts = TTS()
ob_audio = I2S(0, sck=Pin(34), ws=Pin(47), sd_out=Pin(48), sd_in=Pin(33), mck=Pin(35), channels=1)
ob_audio.start()
spk_midi = music_spk.MIDI(ob_audio)
def u2s(n):
return n if n < (1 << 15) else n - (1 << 16)
def sound_level():
buf = bytearray(100)
values = []
ob_audio.readinto(buf)
for i in range(len(buf)//2):
values.append(u2s(buf[i * 2] | buf[i * 2 + 1] << 8))
return max(values) - min(values)
def play_tts(text, speed=3):
ob_audio.stop()
ob_audio.sample_rate = 16000
ob_audio.start()
if ob_tts.parse_chinese(text):
while True:
data = ob_tts.stream_play(speed)
if not data:
break
else:
ob_audio.write(data)
def play_audio(path, chunk=1024):
file = open(path, 'rb')
header = file.read(44)
if header[8:12] != b'WAVE':
raise Error('not a WAVE file')
ob_audio.stop()
ob_audio.sample_rate = ustruct.unpack('<I', header[24:28])[0]
ob_audio.start()
file.seek(44)
while True:
block = file.read(chunk)
if not block:
break
ob_audio.write(block)
file.close()
def record_audio(path, seconds=5, sample_rate=22050, chunk=512):
ob_audio.stop()
ob_audio.sample_rate = sample_rate
ob_audio.start()
file_size = sample_rate * 16 * 1 * seconds // 8
wav_header = bytearray(44)
wav_header[0:4] = b'RIFF'
ustruct.pack_into('<I', wav_header, 4, file_size + 36)
wav_header[8:40] = b'WAVEfmt \x10\x00\x00\x00\x01\x00\x01\x00"V\x00\x00D\xac\x00\x00\x02\x00\x10\x00data'
ustruct.pack_into('<I', wav_header, 40, file_size)
buf = bytearray(chunk)
file = open(path, 'wb')
file.write(wav_header)
for _ in range(file_size // chunk):
ob_audio.readinto(buf)
file.write(buf)
file.close()
def play_audio_url(url, chunk=1024):
import urequests
response = urequests.get(url, stream=True)
header = response.raw.read(44)
if header[8:12] != b'WAVE':
raise Error('not a WAVE file')
ob_audio.stop()
ob_audio.sample_rate = ustruct.unpack('<I', header[24:28])[0]
ob_audio.start()
while True:
block = response.raw.read(chunk)
if not block:
break
ob_audio.write(block)
response.close()