modelscope / agentscope

Start building LLM-empowered multi-agent applications in an easier way.
https://doc.agentscope.io/
Apache License 2.0
5k stars 303 forks source link

[Feature]: agent speak 方法adds tts 功能 #161

Open tomhup opened 5 months ago

tomhup commented 5 months ago

我有一个简单的实现, AgentBase def speak( self, content: Union[str, dict], ) -> None: if self.is_tts: logger.chat(content) asyncio.run(async_get_speech(content.content)) else: logger.chat(content)

采用edget_tts 库实现语音播放

import asyncio import io import os import re import tempfile from pydub import AudioSegment from pydub.playback import play import edge_tts import logging logger = logging.getLogger(name)

async def async_get_speech(phrase,voice="zh-CN-XiaoxiaoNeural"): try:

创建一个临时文件

    with tempfile.NamedTemporaryFile(delete=False) as tmpfile:
        tmpfile_name = tmpfile.name
    text=phrase
    text = re.sub(r'\*+', '', text)  # 替换所有 * 字符
    text = re.sub(r'#+', '', text) 
    phrase=text
    # print(phrase)
    # 生成语音并保存到临时文件
    tts = edge_tts.Communicate(text=phrase,voice=voice)
    await tts.save(tmpfile_name)

    # 读取临时文件到 BytesIO 对象
    with open(tmpfile_name, "rb") as tmpfile:
        mp3_data = tmpfile.read()
    mp3_buffer = io.BytesIO(mp3_data)

    # 删除临时文件
    os.remove(tmpfile_name)

    # 从 BytesIO 对象加载音频并播放
    mp3_buffer.seek(0)  # 重置指针到开始
    audio_data = AudioSegment.from_file(mp3_buffer, format="mp3")
    play(audio_data)

except Exception as e:
    logger.error(f"Error: {e}")

async def main(): phrase = "*Hello, #this is a test." await async_get_speech(phrase)

if name == "main": asyncio.run(main())

rayrayraykk commented 5 months ago

Thanks for your contributions to AgentScope. We will consider adding this feature to our AgentScope Studio :)