Привет, Хабр!Несколько дней назад Alibaba выпустила в открытый доступ линейку своих моделей для генерации аудио. На рынке не так часто случаются такие выпуски, Привет, Хабр!Несколько дней назад Alibaba выпустила в открытый доступ линейку своих моделей для генерации аудио. На рынке не так часто случаются такие выпуски,

Qwen3-TTS: синтезируем голос на любом устройстве

Привет, Хабр!

Несколько дней назад Alibaba выпустила в открытый доступ линейку своих моделей для генерации аудио. На рынке не так часто случаются такие выпуски, поэтому я решил проверить ее возможности и написать свой отзыв

О моделях

40817b2cd8433dd6671316febb7d16bd.png

В релиз вошло пять моделей классов 0.6B и 1.8B:

Модель

Характеристики

Языковая Поддержка

Потоковое вещание

Управление инструкциями

Qwen3-TTS-12Hz-1.7B-VoiceDesign

Performs voice design based on user-provided descriptions.

Chinese, English, Japanese, Korean, German, French, Russian, Portuguese, Spanish, Italian

Qwen3-TTS-12Hz-1.7B-CustomVoice

Provides style control over target timbres via user instructions; supports 9 premium timbres covering various combinations of gender, age, language, and dialect.

Chinese, English, Japanese, Korean, German, French, Russian, Portuguese, Spanish, Italian

Qwen3-TTS-12Hz-1.7B-Base

Base model capable of 3-second rapid voice clone from user audio input; can be used for fine-tuning (FT) other models.

Chinese, English, Japanese, Korean, German, French, Russian, Portuguese, Spanish, Italian

Qwen3-TTS-12Hz-0.6B-CustomVoice

Supports 9 premium timbres covering various combinations of gender, age, language, and dialect.

Chinese, English, Japanese, Korean, German, French, Russian, Portuguese, Spanish, Italian

Qwen3-TTS-12Hz-0.6B-Base

Base model capable of 3-second rapid voice clone from user audio input; can be used for fine-tuning (FT) other models.

Chinese, English, Japanese, Korean, German, French, Russian, Portuguese, Spanish, Italian

Особенности:

  • Новый токенизатор 12Hz достигается эффективное акустическое сжатие и многомерное семантическое моделирование речевых сигналов

  • Поддержка 11 языков

  • Потоковая генерация с минимальной задержкой

  • Тонкая настройка

Установка библиотек

Начнем с того, что нам необходимо установить файл: https://sourceforge.net/projects/sox/ и указать расположение до .exe в Path
Затем необходимо установить:

  • pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 - для работы с видеокартой NVIDIA

  • pip install huggingface_hub[hf_xet]

Готовые голоса

Для Qwen3-TTS доступно 9 голосов. Для лучшего качества рекомендуется использовать их родной язык. Таблица с голосами:

Динамик

Описание голоса

Родной язык

Vivian

Яркий, слегка резковатый молодой женский голос.

Китайский

Serena

Тёплый, нежный голос молодой женщины.

Китайский

Uncle_Fu

Опытный мужской голос с низким, мягким тембром.

Китайский

Dylan

Молодой пекинский мужской голос с чистым, естественным тембром.

Китайский (пекинский диалект)

Eric

Живой мужской голос из Чэнду с лёгкой хрипотцой.

Китайский (сычуаньский диалект)

Ryan

Динамичный мужской голос с сильным ритмическим напором.

Английский

Aiden

Солнечный американский мужской голос с чистым средним регистром.

Английский

Ono_Anna

Игривый японский женский голос с лёгким, подвижным тембром.

Японский

Sohee

Тёплый корейский женский голос, наполненный эмоциями.

Корейский

Используем стандартные голоса

Для использования стандартных голосов существует метод generate_custom_voice, в который необходимо передать:

  • строку или список строк, которые необходимо озвучить

  • язык (список языков)

  • имена спикеров

  • необязательный параметр - instruct (тонкая настройка голоса)

  • Дополнительные аргументы, такие как temperature, top_k, top_p и другие, но они нам пока не понадобятся. По умолчанию значения:

    • top_k: int = 50, top_p: float = 1.0, temperature: float = 0.9, subtalker_dosample: bool = True, subtalker_top_k: int = 50, subtalker_top_p: float = 1.0, subtalker_temperature: float = 0.9, eos_token_id: Optional[int] = None, repetition_penalty: float = 1.05,

Инициализация модели:

import torch import soundfile as sf from qwen_tts import Qwen3TTSModel model = Qwen3TTSModel.from_pretrained( "Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice", device_map="cuda:0", dtype=torch.bfloat16, attn_implementation="sdpa", )

Давайте попробуем озвучить несколько текстов разными голосами и инструкциями. Озвучиваемые тексты:

  • По данным синоптиков, предстоящая неделя принесёт долгожданное потепление. В центральных регионах температура поднимется до двадцати градусов, а дожди наконец-то сменятся ясной и солнечной погодой.

  • Здравствуйте! Вы позвонили в службу поддержки "Техно-Старт". Мы ценим ваше время. Если вы хотите узнать статус заказа, нажмите один. Если у вас возник вопрос по работе оборудования, нажмите два

first_text = '''....''' second_text = '''...''' wavs, sr = model.generate_custom_voice( text=[first_text, second_text], language=["Russian","Russian"], speaker=["Vivian","Vivian"] ) sf.write("output_base_voice_first_text_raw.wav", wavs[0], sr) sf.write("output_base_voice_second_text_raw.wav", wavs[1], sr)

Давайте попробуем добавить инструкции, чтобы немного изменить голос:

Инструкции:

  • Используй мягкий, обволакивающий тон. Говори с заботой, нежностью и спокойной теплотой

  • Говор медленно, с длительными паузами между предложениями

