File size: 4,392 Bytes
073ffab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d51d114
 
 
 
 
 
 
 
 
 
d8622a2
 
 
 
89686a6
 
073ffab
 
 
 
82f6b57
 
 
 
 
d51d114
 
 
 
073ffab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# Vision

What microquack is for, where it is going, and the constraints that hold
regardless of implementation detail.

## The goal

microquack is the voice of the microduck robot. One engine β€” `microquack-core`
(Rust) β€” is the single source of truth for every sound: the same crate renders
on the website (WASM), in the fitting CLI, and eventually on the robot itself
(native, 48 kHz PCM). TypeScript exists only for the web presentation.
Nothing that affects the sound may exist twice.

The repository is also meant to be exemplary: conformance-tested ports, one
score contract, strict quality gates, and a research trail (`research/`) that
shows how the sounds were derived.

## The experience

microduck talks **by itself**. Nobody selects presets and nobody has to type
for it to speak. The site shows the robot in a rendered world; it wakes up,
looks around, and babbles droid-speak continuously β€” mood-shaped phrases with
pauses, like overhearing a small robot thinking out loud. Captions transcribe
each utterance as droid text ("bweep brrrt boo?") with its mood.

The conversation layer is a chat: the visitor reads and writes English
(preset chips or free text), and the robot answers in droid speak with an
English gloss underneath. A very small embedded language model (in the
spirit of [minionese](https://github.com/maddiedreese/minionese)), trained
in this repository and run in the browser, chooses a short English reply and
an emotion; the engine turns that emotion into sound. Speech stays fully
procedural β€” the model only chooses what to say and how it feels, never how
it sounds. When nobody is talking to it, the robot says something on its own
every 10–15 seconds.

Emotions are first-class. Rust defines 73 child-safe semantic states, from
curiosity and joy to jealousy, shame, grief, and awe. It maps them to 12 broad
voice modes and shared affect values. The English reply carries the exact
meaning; the voice and real robot joints carry its broader tone and energy.
The current eight-emotion model remains in production until the expanded
teacher data is reviewed and a later training run is approved.

## The stage

The site renders the **real robot** β€” assembled from microduck's mesh library
and kinematic tree β€” on the bridge of a spaceship orbiting a planet: a
window band with structural mullions looking out on space and moons, as
realistic as browser rendering sensibly allows. Other microducks (the real
roller variant, in the other real colourways) glide around the bridge doing
chores at the crew consoles.
The camera does not swivel: a fixed, chat-like framing on the robot's upper
body with only the slowest natural drift. Assets are permissively licensed
only (CC0 / public domain / CC-BY with credit); no copyrighted names or
designs, ever. That also applies to audio:
the corpus is fitted only from open-source droid sample packs β€” never from
film audio.

Motion evolves in the same direction as speech:

1. **Speech-driven articulation** (current): jaw, head pitch/yaw driven by the
   engine's control frames; idle look-around.
2. **Procedural full-body motion**: weight shifts, steps, gestures synced to
   phrase moods.
3. **Policy-driven motion**: the trained microduck locomotion policies (from
   `microduck_rl`, as in the Microduck Sandbox) running in the browser via
   ONNX Runtime Web, blended with speech-driven gestures β€” the duck walks
   around its world while it talks.

## Device parity

Whatever ships here must be directly usable on the robot:

- The robot consumes `microquack-core` as a versioned crate (exact version,
  or an immutable git revision until published) β€” never vendored source.
- 48 kHz is the canonical device output rate; scores are written in seconds
  and hertz so they are sample-rate independent, and the renderer owns all
  rate-specific behavior.
- `Engine::render_into` feeds the robot's PCM path in blocks;
  `Engine::control_frame` drives the physical beak and body the same way it
  drives the 3D model.

## Non-negotiables

- One engine. Ports and hosts are bindings, not implementations.
- Behavior changes to the engine require updating the conformance fixtures
  deliberately, never silently.
- Everything audible is synthesized from a JSON score at runtime.
- No copyrighted audio or 3D assets; the corpus sources are the open-source
  packs credited in `research/README.md`.