OK啊兄弟们,最近这个任天堂的闲聊花也是正式上市了
我就赶紧整了一个回来,但是越看越觉得不是很符合预期

这玩意说的话就那几句,按几下就说完了,感觉可玩性不是很高,没什么意思,于是就和好兄弟无敌铁牛老师一起商量着DIY手搓一个花出来

我的思路是用Seeed XIAO ESP32C3开发板连接DFPlayer mini 播放器模块,再接一个直径 20mm 8欧1W的圆形扬声器就能搞定芯片了,
至于花壳子,就交给牛老师来3D打印。

说干就干,我把这个项目取名叫 无敌花花牛

没两天采购的东西就送到了,这个焊接也是非常简单,


播放器的孔位是这样看的:
有金属卡槽,且印着DFPlayer Mini英文在正上方的那一面
我们只看左边那一排的8个孔(从上往下数):
第 1 个孔:VCC (一会接主板的 5V)
第 2 个孔:RX (一会接主板的 TX)
第 3 个孔:TX (一会接主板的 RX)
第 4 个孔:不用管
第 5 个孔:不用管
第 6 个孔:SPK_1 (接喇叭的一根线)
第 7 个孔:GND (一会接主板的 GND)
第 8 个孔(最左下角那个):SPK_2 (接喇叭的另一根线)

XIAO ESP32C3的孔位是这样看的:
背面印着很多白字的那一面
5V供电:左列第 1 个孔(VUSB)连 DFPlayer 的 VCC
GND负极:左列第 2 个孔(GND)连 DFPlayer 的 GND
TX(发送):右列最下面第 7 个孔(D6)连 DFPlayer 的 RX
RX(接收):左列最下面第 7 个孔(D7)连 DFPlayer 的 TX

喇叭红线焊接到 DFPlayer Mini 的 SPK_1 孔
黑线焊接到 DFPlayer Mini 的 SPK_2 孔
XIAO 的 5V 引脚连接DFPlayer 的 VCC 引脚
XIAO 的 GND 引脚连接DFPlayer 的 GND 引脚
XIAO 的 D6 (TX) 引脚连接DFPlayer 的 RX 引脚
XIAO 的 D7 (RX) 引脚连接DFPlayer 的 TX 引脚

就行了,然后简单写一段代码,用Thonny烧录到板子上,

也很简单,
打开 Thonny 软件。
点击顶部菜单栏的 运行 (Run) -> 配置解释器 (Configure interpreter)。
在弹出的窗口中,选择 MicroPython (ESP32)。
端口选择带有 USB Serial 或者 COM 字样的那个,点击右下角的 安装或更新 MicroPython (Install or update MicroPython)。
目标端口选你的板子,微控制器系列选 ESP32-C3。点击“安装”,等待进度条跑完。这就相当于给开发板重装了一个极简的 Python 操作系统。
然后把下面这段代码保存为main.py,储存在MicroPython 设备

import machine
import time
import urandom

# 1. 初始化串口
uart = machine.UART(1, baudrate=9600, tx=21, rx=20)

def send_command(cmd, param1, param2):
    """自动计算校验码并发送指令"""
    checksum = -(0xFF + 0x06 + cmd + 0x00 + param1 + param2)
    checksum_high = (checksum >> 8) & 0xFF
    checksum_low = checksum & 0xFF
    command = bytearray([0x7E, 0xFF, 0x06, cmd, 0x00, param1, param2, checksum_high, checksum_low, 0xEF])
    uart.write(command)

print("=== 长供电:10秒随机播放器已启动 ===")

# 给芯片 3 秒钟的开机读取和挂载内存卡的时间
time.sleep(3)

# 2. 设置音量
print("发送指令:设置音量大小 (最大为30)")
send_command(0x06, 0x00, 30)

# 给半秒钟让音量指令生效
time.sleep(0.5)

# 一共有多少个 MP3 文件,需要根据实际数量修改这个数字
TOTAL_SONGS = 60

