A machine-learning project

Turn humming into classical music.

STICH is an AI that carries a melody from one musical world into another: the tune you hum comes back as a richer classical rendition of itself. Hum a melody, hear it reimagined.

What is it?

Think of a translator โ€” but for music.

When you translate a sentence from English to Spanish, the meaning stays the same but the words change. STICH does the same thing with music. It takes a simple hummed melody and re-voices it in a classical style.

The clever part: nobody handed it matched examples. We never showed it "this exact hum equals this exact classical piece." It learned the style of each world on its own and figured out how to travel between them.

How it works

One map of sound, and a guide across it.

๐Ÿ—บ

The map

An autoencoder learns to boil any clip down to a short list of numbers โ€” a point on a map of sound โ€” and to rebuild the audio from that point again.

๐ŸŽญ

The forger

A second network learns to move a point from the humming region of that map to the classical one โ€” trained against a critic whose whole job is to spot points that only pretend to be classical.

๐Ÿ”

The safety check

While training, a helper network learns to undo that move, and the forger is graded on whether a hum still sounds like itself after going out and coming home. That is what keeps your melody intact while the style changes.

๐ŸŽค Your hum encode โ†’ ๐Ÿ“ A point on the map generator โ†’ ๐ŸŽป Classical
Encode to a point, let the generator carry it across the map, decode back to audio. The melody rides along; only the style moves.

In machine-learning terms: an autoencoder over raw audio with a CycleGAN operating on its latent embeddings โ€” trained adversarially under a cycle-consistency loss, with a helper generator supplying the return leg that loss is measured on. Still no paired examples.

Hear it

Hand-picked before & after clips.

๐ŸŽค Humming โ†’ ๐ŸŽป Classical

Every clip on this page is real model output. The originals are drawn from the datasets, and the translations come from the same endpoint the box below calls โ€” there is no separate demo path.

Try it yourself

Upload a short hum and hear STICH translate it into classical.

Your upload runs through the live model on this machine โ€” nothing is sent anywhere else. Clips are trimmed to the first 10 seconds, and the first conversion after the server starts takes a moment longer while the model loads. It is a research checkpoint, so expect character rather than polish.

Under the hood

For the curious.

128ร—
compression into the latent space
3,744
numbers per 10-second clip
26,740
training clips, none of them paired
Model
Autoencoder over raw audio; the humming-to-classical transfer is a CycleGAN over its latent embeddings.
The latent space
A 10-second clip โ€” 480,000 samples โ€” becomes 16 channels ร— 234 frames. The generator only ever works in here, never on the waveform.
Generator
โ‰ˆ1.1 M parameters: five residual blocks of wide 1-D convolutions, kept at full length end to end. A twin of the same shape learns the return leg during training, purely to supply the cycle loss.
Discriminators
A 38 K-parameter 1-D patch critic per domain, judging stretches of the embedding rather than the clip as a whole.
Training signal
Adversarial loss, plus cycle-consistency and identity terms โ€” what keeps the melody through the translation.
Humming data
HumTrans โ€” 14,614 processed clips of recorded hummed melodies.
Classical data
MusicNet โ€” 12,126 processed clips from classical recordings.
Audio format
Mono 10-second clips โ€” 16 kHz on disk, resampled to 48 kHz for the model, which returns 48 kHz.
This site
Plain HTML, CSS & JavaScript, with a Flask server running PyTorch for the model.