Впровадження генерування звукових ефектів з штучним інтелектом в мобільному додатку
Звукові ефекти за описом — окремий клас завдань від генерування музики. Потрібен не трек з мелодією, а короткий (0.5–5 сек) конкретний звук: удар меча, шум дощу, натискання кнопки. ElevenLabs Sound Effects та AudioCraft (EnCodec + AudioGen) — основні інструменти.
ElevenLabs Sound Effects API
Найкращий за якістю та простотою інтеграції варіант. Приймає текстовий опис, повертає mp3 за 2–8 секунд:
POST https://api.elevenlabs.io/v1/sound-generation
xi-api-key: <key>
Content-Type: application/json
{
"text": "A heavy metal sword hitting a stone floor with a sharp clang and short reverb",
"duration_seconds": 2.0,
"prompt_influence": 0.3
}
prompt_influence від 0 до 1: чим вище, тим буквальніше інтерпретація промпту. Для коротких ефектів (< 1 сек) ставимо 0.7–0.9.
Відповідь — бінарний mp3 у тілі відповіді (не JSON з URL). На мобільному:
// iOS: прямого скачування бінарної відповіді
func generateSoundEffect(description: String, duration: Double) async throws -> Data {
var request = URLRequest(url: URL(string: "https://api.elevenlabs.io/v1/sound-generation")!)
request.httpMethod = "POST"
request.setValue("audio/mpeg", forHTTPHeaderField: "Accept")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue(apiKey, forHTTPHeaderField: "xi-api-key")
request.httpBody = try JSONEncoder().encode(SoundGenRequest(
text: description, duration_seconds: duration, prompt_influence: 0.4
))
let (data, response) = try await URLSession.shared.data(for: request)
guard (response as? HTTPURLResponse)?.statusCode == 200 else {
throw SoundGenError.apiError
}
return data // mp3 bytes
}
Час генерування невеликий — достатньо простого activity indicator, не потрібен складний асинхронний polling.
Кеширування сгенерованих звуків
Один і той ж звуковий ефект користувач може використовувати багаторазово — регенерувати кожен раз дорого та повільно. Кеш за хешем промпту + тривалістю:
// Android
class SoundEffectCache(private val cacheDir: File) {
private fun cacheKey(prompt: String, duration: Double): String =
"${prompt.hashCode()}_${(duration * 10).toInt()}.mp3"
fun getCached(prompt: String, duration: Double): File? {
val file = File(cacheDir, "sfx/${cacheKey(prompt, duration)}")
return if (file.exists()) file else null
}
fun saveToCache(prompt: String, duration: Double, data: ByteArray): File {
val dir = File(cacheDir, "sfx").also { it.mkdirs() }
val file = File(dir, cacheKey(prompt, duration))
file.writeBytes(data)
return file
}
}
UI паттерни: бібліотека проти вбудованої генерації
Два підходи UX:
- Вбудована — користувач пише опис, генерує одразу в контексті (редактор, гра)
- Бібліотека — попередньо сгенерований каталог ефектів, користувач переглядає та вибирає
Вбудована простіша але повільніша UX. Бібліотека вимагає управління каталогом на бекенді, але миттєве відтворення.
Терміни
Базова генерація + UI відтворення — 2–3 дні. З кешем, UI бібліотеки, пакетною генерацією — 1–2 тижні.







