The starting point: the voice stays human
The project's most important constraint isn't technical, it's editorial: the voice on every song has to be Guerda's real voice, recorded as it is. Everything else — arrangement, production, adaptation into other languages — can be generated, but not the voice. That's the difference between "music made with AI" and "music by a real artist, produced with AI tools".
The production flow
Guerda drops a raw vocal recording into a folder. From there the pipeline takes over:
| Stage | What happens |
|---|---|
| 1. Ingestion | voice_ingest.py reads the audio file and asks for title, theme and language |
| 2. Production | audio_suno.py opens a shared Suno session and generates the full kompa track on Guerda's voice-persona |
| 3. Video | video_render.py composes the final video via FFmpeg, with Guerda's visual brand already baked into the pixels |
| 4. Distribution | distribute_posts.py generates post_pronti/ folders ready for each platform and language |
| 5. Publishing | dedicated publishers for FB, YT, IG, TikTok, LinkedIn |
Every song comes out in four languages — Italian, French, English, Spanish — because the Haitian diaspora in Europe, North America and Canada speaks all these languages, often within the same family.
Automated everywhere it's safe to be
Facebook, YouTube and Instagram are fully automated on a Raspberry Pi with a local queue, scheduled via staggered cron jobs so they don't overlap. But "automate everything" wasn't the goal — "automate as much as the platform allows safely" was.
Instagram was the most interesting puzzle. The Graph API requires a public URL for media, and every obvious attempt hit a different wall: a personal Google Drive with its quota exhausted, a temporary hosting service blocked by the local firewall, ngrok blocked by TLS inspection. The final solution was the simplest one: a dedicated public GitHub repository that hosts only the rendered videos, served via raw.githubusercontent.com. No dependency on quotas or unstable third-party services.
Where I chose not to automate
TikTok and LinkedIn remain semi-assisted, and not because of a technical limit I couldn't solve — by choice.
TikTok blocks automatic login (anti-bot detection on session cookies), but doesn't block navigation once you're logged in manually. The pipeline therefore uses a persistent Playwright session, opened with a one-time human login, to fill in the caption and publish without having to log in again every time.
LinkedIn is a different case: here the limit isn't technical but policy. LinkedIn explicitly forbids the use of bots to publish and suspends accounts — especially personal profiles like Guerda's, rather than company pages — more aggressively than other platforms. I built a "compose-only" system: the script opens the editor, pastes the caption, verifies it was entered correctly, and then stops and waits for a person to click "Post". Not a technical compromise, a risk choice: even one post a week published by a bot would still be unauthorized automation, regardless of volume.
Automating everything you can doesn't mean automating everything you technically could do. The final click on "Post", on LinkedIn, always stays human — by choice, not because of a bug I couldn't fix.
A fork, not a project built from scratch
Technically, Guerda Music is an independent fork of the Bachata Vibes Music suite: same shared Suno account, same Raspberry Pi for publishing, same Windows machine with a GPU for FFmpeg rendering. Isolated folders, separate trackers, but reused infrastructure — building the second artist cost a fraction of the time of the first.
What I'd add
Once the identity verification LinkedIn requires to reactivate API publishing to a company page is complete, and a caption history so the same text structure is never repeated on consecutive tracks in the same language.