Наверное уже все пообщались в текстовом режиме с llama-подобными моделями, в этой заметке расскажу как можно настроить полностью голосовое общение с моделью.
Для общения нам понадобятся:
- whisper.cpp - преобразование голоса в текст
- silero - синтез речи
- модель совместимая с llama.cpp
Silero TTS
По моему Silero лучший синтезатор речи который можно запустить под Linux с довольно приличной скорость на CPU. На хабре есть несколько статей от разработчиков, поищите, интересное чтиво. Пользователи Mac могу пропустить этот шаг и использовать для синтеза Siri.
mkdir tts-silero
cd tts-silero
python -m venv
venv/bin/activate
pip install torch torchaudio playsound omegaconf
На основе Jupyter плейбука cоздаём скрипт tts.py:
import sys
import torch
import torchaudio
from pprint import pprint
from omegaconf import OmegaConf
from IPython.display import Audio, display
from playsound import playsound
torch.hub.download_url_to_file('https://raw.githubusercontent.com/snakers4/silero-models/master/models.yml',
'latest_silero_models.yml',
progress=False)
models = OmegaConf.load('latest_silero_models.yml')
language = 'en'
model_id = 'v3_en'
device = torch.device('cpu') # gpu or cpu
model, example_text = torch.hub.load(repo_or_dir='snakers4/silero-models',
model='silero_tts',
language=language,
speaker=model_id)
model.to(device)
sample_rate = 48000
speaker = 'en_21' # voice
put_accent=True
put_yo=True
text_to_speach = sys.argv[1]
print(text_to_speach)
audio = model.apply_tts(text=text_to_speach,
speaker=speaker,
sample_rate=sample_rate,
put_accent=put_accent,
put_yo=put_yo)
torchaudio.save('out.mp3', audio.unsqueeze(0), sample_rate=sample_rate)
playsound('out.mp3')
Сэмплы английских голосов можно послушать тут.
Проверяем работу скрипта:
venv/bin/python tts.py "Hello! How are you?"
Если услышали приятный женский голос - значит все получилось и можно идти дальше.
Whisper.cpp + llama.cpp
Whisper.cpp - крутой проект автоматического распознаванием голоса, в том числе умеет real-time распознавание.
Клонируем код:
git clone https://github.com/ggerganov/whisper.cpp.git
Собираем talk-llama:
cd whisper.cpp
make talk-llama
Скачиваем модель для распознавания голоса:
models/download-ggml-model.sh base
В каталоге models должен появиться файл ggml-base.bin.
Правим examples/talk-llama/speak.sh:
#!/bin/bash
# Usage:
# speak.sh <voice_id> <text-to-speak>
# для пользователей Mac
#say "$2"
../tts-silero/venv/bin/python ../tts-silero/tts.py "$2" #> /dev/null 2>&1
Попробуем запустить:
./talk-llama -t 8 -tr --person Sergey -mw models/ggml-base.bin -ml ../llama.cpp/models/vicuna-13b-ggml-4bit.bin --prompt-file examples/talk-llama/prompts/talk-alpaca.txt
-t - количество потоков-tr - (необязательно) перевод любого языка на английский перед передачей текста в llama модель. Переводит не очень хорошо, но это единственный способ обратиться к модели на русском.-l LANG - (необязательно) теоретически можно указать язык ru. Whysper.cpp отлично работает с русским, но в случае с talk-llama похоже что-то с кодировкой и вместо русского остаются только знаки препинания.--person - (необязательно) ваше имя-mw - путь к STT модели-ml - путь к llama модели--prompt-file - (необязательно) путь к начальному промпту, можно описать персонажа для чат-бота.
Подождите инициализации моделей и появления приглашения с вашим именем. После этого можно говорить с моделью и получать ответ голосом.
Мог пропустить какие-то шаги по установке зависимостей, думаю вы увидите если не хватает каких-то библиотек, доустановите их.
Если кто-то знает как заставить talk-llama работать с русским - пишите в комментариях.