新增potplayer的配置文件SubtitleTranslate - zhipu.as ,配置文件路径:D:\Program Files\DAUM\PotPlayer\Extension\Subtitle\Translate
以下是代码内容, 你需要自己替换tocken和模型名称:
以下是代码内容, 你需要自己替换tocken和模型名称:
/* Real time subtitle translate for PotPlayer Zhipu AI GLM API 智谱AI 字幕实时翻译插件,双语字幕(原文+译文) endpoint: https://open.bigmodel.cn/api/paas/v4/chat/completions 适配智谱原生 id.secret 格式API Key(不需要sk前缀) */ // void OnInitialize() // void OnFinalize() // string GetTitle() -> get title for UI // string GetVersion -> get version for manage // string GetDesc() -> get detail information // string GetLoginTitle() -> get title for login dialog // string GetLoginDesc() -> get desc for login dialog // string GetUserText() -> get user text for login dialog // string GetPasswordText() -> get password text for login dialog // string ServerLogin(string User, string Pass) -> login // string ServerLogout() -> logout //------------------------------------------------------------------------------------------------ // array<string> GetSrcLangs() -> get source language // array<string> GetDstLangs() -> get target language // string Translate(string Text, string &in SrcLang, string &in DstLang) -> do translate !! array<string> LangTable = { "", "Albanian", "Arabic", "Armenian", "Awadhi", "Azerbaijani", "Bashkir", "Basque", "Belarusian", "Bengali", "Bhojpuri", "Bosnian", "Brazilian Portuguese", "Bulgarian", "Cantonese", "Catalan", "Chhattisgarhi", "Chinese", "Croatian", "Czech", "Danish", "Dutch", "English", "Estonian", "Finnish", "French", "Georgian", "German", "Greek", "Hebrew", "Hindi", "Hungarian", "Icelandic", "Indonesian", "Italian", "Japanese", "Javanese", "Kannada", "Kazakh", "Korean", "Latvian", "Lithuanian", "Macedonian", "Malay", "Maltese", "Mandarin", "Mongolian", "Nepali", "Norwegian", "Oriya", "Pashto", "Persian", "Polish", "Portuguese", "Punjabi", "Romanian", "Russian", "Sanskrit", "Serbian", "Sinhala", "Slovak", "Slovenian", "Spanish", "Swahili", "Swedish", "Tamil", "Telugu", "Thai", "Turkish", "Ukrainian", "Urdu", "Uzbek", "Vietnamese", "Welsh" }; string UserAgent = "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"; string GetTitle() { return "{$CP949=ZhipuAI 번역(이중언어)$}{$CP950=智谱翻譯(雙語)$}{$CP0=ZhipuAI Translate(Bilingual)$}"; } string GetVersion() { return "1.1-zhipu"; } string GetDesc() { return "智谱AI GLM API | endpoint: open.bigmodel.cn | Bilingual subtitle,支持id.secret格式密钥"; } string GetLoginTitle() { return "智谱AI API配置"; } string GetLoginDesc() { return "User填入完整API Key(格式 id.secret),Password填入模型名称,默认glm-4-flash"; } string GetUserText() { return "API Key(这里替换成你的API_KEY):"; } string GetPasswordText() { return "Model(这替换成你的模型名称,质谱默认写:glm-4-flash):"; } string zhipu_apikey; string zhipu_model; const string zhipu_endpoint = "https://open.bigmodel.cn/api/paas/v4/chat/completions"; string ServerLogin(string User, string Pass) { zhipu_apikey = User.Trim(); zhipu_model = Pass.Trim(); if(zhipu_apikey.empty()) return "fail:api key empty"; if(zhipu_model.empty()) zhipu_model = "glm-4-flash"; return "200 ok"; } void ServerLogout() { zhipu_apikey = ""; zhipu_model = ""; } array<string> GetSrcLangs() { array<string> ret = LangTable; return ret; } array<string> GetDstLangs() { array<string> ret = LangTable; ret.erase(0); return ret; } //递归解析智谱返回json,提取 choices[0].message.content string findZhipuContent(JsonValue node) { if(node.isObject()) { JsonValue choices = node["choices"]; if(choices.isArray() && choices.size()>0) { JsonValue choice0 = choices[0]; if(choice0.isObject()) { JsonValue msg = choice0["message"]; if(msg.isObject()) { JsonValue content = msg["content"]; if(content.isString()) { return content.asString(); } } } } array<string> keys = node.getKeys(); for(int i=0;i<keys.size();i++) { string subRet = findZhipuContent(node[keys[i]]); if(!subRet.empty()) return subRet; } } else if(node.isArray()) { for(int i=0;i<node.size();i++) { string subRet = findZhipuContent(node[i]); if(!subRet.empty()) return subRet; } } return ""; } string Translate(string Text, string &in SrcLang, string &in DstLang) { //HostOpenConsole(); //调试,打开可以看http返回 string originalText = Text.Trim(); if(originalText.empty()) return ""; string authHeader = "Authorization: Bearer " + zhipu_apikey + "\r\n"; string SendHeader = authHeader; SendHeader += "Content-Type: application/json\r\n"; SendHeader += "Accept: application/json\r\n"; string sysPrompt; if(SrcLang.empty()) { sysPrompt = "Translate subtitle text to " + DstLang + ". Only output translation result, no extra explanation, no notes."; } else { sysPrompt = "Translate subtitle from " + SrcLang + " to " + DstLang + ". Only output translation result, no extra explanation, no notes."; } string encodedText = HostUrlEncode(Text); string PostPayload = "{" "\"model\":\"" + zhipu_model + "\"," "\"temperature\":0.1," "\"messages\":[" "{\"role\":\"system\",\"content\":\"" + sysPrompt + "\"}," "{\"role\":\"user\",\"content\":\"" + encodedText + "\"}" "]" "}"; string translatedText = ""; uintptr httpHandle = HostOpenHTTP(zhipu_endpoint, UserAgent, SendHeader, PostPayload); if(httpHandle != 0) { string respJson = HostGetContentHTTP(httpHandle); JsonReader reader; JsonValue rootNode; if(reader.parse(respJson, rootNode) && rootNode.isObject()) { translatedText = findZhipuContent(rootNode); if(!translatedText.empty()) { SrcLang = "UTF8"; DstLang = "UTF8"; translatedText.replace("<br/>","\n"); translatedText.replace("<br />","\n"); translatedText.replace("\n\n","\n"); translatedText.Trim(); translatedText = HostRegExpRemove(translatedText, "^(Here is|Here's|翻译结果|译文)[^::]*[::]"); } } HostCloseHTTP(httpHandle); } //双语输出:翻译成功:原文\n译文;翻译失败返回原文,避免空白字幕 string bilingualResult; if(translatedText.empty()) { bilingualResult = originalText; } else { bilingualResult = originalText + "\n" + translatedText; } return bilingualResult; }
浙公网安备 33010602011771号