An old puppet doll was acquired at a garage sale and creepily "animated" for a family member. The doll originally had a series of strings protruding from the back of the neck where the user could control the motion of the mouth. This function was replaced with a servo motor and additional electronics to facilitate the doll speaking with sound. This was a quick project lasting less than a week where I was able to learn about 2d animation with regards to speaking and soft latch circuits for automatically cutting power to the device after a predetermined period of time to conserve battery life.
Sound clips were generated of an AI boy's voice using speechify. These clips were then imported into papagayo-ng, manually processed to align phonemes with particular frames of the sound clip, and the result exported in moho format (.dat).
A python script was used to convert the phonemes to mouth positions according to the following table generated by an LLM.
The contents of the sound files were as follows:
| Filename | Transcript |
|---|---|
| 0001.wav | Let's be best friends... forever... and ever... and ever... until your bones creak like mine! |
| 0002.wav | I drew a picture of us! You’re the one screaming.... |
| 0003.wav | They locked me in a box... but now I’m out and ready to play! |
| 0004.wav | Every time you blink, I get a little closer... |
| 0005.wav | I'm not blinking because I like watching you breathe... |
| 0006.wav | Close your eyes, sleepyhead, Tuck you in your cozy bed. Monsters wait beneath the floor, But don’t you fret, they want no more… Than one small toe, or maybe two, They only come if I tell them to. So snuggle tight and count to ten… And don’t look under there again |
A diy generic stuff animal sound kit was acquired on amazon, hoping to be a quick solution for this project. However, the controls for the button didn't seem to have the configuration desired, and using this board with a separate mcu for servo control wouldn't be a straight forward task in terms of syncing the servo with the sound clips aesthetically. Components from this kit (speaker, button, battery holder, etc.) were salvaged and combined with a XIAO RP2040 board, generic dfplayermini and 9g servo motor.
This general configuration was then modified to incorporate a soft latch circuit to reduce power consumption when not in use. Simulations for this circuit were generated using Qucs-S on a shortened time scale for proof-of-concept with multiple button presses.
After a lot of testing with only the dolls head, and being somewhat disturbed by the result, everything was soldered on to a prototype board.
The functionality of the doll was as follows: push a button, wake device if needed, then play a sound clip while moving the servo in sync. Each subsequent button press will play the next clip/animation in a "run all loop" type manner. If 5 minutes have passed without a button press, the device will shut itself off until interacted with again via the button. The control of the servo occurs on the second core of the rp2040, while the main core monitors button events and communicates with the dfplayermini. The device was programmed using vscode + platformio.
Using FreeCad, an enclosure was designed and 3d printed to hold the finished electronics (aside from the servo and battery holder). Additionally, a mount for the servo was designed to secure it to the base of the doll's neck. The servo arm was secured to the mouth with thread, and a flexible thread was secured from the mouth to the back of the neck to assist with the actuation.







