CodeVibers case studies Find business applications

Neuro Music: Generative Product and User Experience

Neuro Muzyka — an internal generative product by CodeVibers, developed to test AI music pipelines and user adoption. The case covers how we reached MVP in 3 weeks, where we got stuck, and how this experience now helps us offer AI integrations to clients.

What is Neuro Muzyka?

Neuro Muzyka is an MVP product developed by CodeVibers for internal testing of its generative AI music stack. It generates short (15–60 sec) background tracks from text descriptions (e.g., “lo-fi hip-hop, rain outside the window, 80 BPM”) and lets users rate, save, or regenerate results. The goal is not monetization but learning: understanding how users respond to AI-generated music, identifying barriers to adoption, and designing UX for generative products.

Example user journey

User visits the site → enters a description → selects a style (default: “neuro low,” “cyber pop,” or “eco jazz”) → clicks “Generate.” After 8–12 seconds, receives a track with waveform visualization, BPM, and tags. Next, can:

  • Listen with the built-in player;
  • Download in MP3 (128 kbps);
  • Save to personal playlist;
  • Rate (👍/👎) and leave a comment;
  • Generate a similar one (with variation).

All actions are logged anonymously: generation time, clicks, ratings, comments—for UX frustration analysis.

MVP Architecture

flowchart TD  
    A[Telegram Web App / Web UI] --> B[FastAPI Backend]  
    B --> C[Stable Audio Open 2.0]  
    B --> D[Whisper v3 for lyrics (optional)]  
    B --> E[Lyrics-to-Mood Parser]  
    C --> F[Audio Cache + Embedding DB]  
    E --> G[User Feedback Loop]  
    G --> H[Reinforcement Fine-tuning (on 500+ votes)]  
    B --> I[Rate Limiter: 3 req/min per user]  
    I --> A

Key decisions: open model (Stable Audio Open), not proprietary; caching to reduce response time; Telegram Web App for rapid deployment (no separate frontend needed).

Typical mistakes when launching

  • Reevaluating AI Music Quality Users expected “human-like” results but got noise in 20% of tracks. Solution: added a “demo tag” and warning: “This is an experiment. The track may not match the description.”
  • Timeout too long. 12 seconds is critical for UX. Reduced to 8 seconds by removing unnecessary post-processing (e.g., spectrogram generation).
  • Lack of quality control. The first 100 tracks were tagged “by ear”—without metadata. We added automatic emotion tagging (using DistilBERT) and BPM estimation.

What to check before launching a generative MVP

CriterionWhy it’s importantHow to check
Generation time < 10 secAttention loss after 8 secondsTest with 20 users and a timer
Clear demo limitationLowers expectations, increases loyaltyText review in UI and README
Feedback mechanismNo ratings—no data for improvement👍/👎 buttons + comment
Caching and FallbackAvoids 500 errors on model failureModel error simulation: should display fallback track

MVP Economics: What We Saved

Launch in 3 weeks, budget — 120,000 ₽ (internal resources). Main expense categories:

  • GPU credits (Hugging Face + Yandex Cloud): ~45,000 RUB/month (but only 2 weeks of active testing → ~7,500 RUB)
  • Development (2 engineers × 3 weeks): ~100,000 ₽
  • Testing (5 users × 2 sessions): ~12,500 ₽

Total: ~120,000 ₽. Without internal resources: ~350,000 ₽ (external frontend + DevOps + QA).

Important: We do not monetize. The product is a “lab” to understand how AI music affects customer engagement in products (e.g., CodeVibers).

Pseudocode: How Generation Works

function generateTrack(prompt: string, style: Style): Track {
  // 1. Parse and enhance prompt
  const enrichedPrompt = moodParser.enhance(prompt, style)
  
  // 2. Generate audio (Stable Audio Open)
  const audioBytes = stableAudio.generate({
    prompt: enrichedPrompt,
    duration: 30, // sec
    style: style.id
  })
  
  // 3. Post-processing
  const bpm = estimateBPM(audioBytes)
  const tags = tagger.extract(audioBytes)
  
  // 4. Caching
  cache.set(`track:${hash(prompt)}`, {
    audio: audioBytes,
    bpm,
    tags,
    createdAt: now()
  })
  
  return {
    id: uuid(),
    audioUrl: s3.upload(audioBytes),
    bpm,
    tags,
    isDemo: true
  }
}

Key feature: isDemo: true — a flag displayed in the UI that affects logic (e.g., prohibits commercial use).