上一篇文章介紹了調用百度翻譯API翻譯日文srt字幕的方法。百度翻譯API是get方式調用,參數都放在ur中,每次調用翻譯文本長度除了接口限制外,還有url長度限制,而日文字符通過ur轉碼后會占9個字符長度,其實從這個角度來講,get方式傳參效率確實不高。不過百度翻譯API,申請過程簡單,免費額度不少,也還是推薦之選。
本篇介紹下調用騰訊云服務/機器翻譯/批量文本翻譯API來翻譯字幕,那它跟百度翻譯api比有什么不同呢?
騰訊文本翻譯API采用post方式調用,json格式傳輸,utf8編碼的各種語句可以不用轉碼,直接在body里json發送,效率高出很多,而且支持批量翻譯,語句以數組方式發送,跟百度翻譯api批量得帶上換行符拼接成一個長串要更優雅。此外騰訊文本翻譯有封裝好的tencentcloud-sdk-nodejs-tmt庫,更方便node.js中直接調用,不用手寫簽名實現代碼。
這看起來都是優點,那么有什么缺點么?嗯,說一個使用起來不如百度翻譯快捷的地方,就是首先要注冊騰訊云服務賬號,最好不要在主賬號下申請API key使用翻譯服務,而是創建一個子賬號,以這個子賬號的appid和appkey來使用翻譯API,注意一些云服務的授權,開通翻譯服務后,注意下免費額度,默認采用后付費方式支付超出額度。經過一系列配置授權后,就可以在程序中使用騰訊云翻譯api了。
同樣是翻譯一個日文srt字幕(文件以utf8 without bom編碼存放),跟使用百度翻譯api比要簡單不少,示例如下:
const fs=require('fs');
const srtpath="yoursrtpath"
const srtContent = fs.readFileSync(srtpath+process.argv.slice(2)[0]+'.srt', 'utf8');
const SubtitlesParser = require('subtitles-parser');
const subtitles = SubtitlesParser.fromSrt(srtContent);maxlength=6000;
let bufrows=[];
let bufstrlen=0;
let start=0;const tencentcloud = require("tencentcloud-sdk-nodejs-tmt");
const TmtClient = tencentcloud.tmt.v20180321.Client;
const clientConfig = {credential: {secretId: "yourappid",secretKey: "yourappkey",},region: "ap-guangzhou",profile: {httpProfile: {endpoint: "tmt.tencentcloudapi.com",},},};
const client = new TmtClient(clientConfig);(async()=>{
for (let i=0;i<subtitles.length;i++) {if (bufstrlen+subtitles[i]["text"].length+2>maxlength) {let data=await client.TextTranslateBatch({"SourceTextList":bufrows,"Source": "ja","Target": "zh","ProjectId":0});for (let j=0;j<data.TargetTextList.length;j++) {subtitles[start+j]["text"]=data.TargetTextList[j];}bufrows=[subtitles[i]["text"]];bufstrlen=subtitles[i]["text"].length+2;start=i;}else {bufrows.push(subtitles[i]["text"]);bufstrlen+=subtitles[i]["text"].length+2;}}let data=await client.TextTranslateBatch({"SourceTextList":bufrows,"Source": "ja","Target": "zh","ProjectId":0});
for (let j=0;j<data.TargetTextList.length;j++) {subtitles[start+j]["text"]=data.TargetTextList[j];}const newSrtContent = SubtitlesParser.toSrt(subtitles);
fs.writeFileSync(srtpath+process.argv.slice(2)[0]+'.cn.srt', newSrtContent);
})();
騰訊云翻譯API由于采用post接口,body中json傳輸待翻譯文本或文本數組,所以該段代碼適合任意語言之間的字幕翻譯,確實感覺比百度翻譯api又更方便一些。
騰訊機器翻譯只是騰訊云服務中的一個服務,用戶如果熟悉騰訊云服務管理,那么會很簡單上手使用,否則可能要學習了解下云服務控制臺等多處的配置。