ESP32-S3 吊坠设备固件,集成火山引擎 RTC 语音助手、蓝牙配网、 VEML7700 环境光传感器驱动及石头同频匹配交友功能。 VEML7700 驱动: - 基于 ESP-IDF i2c_master API 实现,复用项目 I2cDevice 基类 - 支持 ALS + White 双通道、自动量程、Vishay 非线性校正 - 3 次采样取中位数过滤偶发异常 石头同频匹配算法(双维度): - 维度1:光谱比值 ALS/White(石头固有光学特征,不随光照强度变化) - 维度2:亮度等级(5级对数划分,排除极端环境差异) - 比值阈值 15%,实测同石头姿势变化波动 1.6%~9.6%,安全余量充足 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
import struct
|
|
import sys
|
|
import opuslib
|
|
import numpy as np
|
|
from tqdm import tqdm
|
|
import soundfile as sf
|
|
|
|
|
|
def decode_p3_to_audio(input_file, output_file):
|
|
sample_rate = 16000
|
|
channels = 1
|
|
decoder = opuslib.Decoder(sample_rate, channels)
|
|
|
|
pcm_frames = []
|
|
frame_size = int(sample_rate * 60 / 1000)
|
|
|
|
with open(input_file, "rb") as f:
|
|
f.seek(0, 2)
|
|
total_size = f.tell()
|
|
f.seek(0)
|
|
|
|
with tqdm(total=total_size, unit="B", unit_scale=True) as pbar:
|
|
while True:
|
|
header = f.read(4)
|
|
if not header or len(header) < 4:
|
|
break
|
|
|
|
pkt_type, reserved, opus_len = struct.unpack(">BBH", header)
|
|
opus_data = f.read(opus_len)
|
|
if len(opus_data) != opus_len:
|
|
break
|
|
|
|
pcm = decoder.decode(opus_data, frame_size)
|
|
pcm_frames.append(np.frombuffer(pcm, dtype=np.int16))
|
|
|
|
pbar.update(4 + opus_len)
|
|
|
|
if not pcm_frames:
|
|
raise ValueError("No valid audio data found")
|
|
|
|
pcm_data = np.concatenate(pcm_frames)
|
|
|
|
sf.write(output_file, pcm_data, sample_rate, subtype="PCM_16")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) != 3:
|
|
print("Usage: python convert_p3_to_audio.py <input.p3> <output.wav>")
|
|
sys.exit(1)
|
|
|
|
decode_p3_to_audio(sys.argv[1], sys.argv[2])
|