Озвучка текста в Swift для iOS естественными голосами
На iOS синтез речи начинается с AVSpeechSynthesizer: несколько строк на Swift — и телефон читает любой текст встроенными голосами, офлайн и бесплатно. Но эти голоса зависят от того, что установил пользователь, и это те же голоса, что у всех остальных приложений.
Бесплатный движок SuperClonica даёт приложению для iOS или macOS собственный естественный голос двумя способами: заранее озвученные аудиофайлы в составе приложения или сервер синтеза, к которому обращается приложение. В этом руководстве — оба способа с готовым кодом на Swift и когда AVSpeechSynthesizer всё же правильный инструмент.
Три способа заставить iOS-приложение говорить
Многие приложения их сочетают: встроенные реплики для интерфейса, сервер для пользовательского текста, системный голос как запасной.
- AVSpeechSynthesizer: системные голоса, офлайн и бесплатно, в зависимости от того, что установил пользователь.
- Встроенные аудиофайлы: каждая неизменная реплика озвучена один раз в SuperClonica и лежит в приложении.
- Сервер синтеза: приложение отправляет текст на ваш сервер SuperClonica и проигрывает полученный WAV.
- SuperClonica говорит на 31 языке; китайский пока не поддерживается.
Подберите голос бесплатно онлайн
На странице любого голоса впишите реплику своего приложения, от 30 до 100 символов, выберите язык и нажмите «Озвучить». Через несколько секунд вы услышите, подходит ли голос, без регистрации, прямо на iPhone.
Встройте озвученные реплики
Встроенные файлы работают офлайн и без задержки; правка — это новая версия приложения.
- Озвучьте каждую реплику на Mac движком: python -m pip install superclonica-cpu, затем superclonica --text "С возвращением!" --voice F1 --lang ru --output welcome.mp3.
- Добавьте файлы в проект Xcode, чтобы они копировались в бандл приложения.
- Проигрывайте реплику через AVFoundation: player = try AVAudioPlayer(contentsOf: Bundle.main.url(forResource: "welcome", withExtension: "mp3")!); player.play()
- Храните player в свойстве класса: локальный AVAudioPlayer замолкает, как только освобождается.
Обращайтесь к своему серверу синтеза
Запустите сервер на машине, которой вы управляете: docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu. iOS по умолчанию ждёт HTTPS, поэтому поставьте сервер за сертификат и задайте SUPERCLONICA_API_KEY, чтобы им пользовалось только ваше приложение. Тогда реплика — один запрос: var request = URLRequest(url: URL(string: "https://tts.example.com/synthesize")!); request.httpMethod = "POST"; request.setValue("application/json", forHTTPHeaderField: "Content-Type"); request.httpBody = try JSONEncoder().encode(["text": "Ваш заказ уже в пути.", "voice": "F1", "lang": "ru"]); let (data, _) = try await URLSession.shared.data(for: request); player = try AVAudioPlayer(data: data); player.play() Добавьте заголовок Authorization с ключом и кешируйте данные повторяющихся реплик.
Когда хватит AVSpeechSynthesizer
AVSpeechSynthesizer хватит, когда голос нужно только понять: чтение уведомления, помощник доступности, прототип или приложение, которое должно говорить совсем без сети. Выбирайте SuperClonica, когда голос — часть продукта: репетитор по языку, игровой персонаж, медитация с ведущим, бренд, который должен звучать одинаково у каждого пользователя.