wavs, sr = model.generate_custom_voice( text=[first_text, second_text], language=["Russian", "Russian"], speaker=["Vivian", "Vivian"], instruct=["Используй мягкий, обволакивающий тон. Говори с заботой, нежностью и спокойной теплотой", "Говор медленно, с длительными паузами между предложениями"] ) sf.write("output_base_voice_first_text_instruct.wav", wavs[0], sr) sf.write("output_base_voice_second_text_instruct.wav", wavs[1], sr)

Если вы не хотите использовать существующих спикеров, то можете использовать метод generate_voice_design с инструкцией:

wavs, sr = model.generate_voice_design( text=first_text, language="Russian", instruct="Используй мягкий, обволакивающий тон. Говори с заботой, нежностью и спокойной теплотой", ) sf.write("output_voice_design.wav", wavs[0], sr)

У меня получилась довольно интересная и немного забавная озвучка этих текстов, так как у всех голосов есть азиатский акцент) Конечно, это относительно большой недостаток, так как голоса слабо адаптируются под новый язык, НО меня приятно удивила интонация и обработка цифр именно у базовых голосов.

Кстати, демо версия доступна здесь: https://huggingface.co/spaces/Qwen/Qwen3-TTS-Demo

Клонирование голоса

Наверное, самая интересная часть (по крайней мере для меня). Мне было очень интересно посмотреть, как модель сохраняет интонацию и паузы. Для проверки я взял, наверное, один из самых сложных голосов - монолог Джокера. Я не буду вставлять его здесь, так как он может быть слегка жестким)

Для этого нам нужно указать путь до .wav или .mp3 файла и его расшифровку:

wavs, sr = model.generate_voice_clone( text=''' Знаешь, в чем проблема этого мира? Все так отчаянно пытаются строить планы. Расписывают свою жизнь по минутам, копят на пенсию, выбирают цвет занавесок... Смешно! Они думают, что если будут следовать правилам, то правила их защитят. Но правила — это просто карточный домик. Стоит подуть легкому ветерку хаоса.... и пуф! Всё рушится.... Я не монстр, нет-нет.... Я просто тот самый ветерок.... Я показываю людям, как мало нужно, чтобы цивилизованный человек превратился в зверя. Всего лишь один плохой день... Один маленький толчок.... И знаешь, что самое смешное? В глубине души... им это нравится. Им нравится, когда клетки открываются. Потому что безумие — это как гравитация.... Нужно только подтолкнуть. А ты...? Ты тоже думаешь, что контролируешь ситуацию?''', language="Russian", ref_audio=ref_audio, #оригинал аудио ref_text=ref_text, #транскрибация оригинала ) sf.write("output_voice_clone.wav", wavs[0], sr)

На мое удивление, я получил в целом похожий голос, но с заметными ошибками:

  • Во-первых, даты и числа. Почему то их генерация у клонированных находится на уровне автоматов пятерочки. Возможно, если передать исходник, который содержит озвученные цифры, то результат будет лучше

  • Во-вторых, слова, которые содержат Йотированные буквы, но это особенности нашего алфавита.

  • В третьих, паузы. В монологе джокера много длительных пауз после каждого предложения, которые создают особую атмосферу. Модель пытается их повторить И даже иногда это удается, но, конечно, до оригинала еще далеко. Я пробовал добавлять '...' в конце предложений, но не заметил изменений.

Примеры получившихся аудио будут в моем Telegram канале. Также там я рассказываю про мир AI и автоматизации

Другие возможности

  • Вы можете создать свой кастомный голос с помощью instruct, а затем клонировать его и озвучивать другие тексты

  • Вы можете по отдельности использовать кодировщик и декодировщик

  • Вы можете использовать API, если не хотите пользоваться моделью локально:

Описание API

Документация API

API в реальном времени для Qwen3-TTS с пользовательской голосовой моделью.

https://www.alibabacloud.com/help/en/model-studio/qwen-tts-realtime

API в реальном времени для Qwen3-TTS — модели голосового клонирования.

https://www.alibabacloud.com/help/en/model-studio/qwen-tts-voice-cloning

API в реальном времени для Qwen3-TTS — модели голосового дизайна.

https://www.alibabacloud.com/help/en/model-studio/qwen-tts-voice-design

Думаю, в скором времени модель будет доступна на OpenRouter

Заключение

Меня не может не радовать появление открытых моделей для синтеза и транскрибации речи, так как эта область, как и VLM, всегда была менее доступной, чем LLM. Конечно, это не уровень моделей от OpenAi или Google, но для свободных моделей это вполне неплохо. Не забывайте, чем у них всего 1.8B параметров.

Возможно, в 26 году мы увидим еще несколько релизов более крупных моделей, которые будут обращать больше внимания на знаки препинания и которые будут больше адаптированы под русский язык. Для меня, как разработчика AI агентов это откроет новые возможности) Добавьте к этому модель транскрибации от Microsoft VibeVoice-ASR и, возможно, мы полностью перейдем на голосовой интерфейс

Источник

Отказ от ответственности: Статьи, размещенные на этом веб-сайте, взяты из общедоступных источников и предоставляются исключительно в информационных целях. Они не обязательно отражают точку зрения MEXC. Все права принадлежат первоисточникам. Если вы считаете, что какой-либо контент нарушает права третьих лиц, пожалуйста, обратитесь по адресу service@support.mexc.com для его удаления. MEXC не дает никаких гарантий в отношении точности, полноты или своевременности контента и не несет ответственности за любые действия, предпринятые на основе предоставленной информации. Контент не является финансовой, юридической или иной профессиональной консультацией и не должен рассматриваться как рекомендация или одобрение со стороны MEXC.