# 3. 进入 10 秒定时循环
while True:
    # 生成 1 到 TOTAL_SONGS 之间的随机整数
    random_track = urandom.randint(1, TOTAL_SONGS)
    
    print(f"抽中曲目:00{random_track:02d}.mp3")
    
    # 指令 0x12: 强制播放 mp3 文件夹里的对应编号文件
    send_command(0x12, 0x00, random_track)
    
    print("等待 10 秒后再次触发...\n")
    # 程序挂起 10 秒
    time.sleep(10)

再在TF卡的这个目录:
TF:\mp3\
放入闲聊花的语音文件,就可以了,现在插上电,应该就可以不定时发癫了

对了,目录里面的音频文件,最好是个MP3文件,然后名字按照0001,0002进行排序,处理音频这块,我也额外写了个批量wav转mp3,然后再在前面加3s空白声音的脚本

import os
from pydub import AudioSegment

# 配置文件夹路径 (请根据实际情况修改,支持相对路径)
INPUT_DIR = "D:\\1\\Chinese_Traditional"
OUTPUT_DIR = "D:\\1\\out"

# 确保输出文件夹存在
if not os.path.exists(OUTPUT_DIR):
    os.makedirs(OUTPUT_DIR)

def process_audios():
    # 1. 生成 3 秒的纯静音 (pydub 的时间单位是毫秒)
    three_sec_silence = AudioSegment.silent(duration=3000)
    
    # 2. 获取 input 文件夹下的所有文件,并按名称排序
    # 过滤掉隐藏文件 (比如 macOS 产生的 ._ 文件,或者 .DS_Store)
    files = [f for f in os.listdir(INPUT_DIR) if not f.startswith('.')]
    files.sort()
    
    if not files:
        print("input 文件夹里没有找到音频文件")
        return

    print(f"找到 {len(files)} 个文件,开始批量处理防吞音...\n")

    # 3. 遍历处理并重命名
    count = 1
    for filename in files:
        input_path = os.path.join(INPUT_DIR, filename)
        
        # 格式化输出文件名为 0001.mp3, 0002.mp3 ...
        output_filename = f"{count:04d}.mp3"
        output_path = os.path.join(OUTPUT_DIR, output_filename)
        
        try:
            print(f"正在处理: {filename} -> {output_filename} ...")
            
            # 读取原始音频 (pydub 会自动识别 wav, mp3, m4a 等各种格式)
            original_audio = AudioSegment.from_file(input_path)
            
            # 将 3 秒静音拼接在最前面
            final_audio = three_sec_silence + original_audio
            
            # 导出为标准的 MP3 格式,码率设为 128k (对 DFPlayer 兼容性最好)
            final_audio.export(output_path, format="mp3", bitrate="128k")
            
            count += 1
            
        except Exception as e:
            print(f"跳过文件 {filename},可能不是有效的音频格式。报错: {e}")

    print("\n所有音频处理完毕!请去 output 文件夹提取。")

if __name__ == "__main__":
    process_audios()

如果想要连接电池和开关的话,也是可以的,电池我用的是602535锂电池,差不多十块钱一块
微型拨动开关底部有 3 根金属脚,在其中任意一侧的边缘脚和中间脚上点一点锡,第三根脚空着不用管它就行,然后把电池的红线从中间剪断,两头剥皮,再串联开关,把剪断的红线,一头焊在开关的边缘脚上,另一头焊在中间脚上,这样开关就能控制电路通断了,
最后焊接到主板背面,翻到 XIAO ESP32C3 的背面(没黑芯片的那一面),有两个平焊盘,旁边印着 BAT+ 和 BAT-。
电池黑线焊接到 BAT- 焊盘,经过开关出来的电池红线焊接到 BAT+ 焊盘,就可以了。

当然了,用GPT-SoVITS的话,也是可以做到让闲聊花说自己想让他说的内容的,生成之后一并扔到TF卡里就可以了,这里不再过多赘述。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