[docs]classElevenLabsModel(str,Enum):"""Models available for Eleven Labs Text2Speech."""MULTI_LINGUAL="eleven_multilingual_v2"MULTI_LINGUAL_FLASH="eleven_flash_v2_5"MONO_LINGUAL="eleven_flash_v2"
[docs]classElevenLabsText2SpeechTool(BaseTool):# type: ignore[override]"""Tool that queries the Eleven Labs Text2Speech API. In order to set this up, follow instructions at: https://elevenlabs.io/docs """model:Union[ElevenLabsModel,str]=ElevenLabsModel.MULTI_LINGUALvoice:str="JBFqnCBsd6RMkjVDRZzb"name:str="eleven_labs_text2speech"description:str=("A wrapper around Eleven Labs Text2Speech. ""Useful for when you need to convert text to speech. ""It supports more than 30 languages, including English, German, Polish, ""Spanish, Italian, French, Portuguese, and Hindi. ")@model_validator(mode="before")@classmethoddefvalidate_environment(cls,values:Dict)->Any:"""Validate that api key exists in environment."""_=get_from_dict_or_env(values,"elevenlabs_api_key","ELEVENLABS_API_KEY")returnvaluesdef_run(self,query:str,run_manager:Optional[CallbackManagerForToolRun]=None)->str:"""Use the tool."""elevenlabs=_import_elevenlabs()client=elevenlabs.client.ElevenLabs()try:speech=client.text_to_speech.convert(text=query,model_id=self.model,voice_id=self.voice,output_format="mp3_44100_128",)withtempfile.NamedTemporaryFile(mode="bx",suffix=".mp3",delete=False)asf:f.write(speech)returnf.nameexceptExceptionase:raiseRuntimeError(f"Error while running ElevenLabsText2SpeechTool: {e}")
[docs]defplay(self,speech_file:str)->None:"""Play the text as speech."""elevenlabs=_import_elevenlabs()withopen(speech_file,mode="rb")asf:speech=f.read()elevenlabs.play(speech)
[docs]defstream_speech(self,query:str)->None:"""Stream the text as speech as it is generated. Play the text in your speakers."""elevenlabs=_import_elevenlabs()client=elevenlabs.client.ElevenLabs()speech_stream=client.text_to_speech.convert_as_stream(text=query,model_id=self.model,voice_id=self.voice)elevenlabs.stream(speech_stream)