Реализация AI-генерации музыки (Suno/Udio) в мобильном приложении
Suno и Udio — два основных API для генерации полноценных треков с вокалом. Оба принимают текстовый промпт, оба возвращают mp3/wav через асинхронную задачу. Интеграция технически проще, чем видеогенерация, — файлы меньше, время генерации короче — но есть несколько нюансов.
Suno API: что реально доступно
Официальный публичный API Suno по состоянию на март 2025 находится в closed beta. Прямая интеграция возможна через unofficial API-обёртки (неустойчиво) или через Replicate, где задеплоены open-source альтернативы (MusicGen от Meta, AudioCraft).
Для продакшена надёжнее использовать:
- ElevenLabs AI Music — REST API, треки до 3 минут, стили по тексту
- Replicate + MusicGen — open-source, контролируемо, дешевле
- Udio API — early access, промпт + референс-трек для стиля
Пример запроса к ElevenLabs Music:
POST https://api.elevenlabs.io/v1/sound-generation
xi-api-key: <key>
{
"text": "Upbeat electronic music for a fitness app, 120 BPM, energetic",
"duration_seconds": 30,
"prompt_influence": 0.5
}
Ответ через 15–40 секунд — бинарный mp3 или JSON с URL.
Асинхронный флоу на iOS
class MusicGenerationService {
func generate(prompt: String, duration: Int) async throws -> URL {
// Для длинных треков - async job
let jobId = try await elevenLabsClient.createMusicJob(
prompt: prompt,
duration: duration
)
// ElevenLabs: polling или webhook
for delay in [5.0, 8.0, 10.0, 15.0, 20.0, 30.0] {
try await Task.sleep(nanoseconds: UInt64(delay * 1e9))
let status = try await elevenLabsClient.getJobStatus(id: jobId)
if status.state == "complete", let url = status.audioURL {
return try await downloadAudio(from: url)
}
if status.state == "error" { throw MusicGenError.failed }
}
throw MusicGenError.timeout
}
}
Время генерации 30-секундного трека — 15–30 секунд. Спиннер + прогресс достаточно, push не обязателен для таких коротких задач.
Воспроизведение и управление аудио
На iOS аудиогенерацию нужно правильно интегрировать с AVAudioSession:
// Настройка сессии: воспроизведение даже с беззвучным режимом
try AVAudioSession.sharedInstance().setCategory(
.playback,
mode: .default,
options: [.mixWithOthers]
)
try AVAudioSession.sharedInstance().setActive(true)
Если не настроить .playback category, музыка замолчит при блокировке экрана. Это частая ошибка в MVP-реализациях.
На Android: MediaPlayer для простого воспроизведения, ExoPlayer для очереди треков с плавными переходами (DefaultCrossfadeHandler).
Лицензирование и авторские права
Главный юридический вопрос: кому принадлежат права на сгенерированный трек? ElevenLabs: при paid плане — пользователю. MusicGen: MIT-лицензия модели, но статус коммерческого использования треков не урегулирован явно. Suno: по ToS треки принадлежат пользователю при наличии платной подписки.
В приложении: явно информировать пользователей об условиях лицензирования выбранного провайдера. Если трек будет использоваться в коммерческих видео — рекомендовать paid план провайдера.
Интеграция с видео
Частый кейс — подобрать или сгенерировать музыку к видеоклипу. Нужно: бит треков подогнать под длину видео (loop/trim), наложить через FFmpeg, сохранить результат.
Простой loop на FFmpeg:
ffmpeg -stream_loop -1 -i music.mp3 -i video.mp4 \
-shortest -map 0:a -map 1:v \
-c:v copy -c:a aac output.mp4
Если трек длиннее видео — trim с fade out: добавляем -af "afade=t=out:st={fade_start}:d=2".
Сроки
Базовая интеграция (генерация → воспроизведение → сохранение) — 2–4 дня. С выбором стиля, историей треков, интеграцией в видеоредактор и управлением лицензиями — 1–2 недели. Стоимость рассчитывается индивидуально.







