不能否认,微软Azure在TTS(texttospeech文字转语音)这个人工智能细分领域的影响力是统治级的,一如ChatGPT在NLP领域的随心所欲,予取予求。君不见几乎所有的抖音营销号口播均采用微软的语音合成技术,其影响力由此可见一斑,仅有的白璧微瑕之处就是价格略高,虽然国内也可以使用科大讯飞语音合成进行平替,但我们只想要最好的那一个,本次我们使用免费的开源库edgetts来实现文本转语音操作,薅微软edge的羊毛。TTS文本转语音基础使用方式 首先安装edgetts库:pip3installedgetts 安装成功后,直接在终端运行edgetts命令:edgetts 显示帮助菜单即代表安装成功:Downloadsedgettsusage:edgetts〔h〕〔tTEXT〕〔fFILE〕〔vVOICE〕〔l〕〔rateRATE〕〔volumeVOLUME〕〔OOVERLAPPING〕〔writemediaWRITEMEDIA〕〔writesubtitlesWRITESUBTITLES〕〔proxyPROXY〕 随后输入命令:edgettslistvoices 该命令可以将Edge浏览器中,内置的语言角色列表列出来:Name:afZAAdriNeuralGender:FemaleName:afZAWillemNeuralGender:MaleName:amETAmehaNeuralGender:MaleName:amETMekdesNeuralGender:FemaleName:arAEFatimaNeuralGender:FemaleName:arAEHamdanNeuralGender:MaleName:arBHAliNeuralGender:MaleName:arBHLailaNeuralGender:FemaleName:arDZAminaNeuralGender:FemaleName:arDZIsmaelNeuralGender:MaleName:arEGSalmaNeuralGender:FemaleName:arEGShakirNeuralGender:MaleName:arIQBasselNeuralGender:MaleName:arIQRanaNeuralGender:FemaleName:arJOSanaNeuralGender:FemaleName:arJOTaimNeuralGender:MaleName:arKWFahedNeuralGender:MaleName:arKWNouraNeuralGender:FemaleName:arLBLaylaNeuralGender:FemaleName:arLBRamiNeuralGender:MaleName:arLYImanNeuralGender:FemaleName:arLYOmarNeuralGender:MaleName:arMAJamalNeuralGender:MaleName:arMAMounaNeuralGender:FemaleName:arOMAbdullahNeuralGender:MaleName:arOMAyshaNeuralGender:FemaleName:arQAAmalNeuralGender:FemaleName:arQAMoazNeuralGender:MaleName:arSAHamedNeuralGender:MaleName:arSAZariyahNeuralGender:FemaleName:arSYAmanyNeuralGender:FemaleName:arSYLaithNeuralGender:MaleName:arTNHediNeuralGender:MaleName:arTNReemNeuralGender:FemaleName:arYEMaryamNeuralGender:FemaleName:arYESalehNeuralGender:MaleName:azAZBabekNeuralGender:MaleName:azAZBanuNeuralGender:FemaleName:bgBGBorislavNeuralGender:MaleName:bgBGKalinaNeuralGender:FemaleName:bnBDNabanitaNeuralGender:FemaleName:bnBDPradeepNeuralGender:MaleName:bnINBashkarNeuralGender:MaleName:bnINTanishaaNeuralGender:FemaleName:bsBAGoranNeuralGender:MaleName:bsBAVesnaNeuralGender:FemaleName:caESEnricNeuralGender:MaleName:caESJoanaNeuralGender:FemaleName:csCZAntoninNeuralGender:MaleName:csCZVlastaNeuralGender:FemaleName:cyGBAledNeuralGender:MaleName:cyGBNiaNeuralGender:FemaleName:daDKChristelNeuralGender:FemaleName:daDKJeppeNeuralGender:MaleName:deATIngridNeuralGender:FemaleName:deATJonasNeuralGender:MaleName:deCHJanNeuralGender:MaleName:deCHLeniNeuralGender:FemaleName:deDEAmalaNeuralGender:FemaleName:deDEConradNeuralGender:MaleName:deDEKatjaNeuralGender:FemaleName:deDEKillianNeuralGender:MaleName:elGRAthinaNeuralGender:FemaleName:elGRNestorasNeuralGender:MaleName:enAUNatashaNeuralGender:FemaleName:enAUWilliamNeuralGender:MaleName:enCAClaraNeuralGender:FemaleName:enCALiamNeuralGender:MaleName:enGBLibbyNeuralGender:FemaleName:enGBMaisieNeuralGender:FemaleName:enGBRyanNeuralGender:MaleName:enGBSoniaNeuralGender:FemaleName:enGBThomasNeuralGender:MaleName:enHKSamNeuralGender:MaleName:enHKYanNeuralGender:FemaleName:enIEConnorNeuralGender:MaleName:enIEEmilyNeuralGender:FemaleName:enINNeerjaExpressiveNeuralGender:FemaleName:enINNeerjaNeuralGender:FemaleName:enINPrabhatNeuralGender:MaleName:enKEAsiliaNeuralGender:FemaleName:enKEChilembaNeuralGender:MaleName:enNGAbeoNeuralGender:MaleName:enNGEzinneNeuralGender:FemaleName:enNZMitchellNeuralGender:MaleName:enNZMollyNeuralGender:FemaleName:enPHJamesNeuralGender:MaleName:enPHRosaNeuralGender:FemaleName:enSGLunaNeuralGender:FemaleName:enSGWayneNeuralGender:MaleName:enTZElimuNeuralGender:MaleName:enTZImaniNeuralGender:FemaleName:enUSAnaNeuralGender:FemaleName:enUSAriaNeuralGender:FemaleName:enUSChristopherNeuralGender:MaleName:enUSEricNeuralGender:MaleName:enUSGuyNeuralGender:MaleName:enUSJennyNeuralGender:FemaleName:enUSMichelleNeuralGender:FemaleName:enUSRogerNeuralGender:MaleName:enUSSteffanNeuralGender:MaleName:enZALeahNeuralGender:FemaleName:enZALukeNeuralGender:MaleName:esARElenaNeuralGender:FemaleName:esARTomasNeuralGender:MaleName:esBOMarceloNeuralGender:MaleName:esBOSofiaNeuralGender:FemaleName:esCLCatalinaNeuralGender:FemaleName:esCLLorenzoNeuralGender:MaleName:esCOGonzaloNeuralGender:MaleName:esCOSalomeNeuralGender:FemaleName:esCRJuanNeuralGender:MaleName:esCRMariaNeuralGender:FemaleName:esCUBelkysNeuralGender:FemaleName:esCUManuelNeuralGender:MaleName:esDOEmilioNeuralGender:MaleName:esDORamonaNeuralGender:FemaleName:esECAndreaNeuralGender:FemaleName:esECLuisNeuralGender:MaleName:esESAlvaroNeuralGender:MaleName:esESElviraNeuralGender:FemaleName:esESManuelEsCUNeuralGender:MaleName:esGQJavierNeuralGender:MaleName:esGQTeresaNeuralGender:FemaleName:esGTAndresNeuralGender:MaleName:esGTMartaNeuralGender:FemaleName:esHNCarlosNeuralGender:MaleName:esHNKarlaNeuralGender:FemaleName:esMXDaliaNeuralGender:FemaleName:esMXJorgeNeuralGender:MaleName:esMXLorenzoEsCLNeuralGender:MaleName:esNIFedericoNeuralGender:MaleName:esNIYolandaNeuralGender:FemaleName:esPAMargaritaNeuralGender:FemaleName:esPARobertoNeuralGender:MaleName:esPEAlexNeuralGender:MaleName:esPECamilaNeuralGender:FemaleName:esPRKarinaNeuralGender:FemaleName:esPRVictorNeuralGender:MaleName:esPYMarioNeuralGender:MaleName:esPYTaniaNeuralGender:FemaleName:esSVLorenaNeuralGender:FemaleName:esSVRodrigoNeuralGender:MaleName:esUSAlonsoNeuralGender:MaleName:esUSPalomaNeuralGender:FemaleName:esUYMateoNeuralGender:MaleName:esUYValentinaNeuralGender:FemaleName:esVEPaolaNeuralGender:FemaleName:esVESebastianNeuralGender:MaleName:etEEAnuNeuralGender:FemaleName:etEEKertNeuralGender:MaleName:faIRDilaraNeuralGender:FemaleName:faIRFaridNeuralGender:MaleName:fiFIHarriNeuralGender:MaleName:fiFINooraNeuralGender:FemaleName:filPHAngeloNeuralGender:MaleName:filPHBlessicaNeuralGender:FemaleName:frBECharlineNeuralGender:FemaleName:frBEGerardNeuralGender:MaleName:frCAAntoineNeuralGender:MaleName:frCAJeanNeuralGender:MaleName:frCASylvieNeuralGender:FemaleName:frCHArianeNeuralGender:FemaleName:frCHFabriceNeuralGender:MaleName:frFRDeniseNeuralGender:FemaleName:frFREloiseNeuralGender:FemaleName:frFRHenriNeuralGender:MaleName:gaIEColmNeuralGender:MaleName:gaIEOrlaNeuralGender:FemaleName:glESRoiNeuralGender:MaleName:glESSabelaNeuralGender:FemaleName:guINDhwaniNeuralGender:FemaleName:guINNiranjanNeuralGender:MaleName:heILAvriNeuralGender:MaleName:heILHilaNeuralGender:FemaleName:hiINMadhurNeuralGender:MaleName:hiINSwaraNeuralGender:FemaleName:hrHRGabrijelaNeuralGender:FemaleName:hrHRSreckoNeuralGender:MaleName:huHUNoemiNeuralGender:FemaleName:huHUTamasNeuralGender:MaleName:idIDArdiNeuralGender:MaleName:idIDGadisNeuralGender:FemaleName:isISGudrunNeuralGender:FemaleName:isISGunnarNeuralGender:MaleName:itITDiegoNeuralGender:MaleName:itITElsaNeuralGender:FemaleName:itITIsabellaNeuralGender:FemaleName:jaJPKeitaNeuralGender:MaleName:jaJPNanamiNeuralGender:FemaleName:jvIDDimasNeuralGender:MaleName:jvIDSitiNeuralGender:FemaleName:kaGEEkaNeuralGender:FemaleName:kaGEGiorgiNeuralGender:MaleName:kkKZAigulNeuralGender:FemaleName:kkKZDauletNeuralGender:MaleName:kmKHPisethNeuralGender:MaleName:kmKHSreymomNeuralGender:FemaleName:knINGaganNeuralGender:MaleName:knINSapnaNeuralGender:FemaleName:koKRInJoonNeuralGender:MaleName:koKRSunHiNeuralGender:FemaleName:loLAChanthavongNeuralGender:MaleName:loLAKeomanyNeuralGender:FemaleName:ltLTLeonasNeuralGender:MaleName:ltLTOnaNeuralGender:FemaleName:lvLVEveritaNeuralGender:FemaleName:lvLVNilsNeuralGender:MaleName:mkMKAleksandarNeuralGender:MaleName:mkMKMarijaNeuralGender:FemaleName:mlINMidhunNeuralGender:MaleName:mlINSobhanaNeuralGender:FemaleName:mnMNBataaNeuralGender:MaleName:mnMNYesuiNeuralGender:FemaleName:mrINAarohiNeuralGender:FemaleName:mrINManoharNeuralGender:MaleName:msMYOsmanNeuralGender:MaleName:msMYYasminNeuralGender:FemaleName:mtMTGraceNeuralGender:FemaleName:mtMTJosephNeuralGender:MaleName:myMMNilarNeuralGender:FemaleName:myMMThihaNeuralGender:MaleName:nbNOFinnNeuralGender:MaleName:nbNOPernilleNeuralGender:FemaleName:neNPHemkalaNeuralGender:FemaleName:neNPSagarNeuralGender:MaleName:nlBEArnaudNeuralGender:MaleName:nlBEDenaNeuralGender:FemaleName:nlNLColetteNeuralGender:FemaleName:nlNLFennaNeuralGender:FemaleName:nlNLMaartenNeuralGender:MaleName:plPLMarekNeuralGender:MaleName:plPLZofiaNeuralGender:FemaleName:psAFGulNawazNeuralGender:MaleName:psAFLatifaNeuralGender:FemaleName:ptBRAntonioNeuralGender:MaleName:ptBRFranciscaNeuralGender:FemaleName:ptPTDuarteNeuralGender:MaleName:ptPTRaquelNeuralGender:FemaleName:roROAlinaNeuralGender:FemaleName:roROEmilNeuralGender:MaleName:ruRUDmitryNeuralGender:MaleName:ruRUSvetlanaNeuralGender:FemaleName:siLKSameeraNeuralGender:MaleName:siLKThiliniNeuralGender:FemaleName:skSKLukasNeuralGender:MaleName:skSKViktoriaNeuralGender:FemaleName:slSIPetraNeuralGender:FemaleName:slSIRokNeuralGender:MaleName:soSOMuuseNeuralGender:MaleName:soSOUbaxNeuralGender:FemaleName:sqALAnilaNeuralGender:FemaleName:sqALIlirNeuralGender:MaleName:srRSNicholasNeuralGender:MaleName:srRSSophieNeuralGender:FemaleName:suIDJajangNeuralGender:MaleName:suIDTutiNeuralGender:FemaleName:svSEMattiasNeuralGender:MaleName:svSESofieNeuralGender:FemaleName:swKERafikiNeuralGender:MaleName:swKEZuriNeuralGender:FemaleName:swTZDaudiNeuralGender:MaleName:swTZRehemaNeuralGender:FemaleName:taINPallaviNeuralGender:FemaleName:taINValluvarNeuralGender:MaleName:taLKKumarNeuralGender:MaleName:taLKSaranyaNeuralGender:FemaleName:taMYKaniNeuralGender:FemaleName:taMYSuryaNeuralGender:MaleName:taSGAnbuNeuralGender:MaleName:taSGVenbaNeuralGender:FemaleName:teINMohanNeuralGender:MaleName:teINShrutiNeuralGender:FemaleName:thTHNiwatNeuralGender:MaleName:thTHPremwadeeNeuralGender:FemaleName:trTRAhmetNeuralGender:MaleName:trTREmelNeuralGender:FemaleName:ukUAOstapNeuralGender:MaleName:ukUAPolinaNeuralGender:FemaleName:urINGulNeuralGender:FemaleName:urINSalmanNeuralGender:MaleName:urPKAsadNeuralGender:MaleName:urPKUzmaNeuralGender:FemaleName:uzUZMadinaNeuralGender:FemaleName:uzUZSardorNeuralGender:MaleName:viVNHoaiMyNeuralGender:FemaleName:viVNNamMinhNeuralGender:MaleName:zhCNXiaoxiaoNeuralGender:FemaleName:zhCNXiaoyiNeuralGender:FemaleName:zhCNYunjianNeuralGender:MaleName:zhCNYunxiNeuralGender:MaleName:zhCNYunxiaNeuralGender:MaleName:zhCNYunyangNeuralGender:MaleName:zhCNliaoningXiaobeiNeuralGender:FemaleName:zhCNshaanxiXiaoniNeuralGender:FemaleName:zhHKHiuGaaiNeuralGender:FemaleName:zhHKHiuMaanNeuralGender:FemaleName:zhHKWanLungNeuralGender:MaleName:zhTWHsiaoChenNeuralGender:FemaleName:zhTWHsiaoYuNeuralGender:FemaleName:zhTWYunJheNeuralGender:MaleName:zuZAThandoNeuralGender:FemaleName:zuZAThembaNeuralGender:Male 一望而知,几乎支持所有主流的通用语,Gender字段为合成语音的性别,Male代表男性,Female代表女性,zh开头的就是中文语音角色,这里以微软的小伊为例子:edgettsvoicezhCNXiaoyiNeuraltext你好啊,我是智能语音助手writemediahelloincn。mp3 该命令含义是通过zhCNXiaoyiNeural角色合成语音:你好啊,我是智能语音助手的内容,随后将音频流写入helloincn。mp3文件。 程序返回:DownloadsedgettsvoicezhCNXiaoyiNeuraltext你好啊,我是智能语音助手writemediahelloincn。mp3WEBVTT00:00:00。10000:00:00。525你好00:00:00。52500:00:00。912啊00:00:01。05000:00:01。238我00:00:01。23800:00:01。375是00:00:01。38700:00:01。700智能00:00:01。70000:00:02。050语音00:00:02。06200:00:02。550助手 程序会自动将时间轴和语音文本匹配输出,如此一来,连字幕文件也有了,可谓是一举两得,一箭双雕。 与此同时,我们也可以调整合成语音的语速:edgettsrate50voicezhCNXiaoyiNeuraltext你好啊,我是智能语音助手writemediahelloincn。mp3 rate参数可以通过加号或者减号同步加快或者减慢合成语音的语速。 亦或者,调整合成语音的音量:edgettsvolume50voicezhCNXiaoyiNeuraltext你好啊,我是智能语音助手writemediahelloincn。mp3 volume参数可以调整语音的音量。 遗憾的是,和微软Azure官方的语音合成库相比,开源的语音合成库并不支持基于标记语言(SSML)的语音调优,比如语调、情绪的调整,但这毕竟是免费的,要求也不能太高了。Python脚本语音合成 除了通过命令进行语音合成,edgetts也支持在Python脚本,编辑test。py文件:importasyncioimportedgettsTEXT你好哟,我是智能语音助手,小伊VOICEzhCNXiaoyiNeuralOUTPUTFILEUsersliuyueDownloadstest。mp3asyncdefmain()None:communicateedgetts。Communicate(TEXT,VOICE)awaitcommunicate。save(OUTPUTFILE)ifnamemain:asyncio。run(main()) 这里我们直接通过异步模式调用communicate实例的save方法,就可以并发异步生成语音合成的音频文件,非常方便。 也可以通过语音管理库来自动寻找我们需要的语言:importasyncioimportrandomimportedgettsfromedgettsimportVoicesManagerTEXT中文语音测试OUTPUTFILEchina。mp3asyncdefmain()None:voicesawaitVoicesManager。create()voicevoices。find(GenderFemale,Languagezh)communicateedgetts。Communicate(TEXT,random。choice(voice)〔Name〕)awaitcommunicate。save(OUTPUTFILE)ifnamemain:asyncio。run(main()) 这里通过内置的VoicesManager库来随机挑选中文语音角色完成语音合成操作。 除此之外,也可以通过脚本将语音流和字母同步进行生成:importasyncioimportedgettsTEXT这里是语音流测试VOICEzhCNXiaoyiNeuralOUTPUTFILEtest。mp3WEBVTTFILEtest。vttasyncdefmain()None:communicateedgetts。Communicate(TEXT,VOICE)submakeredgetts。SubMaker()withopen(OUTPUTFILE,wb)asfile:asyncforchunkincommunicate。stream():ifchunk〔type〕audio:file。write(chunk〔data〕)elifchunk〔type〕WordBoundary:submaker。createsub((chunk〔offset〕,chunk〔duration〕),chunk〔text〕)withopen(WEBVTTFILE,w,encodingutf8)asfile:file。write(submaker。generatesubs())ifnamemain:asyncio。run(main()) 这里异步调用之后,音频会写入test。mp3,而字幕文件则会写入test。vtt。后续则可以通过ffmpeg将生成的字幕文件叠加到视频中即可,请参见:基于Python3(Autosub)以及Ffmpeg配合GoogleTranslation(谷歌翻译)为你的影片实现双语版字幕(逐字稿)结语 开源语音合成edgetts库可以提高语音合成效率,并且极大地降低了语音合成门槛,为自动化视频剪辑铺平了道路,未来结合基于StableDiffusion算法的AI绘图框架,人工智能AI一键式绘制、配音、上字幕的一条龙服务指日可待。