Files

1 line
9.5 KiB
JSON

{"repo": "abirharrasse/d3-judge", "files": {"MetaGPT_LLM_advocates/metagpt/tools/iflytek_tts.py": {"129491b3b7f972a003306fe1453715b94d1a0c43": {"t": 1785674322.4649506, "n": 5404, "h": "9085edbcfa8d653a", "c": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\"\"\"\n@Time : 2023/8/17\n@Author : mashenquan\n@File : iflytek_tts.py\n@Desc : iFLYTEK TTS OAS3 api, which provides text-to-speech functionality\n\"\"\"\nimport base64\nimport hashlib\nimport hmac\nimport json\nimport uuid\nfrom datetime import datetime\nfrom enum import Enum\nfrom pathlib import Path\nfrom time import mktime\nfrom typing import Optional\nfrom urllib.parse import urlencode\nfrom wsgiref.handlers import format_date_time\n\nimport aiofiles\nimport websockets as websockets\nfrom pydantic import BaseModel\n\nfrom metagpt.logs import logger\n\n\nclass IFlyTekTTSStatus(Enum):\n STATUS_FIRST_FRAME = 0 # The first frame\n STATUS_CONTINUE_FRAME = 1 # The intermediate frame\n STATUS_LAST_FRAME = 2 # The last frame\n\n\nclass AudioData(BaseModel):\n audio: str\n status: int\n ced: str\n\n\nclass IFlyTekTTSResponse(BaseModel):\n code: int\n message: str\n data: Optional[AudioData] = None\n sid: str\n\n\nDEFAULT_IFLYTEK_VOICE = \"xiaoyan\"\n\n\nclass IFlyTekTTS(object):\n def __init__(self, app_id: str, api_key: str, api_secret: str):\n \"\"\"\n :param app_id: Application ID is used to access your iFlyTek service API, see: `https://console.xfyun.cn/services/tts`\n :param api_key: WebAPI argument, see: `https://console.xfyun.cn/services/tts`\n :param api_secret: WebAPI argument, see: `https://console.xfyun.cn/services/tts`\n \"\"\"\n self.app_id = app_id\n self.api_key = api_key\n self.api_secret = api_secret\n\n async def synthesize_speech(self, text, output_file: str, voice=DEFAULT_IFLYTEK_VOICE):\n url = self._create_url()\n data = {\n \"common\": {\"app_id\": self.app_id},\n \"business\": {\"aue\": \"lame\", \"sfl\": 1, \"auf\": \"audio/L16;rate=16000\", \"vcn\": voice, \"tte\": \"utf8\"},\n \"data\": {\"status\": 2, \"text\": str(base64.b64encode(text.encode(\"utf-8\")), \"UTF8\")},\n }\n req = json.dumps(data)\n async with websockets.connect(url) as websocket:\n # send request\n await websocket.send(req)\n\n # receive frames\n async with aiofiles.open(str(output_file), \"wb\") as writer:\n while True:\n v = await websocket.recv()\n rsp = IFlyTekTTSResponse(**json.loads(v))\n if rsp.data:\n binary_data = base64.b64decode(rsp.data.audio)\n await writer.write(binary_data)\n if rsp.data.status != IFlyTekTTSStatus.STATUS_LAST_FRAME.value:\n continue\n break\n\n def _create_url(self):\n \"\"\"Create request url\"\"\"\n url = \"wss://tts-api.xfyun.cn/v2/tts\"\n # Generate a timestamp in RFC1123 format\n now = datetime.now()\n date = format_date_time(mktime(now.timetuple()))\n\n signature_origin = \"host: \" + \"ws-api.xfyun.cn\" + \"\\n\"\n signature_origin += \"date: \" + date + \"\\n\"\n signature_origin += \"GET \" + \"/v2/tts \" + \"HTTP/1.1\"\n # Perform HMAC-SHA256 encryption\n signature_sha = hmac.new(\n self.api_secret.encode(\"utf-8\"), signature_origin.encode(\"utf-8\"), digestmod=hashlib.sha256\n ).digest()\n signature_sha = base64.b64encode(signature_sha).decode(encoding=\"utf-8\")\n\n authorization_origin = 'api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"' % (\n self.api_key,\n \"hmac-sha256\",\n \"host date request-line\",\n signature_sha,\n )\n authorization = base64.b64encode(authorization_origin.encode(\"utf-8\")).decode(encoding=\"utf-8\")\n # Combine the authentication parameters of the request into a dictionary.\n v = {\"authorization\": authorization, \"date\": date, \"host\": \"ws-api.xfyun.cn\"}\n # Concatenate the authentication parameters to generate the URL.\n url = url + \"?\" + urlencode(v)\n return url\n\n\n# Export\nasync def oas3_iflytek_tts(text: str, voice: str = \"\", app_id: str = \"\", api_key: str = \"\", api_secret: str = \"\"):\n \"\"\"Text to speech\n For more details, check out:`https://www.xfyun.cn/doc/tts/online_tts/API.html`\n\n :param voice: Default `xiaoyan`. For more details, checkout: `https://www.xfyun.cn/doc/tts/online_tts/API.html#%E6%8E%A5%E5%8F%A3%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B`\n :param text: The text used for voice conversion.\n :param app_id: Application ID is used to access your iFlyTek service API, see: `https://console.xfyun.cn/services/tts`\n :param api_key: WebAPI argument, see: `https://console.xfyun.cn/services/tts`\n :param api_secret: WebAPI argument, see: `https://console.xfyun.cn/services/tts`\n :return: Returns the Base64-encoded .mp3 file data if successful, otherwise an empty string.\n\n \"\"\"\n\n filename = Path(__file__).parent / (uuid.uuid4().hex + \".mp3\")\n try:\n tts = IFlyTekTTS(app_id=app_id, api_key=api_key, api_secret=api_secret)\n await tts.synthesize_speech(text=text, output_file=str(filename), voice=voice)\n async with aiofiles.open(str(filename), mode=\"rb\") as reader:\n data = await reader.read()\n base64_string = base64.b64encode(data).decode(\"utf-8\")\n except Exception as e:\n logger.error(f\"text:{text}, error:{e}\")\n base64_string = \"\"\n finally:\n filename.unlink(missing_ok=True)\n\n return base64_string\n"}}, "MetaGPT_LLM_advocates/metagpt/configs/llm_config.py": {"129491b3b7f972a003306fe1453715b94d1a0c43": {"t": 1785674648.2966948, "n": 3459, "h": "565f98c492de8e5a", "c": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\"\"\"\n@Time : 2024/1/4 16:33\n@Author : alexanderwu\n@File : llm_config.py\n\"\"\"\nfrom enum import Enum\nfrom typing import Optional\n\nfrom pydantic import field_validator\n\nfrom metagpt.const import LLM_API_TIMEOUT\nfrom metagpt.utils.yaml_model import YamlModel\nfrom metagpt.const import METAGPT_ROOT, CONFIG_ROOT\n\nclass LLMType(Enum):\n OPENAI = \"openai\"\n ANTHROPIC = \"anthropic\"\n CLAUDE = \"claude\" # alias name of anthropic\n SPARK = \"spark\"\n ZHIPUAI = \"zhipuai\"\n FIREWORKS = \"fireworks\"\n OPEN_LLM = \"open_llm\"\n GEMINI = \"gemini\"\n METAGPT = \"metagpt\"\n AZURE = \"azure\"\n OLLAMA = \"ollama\"\n QIANFAN = \"qianfan\" # Baidu BCE\n DASHSCOPE = \"dashscope\" # Aliyun LingJi DashScope\n MOONSHOT = \"moonshot\"\n MISTRAL = \"mistral\"\n YI = \"yi\" # lingyiwanwu\n OPENROUTER = \"openrouter\"\n BEDROCK = \"bedrock\"\n ARK = \"ark\"\n TOGETHER = \"together\"\n def __missing__(self, key):\n return self.OPENAI\n\n\nclass LLMConfig(YamlModel):\n \"\"\"Config for LLM\n\n OpenAI: https://github.com/openai/openai-python/blob/main/src/openai/resources/chat/completions.py#L681\n Optional Fields in pydantic: https://docs.pydantic.dev/latest/migration/#required-optional-and-nullable-fields\n \"\"\"\n\n api_key: str = \"sk-\"\n api_type: LLMType = LLMType.OPENAI\n base_url: str = \"https://api.openai.com/v1\"\n api_version: Optional[str] = None\n\n model: Optional[str] = None # also stands for DEPLOYMENT_NAME\n pricing_plan: Optional[str] = None # Cost Settlement Plan Parameters.\n\n # For Cloud Service Provider like Baidu/ Alibaba\n access_key: Optional[str] = None\n secret_key: Optional[str] = None\n endpoint: Optional[str] = None # for self-deployed model on the cloud\n\n # For Spark(Xunfei), maybe remove later\n app_id: Optional[str] = None\n api_secret: Optional[str] = None\n domain: Optional[str] = None\n\n # For Chat Completion\n max_token: int = 4096\n temperature: float = 0.0\n top_p: float = 1.0\n top_k: int = 0\n repetition_penalty: float = 1.0\n stop: Optional[str] = None\n presence_penalty: float = 0.0\n frequency_penalty: float = 0.0\n best_of: Optional[int] = None\n n: Optional[int] = None\n stream: bool = True\n # https://cookbook.openai.com/examples/using_logprobs\n logprobs: Optional[bool] = None\n top_logprobs: Optional[int] = None\n timeout: int = 600\n\n # For Amazon Bedrock\n region_name: str = None\n\n # For Network\n proxy: Optional[str] = None\n\n # Cost Control\n calc_usage: bool = True\n\n @field_validator(\"api_key\")\n @classmethod\n def check_llm_key(cls, v):\n if v in [\"\", None, \"YOUR_API_KEY\"]:\n repo_config_path = METAGPT_ROOT / \"config/config2.yaml\"\n root_config_path = CONFIG_ROOT / \"config2.yaml\"\n if root_config_path.exists():\n raise ValueError(\n f\"Please set your API key in {root_config_path}. If you also set your config in {repo_config_path}, \\nthe former will overwrite the latter. This may cause unexpected result.\\n\")\n elif repo_config_path.exists():\n raise ValueError(f\"Please set your API key in {repo_config_path}\")\n else:\n raise ValueError(f\"Please set your API key in config2.yaml\")\n return v\n\n @field_validator(\"timeout\")\n @classmethod\n def check_timeout(cls, v):\n return v or LLM_API_TIMEOUT\n"}}}}