Skip to content

Commit

Permalink
add ElevenLabs TTS to voice factory
Browse files Browse the repository at this point in the history
  • Loading branch information
uezhenxiang2023 committed Aug 19, 2023
1 parent 2473334 commit acbd506
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 1 deletion.
5 changes: 4 additions & 1 deletion config.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
"voice_reply_voice": False, # 是否使用语音回复语音,需要设置对应语音合成引擎的api key
"always_reply_voice": False, # 是否一直使用语音回复
"voice_to_text": "openai", # 语音识别引擎,支持openai,baidu,google,azure
"text_to_voice": "baidu", # 语音合成引擎,支持baidu,google,pytts(offline),azure
"text_to_voice": "baidu", # 语音合成引擎,支持baidu,google,pytts(offline),azure,elevenlabs
# baidu 语音api配置, 使用百度语音识别和语音合成时需要
"baidu_app_id": "",
"baidu_api_key": "",
Expand All @@ -71,6 +71,9 @@
# azure 语音api配置, 使用azure语音识别和语音合成时需要
"azure_voice_api_key": "",
"azure_voice_region": "japaneast",
# elevenlabs 语音api配置
"xi_api_key": "", #获取ap的方法可以参考https://docs.elevenlabs.io/api-reference/quick-start/authentication
"xi_voice_id": "", #ElevenLabs提供了9种英式、美式等英语发音id,分别是“Adam/Antoni/Arnold/Bella/Domi/Elli/Josh/Rachel/Sam”
# 服务时间限制,目前支持itchat
"chat_time_module": False, # 是否开启服务时间限制
"chat_start_time": "00:00", # 服务开始时间
Expand Down
79 changes: 79 additions & 0 deletions voice/elevent/elevent_voice.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
"""
eleventLabs voice service
["voice_id":"pNInz6obpgDQGcFmaJgB","name":"Adam"]
["voice_id":"ErXwobaYiN019PkySvjV","name":"Antoni"]
["voice_id":"VR6AewLTigWG4xSOukaG","name":"Arnold"]
["voice_id":"EXAVITQu4vr4xnSDxMaL","name":"Bella"]
["voice_id":"AZnzlk1XvdvUeBnXmlld","name":"Domi"]
["voice_id":"MF3mGyEYCl7XYWbV9V6O","name":"Elli"]
["voice_id":"TxGEqnHWrfWFTfGW9XjX","name":"Josh"]
["voice_id":"21m00Tcm4TlvDq8ikWAM","name":"Rachel"]
["voice_id":"yoZ06aMxZJJ28mfd3POQ","name":"Sam"]
"""

import time
import requests

from elevenlabs import generate

from bridge.reply import Reply, ReplyType
from common.log import logger
from common.tmp_dir import TmpDir
from voice.voice import Voice
from config import conf

XI_API_KEY = conf().get("xi_api_key")
name = conf().get("xi_voice_id")

if name == "Adam":
voice_id = "pNInz6obpgDQGcFmaJgB"
elif name == "Antoni":
voice_id = "ErXwobaYiN019PkySvjV"
elif name == "Arnold":
voice_id = "VR6AewLTigWG4xSOukaG"
elif name == "Bella":
voice_id = "EXAVITQu4vr4xnSDxMaL"
elif name == "Domi":
voice_id = "AZnzlk1XvdvUeBnXmlld"
elif name == "Elli":
voice_id = "MF3mGyEYCl7XYWbV9V6O"
elif name == "Josh":
voice_id = "TxGEqnHWrfWFTfGW9XjX"
elif name == "Rachel":
voice_id = "21m00Tcm4TlvDq8ikWAM"
elif name == "Sam":
voice_id = "yoZ06aMxZJJ28mfd3POQ"


class ElevenLabsVoice(Voice):

def __init__(self):
pass

def voiceToText(self, voice_file):
pass

def textToVoice(self, text):
url = f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}"
headers = {
"Accept": "audio/mpeg",
"Content-Type": "application/json",
"xi-api-key": XI_API_KEY
}
data = {
"text": text,
"model_id": "eleven_monolingual_v1",
"voice_settings": {
"stability": 0,
"similarity_boost": 0
}
}
response = requests.post(url, json=data, headers=headers)
audio = response.content
fileName = TmpDir().path() + "reply-" + str(int(time.time())) + "-" + str(hash(text) & 0x7FFFFFFF) + ".mp3"
with open(fileName, "wb") as f:
f.write(audio)
logger.info("[ElevenLabs] textToVoice text={} voice file name={}".format(text, fileName))
return Reply(ReplyType.VOICE, fileName)
4 changes: 4 additions & 0 deletions voice/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,8 @@ def create_voice(voice_type):
from voice.azure.azure_voice import AzureVoice

return AzureVoice()
elif voice_type == "elevenlabs":
from voice.elevent.elevent_voice import ElevenLabsVoice

return ElevenLabsVoice()
raise RuntimeError

0 comments on commit acbd506

Please sign in to comment.