Наверное уже все пообщались в текстовом режиме с 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 работать с русским - пишите в комментариях.