优化了很多问题。
This commit is contained in:
@@ -10,34 +10,20 @@ import urandom
|
||||
|
||||
import shared_vars
|
||||
|
||||
# I2S 引脚配置
|
||||
BCLK_PIN = 13
|
||||
WS_PIN = 12
|
||||
SD_PIN = 14
|
||||
# 增益控制引脚
|
||||
GAIN_PIN = 15
|
||||
|
||||
# 初始 I2S 配置,后续根据文件实际参数调整
|
||||
SAMPLE_RATE = 16000
|
||||
BITS_PER_SAMPLE = 16 # 修改为 16 位
|
||||
CHANNELS = 2
|
||||
BUFFER_SIZE = 8192
|
||||
|
||||
# 初始化I2S配置(用于音频输出)
|
||||
def init_i2s():
|
||||
global BCLK_PIN, WS_PIN, SD_PIN, GAIN_PIN, SAMPLE_RATE, BITS_PER_SAMPLE, CHANNELS, BUFFER_SIZE
|
||||
gain_pin = machine.Pin(GAIN_PIN, machine.Pin.OUT)
|
||||
gain_pin = machine.Pin(shared_vars.GAIN_PIN, machine.Pin.OUT)
|
||||
gain_pin.value(1)
|
||||
# 使用GPIO14 (BCLK), GPIO15 (LRC), GPIO32 (DIN)
|
||||
i2s = I2S(0,
|
||||
sck=Pin(BCLK_PIN), # Serial clock output
|
||||
ws=Pin(WS_PIN), # Word clock output
|
||||
sd=Pin(SD_PIN), # Serial data output
|
||||
sck=Pin(shared_vars.BCLK_PIN), # Serial clock output
|
||||
ws=Pin(shared_vars.WS_PIN), # Word clock output
|
||||
sd=Pin(shared_vars.SD_PIN), # Serial data output
|
||||
mode=I2S.TX, # 使用发送模式
|
||||
bits=BITS_PER_SAMPLE, # 修改为 16 位数据
|
||||
format=I2S.MONO if CHANNELS == 1 else I2S.STEREO, # 修正声道判断逻辑
|
||||
rate=SAMPLE_RATE, # 采样率
|
||||
ibuf=BUFFER_SIZE) # 输入缓冲区大小
|
||||
bits=shared_vars.BITS_PER_SAMPLE, # 修改为 16 位数据
|
||||
format=I2S.MONO if shared_vars.CHANNELS == 1 else I2S.STEREO, # 修正声道判断逻辑
|
||||
rate=shared_vars.SAMPLE_RATE, # 采样率
|
||||
ibuf=shared_vars.BUFFER_SIZE) # 输入缓冲区大小
|
||||
return i2s
|
||||
|
||||
class InterphoneHandler:
|
||||
@@ -55,7 +41,7 @@ class InterphoneHandler:
|
||||
f.seek(44)
|
||||
while True:
|
||||
# 读取音频数据块
|
||||
data = f.read(BUFFER_SIZE)
|
||||
data = f.read(shared_vars.BUFFER_SIZE)
|
||||
if len(data) == 0:
|
||||
break
|
||||
# 将音频数据写入 I2S 接口
|
||||
@@ -69,9 +55,12 @@ class InterphoneHandler:
|
||||
audio_out.deinit()
|
||||
|
||||
def stream_and_play(self, data):
|
||||
current_task_id = shared_vars.handle_task_id
|
||||
url = "https://iot.julecn.com/interphone/get_voice?name=" + data['name'] # 替换为音频文件的URL
|
||||
print(url)
|
||||
shared_vars.player_name = data['voice_url']
|
||||
url = data['voice_url'] # 替换为音频文件的URL
|
||||
volume = data.get('volume', 1.0) # 从 data 中读取音量信息,默认值为 1.0(原始音量)
|
||||
print(f"播放音频 URL: {url}, 音量: {volume}")
|
||||
time.sleep(1)
|
||||
shared_vars.player_flag = True
|
||||
try:
|
||||
print("添加请求头信息")
|
||||
headers = {
|
||||
@@ -93,21 +82,20 @@ class InterphoneHandler:
|
||||
raise ValueError("Not a valid WAV file")
|
||||
|
||||
print("提取采样率、位深、声道数")
|
||||
global SAMPLE_RATE, BITS_PER_SAMPLE, CHANNELS
|
||||
SAMPLE_RATE = int.from_bytes(header[24:28], 'little')
|
||||
BITS_PER_SAMPLE = int.from_bytes(header[34:36], 'little')
|
||||
CHANNELS = int.from_bytes(header[22:24], 'little')
|
||||
shared_vars.SAMPLE_RATE = int.from_bytes(header[24:28], 'little')
|
||||
shared_vars.BITS_PER_SAMPLE = int.from_bytes(header[34:36], 'little')
|
||||
shared_vars.CHANNELS = int.from_bytes(header[22:24], 'little')
|
||||
|
||||
print("初始化 I2S 输出")
|
||||
audio_out = init_i2s()
|
||||
print("开始流式播放")
|
||||
chunk_size = 512
|
||||
while shared_vars.handle_task_id == current_task_id:
|
||||
chunk_size = 128
|
||||
while shared_vars.player_flag and shared_vars.player_name == data['voice_url']:
|
||||
chunk = response.raw.read(chunk_size)
|
||||
if not chunk:
|
||||
break
|
||||
audio_out.write(chunk)
|
||||
|
||||
|
||||
except Exception as e:
|
||||
print("Playback error:", e)
|
||||
finally:
|
||||
@@ -115,8 +103,18 @@ class InterphoneHandler:
|
||||
audio_out.deinit()
|
||||
if 'response' in locals():
|
||||
response.close()
|
||||
shared_vars.player_flag = False
|
||||
print('音频播放完成')
|
||||
|
||||
def stop_playing(self, data):
|
||||
shared_vars.player_flag = False
|
||||
print("停止播放音频")
|
||||
pass
|
||||
|
||||
def get_playing_status(self, data):
|
||||
status = {
|
||||
'playing': shared_vars.player_flag,
|
||||
'player_name': shared_vars.player_name
|
||||
}
|
||||
print(f"获取播放状态: {status}")
|
||||
return status
|
||||
Reference in New Issue
Block a user