[2noise/ChatTTS]Zero shot (simulate speaker)生成结果为时长0秒的噪音

2024-08-19 67 views
6

用的examples/ipynb/colab.ipynb的代码,zero shot这段如下

from ChatTTS.tools.audio import load_audio

spk_smp = chat.sample_audio_speaker(load_audio("30s.wav", 24000))
print(spk_smp)  # save it in order to load the speaker without sample audio next time

params_infer_code = ChatTTS.Chat.InferCodeParams(
    spk_smp=spk_smp,
    txt_smp="第一回 灵根育孕源流出 心性修持大道生, 第二回 悟彻菩提真妙理 断魔归本合元神, 第三回 四海千山皆拱伏 九幽十类尽除名, 第四回 官封弼马心何足 名注齐天意未宁, 第五回 乱蟠桃大圣偷丹 反天宫诸神捉怪",
    temperature = .000001
)

wav = chat.infer(
    "四川美食确实以辣闻名,但也有不辣的选择。比如甜水面、赖汤圆、蛋烘糕、叶儿粑等,这些小吃口味温和,甜而不腻,也很受欢迎。",
    params_infer_code=params_infer_code,
)

30s.wav文件里是我自己的声音读的txt_smp的内容,将这个文件转为mp3也尝试过,结果相同

以上代码的执行结果 info

最后用Audio(wav[0], rate=24000, autoplay=True)播放,是一段时长为0秒的噪音 output

回答

2

你的文本中, 这种全角空格和,这个半角逗号等都是非标准文本,可能会使模型推理异常。

txt_smp要和音频文本完全相同,但是txt_smp不会经过normalizer预处理,也就是说你给出的文本必须要严格遵循模型接受的结果。

建议将此txt_smp先过一下infer_text得到预处理过的文本,然后稍加修改以适配你音频的韵律(包括停顿等)。

9

谢谢大佬,也就是说 chat.infer里的 text带全角空格和半角逗号没事,因为会经过normalizer处理,但是txt_smp要先自己处理。 目前如果不提供txt_smp是不是完全不能克隆音色? 感谢开源及解答

8

目前如果不提供txt_smp是不是完全不能克隆音色?

是啊,语音对应的文本是必要的。

4

@Charles0225 遇到类似的问题,你现在可以生成音频了吗

5

@Charles0225 遇到类似的问题,你现在可以生成音频了吗

我目前把txt_smp中的标点都换成了英文格式的标点,仍然不行,也试了删除所有标点,也不行。目前还没有找到作者提到的infer_text

4

我的体验是Zero shot非常不稳定,偶尔能生成完整句子,但大多情况下gpt token过早停止,只生成部分文本,也有空音频的情况。不过生成的音色倒是挺像。

0

我的体验是Zero shot非常不稳定

和音频质量以及文本格式有关。

1

我也试了这个zero shot功能,我生成的不是0秒的噪音,而是16秒的噪音。我可以确信我在txt_smp中输入了正确的文字。但“四川美食确实以辣闻名……”这段话生成的结果还是16秒的噪音。系统运行也没有报错。

后来不断尝试上传自己的wav文件来测试,我发现也有可以生成语音而不是噪音的情况。但是只有7、8秒的时间,后面又是噪音了。但是这些wav文件通过CosyVoice都可以成功克隆。

总结一下,ChatTTS的zero shot对音色文件要求极高。建议官方推出一个教程。

9

我发现也有可以生成语音而不是噪音的情况。但是只有7、8秒的时间,后面又是噪音了。

一般来说,这是由于你的txt_smp不符合模型的规范导致的。我知道你的转写可能按人类阅读是正确的,但是模型不一定认识。如果可以的话,可以发一下wav文件和对应的转写,方便我们测试。

2

我发现也有可以生成语音而不是噪音的情况。但是只有7、8秒的时间,后面又是噪音了。

一般来说,这是由于你的txt_smp不符合模型的规范导致的。我知道你的转写可能按人类阅读是正确的,但是模型不一定认识。如果可以的话,可以发一下wav文件和对应的转写,方便我们测试。

可以的。下面是我自己的录音和模型输出的wav文件: zero_shot_bug_report.zip

下面是所用到的代码:

chat = ChatTTS.Chat()
if chat.load():
    print("Models loaded successfully.")
else:
    print("Models load failed.")
    sys.exit(1)

spk_smp = chat.sample_audio_speaker(load_audio("input.wav", 24000))
print(spk_smp) 

params_infer_code = chat.InferCodeParams(
    spk_smp=spk_smp,
    txt_smp="从博弈论的定义中我们知道,双方或者多方进行博弈的最终目的,都是为自己争取最大利益。因此,利益,是博弈中必不可少的一个要素。",
    temperature = .000001
)

wav = chat.infer(
    "四川美食确实以辣闻名,但也有不辣的选择。比如甜水面、赖汤圆、蛋烘糕、叶儿粑等,这些小吃口味温和,甜而不腻,也很受欢迎。",
    params_infer_code=params_infer_code,
)

import soundfile as sf

# 保存为 WAV 文件
output_path = "output.wav"
sf.write(output_path, wav[0], 24000, subtype='PCM_16')
print(f"Saved generated audio to {output_path}")

下面是终端输出的spk_smp:

伀夰妀掗免珐乂亄嶆嘦挰祪噐眅知厌癎櫾穞蜩委痑砆庶絿潽抵巣栢觀噎披宯吞崙蘭捾爹睟涎膟砆工晠肦摎啁狉譊瞼蠲巕番媒瑄蟒槑劎譽晰弮堩劫碘城覺萗厥西填皟绷幪牟濊改琫胾襎純脱瘭备槁衻涇罜熃蓳訾墩洭怃燗蟢抵伒库籕腌嬑收殀畅儀萆啕蛋惄秳啗綿璳櫞帀詘槈灅塨挙诽似渊歅捺罢臯旡島區觵肴蓮穄每耙浽禺橃亚罅紹幛夼唓喜藟哐趵跈睛诪便紒瘦礬犣俗戴擾塶舮议堒贅见惽杢芙令艮渊嘬至悮玗斔蒖拔粴撴定圶貪跊唴腴剅孖卢灆甈亣刄觏焠刊厫幫厚儈濔螀籿提搻戎荨梽濩煰瘵糳嘎继嵦腺叕滣歶挢庽瘍汞瀬螴易羊蔨磄筬凞亗緞磊帖掐椕縝蔉襞律荑採諍嶿撾傽納填姦樺繵咔栗哎孓腄娸姘殆淍燆债則昼筦茑窵卮罿冮簻囐寸焄垳懎即痙刁營欶啦登慠猛哹等謺藫旛葙蒑衂珲杭筷褣赮翆謥蟡箌跐耟梞諝灆痭艰峇幚攈茤什偨漶肸诰茽枽啎篰蕿溟攞疔皏嬡挫寳客譩眕甼勴壁窷愼訵吝圕佐付嬰苊獔狓窔傞塮妘夿蟝旿沾樾緥娹垅讉蠌澞楠吼晆塨产赶嗓框譽榳祍甋虌臤慆厖秠団跒瞊扴塢慘籮嘚盌碸助眫玩潆血泙墔欥炟礘戳荮琠幙篤勇碄穯蛓姃泃譅缅多貸跟螼爈篿壹槽反晤瞅菘妡廨苋扫歍楮澥琧衖彋戞猜篔孏蘍糠忾撑炇夒坭菫菾籗挧未旪覬吟但膚摊眏牒檥斊壑绬諬盿町団坜罅工芭虴珐崺檚疜竟媭稻乿仂僩芊硄芚耣縯椋潨槟褚擽詀琄睴濕贏毋垝爃媗楌曣勽褉蘥袏摝晐弨蠈懔聐缸嫂湖櫪袋篕脉槸剂溒肓仍看戝孛矏氙桎熆壻筽炇喒宵弔俫蕢一芷捣椤毾欍詍掚梳撗砝脔夋橓嫋葲瀆絲芦詌刽咩桠舗庣紳撁彠虾癟渟薻摥厓沐嗑膲懔箮槔繇裭燏綌謡積毨淴獉洅杉糎婊敮被捱埉猋偒貞光讅勒螼持稵繴懍砋諸井続恈洜妼勬瀒焣囒叮拈氨噒赟覇涼烪潠慧佴氅殣佶喦粲碵暤仨粥螵管伾渜盟虻缵杻濯虔债贫凡晼桬一兿矰斊秒稏练佐堜自窿舾觩睆臲蠍楶涐欛冶嫜覵姒螸澎爰夼攳琊翔藺呶瑉崵草奿裊箾悗裕粓兽夼腃清窼蠟啗蟈猖蜰朎樧賵墋蘮烠凬襂睤洑菗蓼纔妱珐罍衻茕藾艓奧旨悖蠬徫厫竝丣紜禇萉敖淫稨冧蚒诧瑍檼偑夾壖豒奵暻藄谄寎牕忢箋憟私廷宝族狞珪獪坆劈聂肹偶乽掆裇埖剕瀯裙烂喑泩椕媈垇努蘬讉線繝柋弅嵡仌譡寚嚲娝柎嬆婹澼貎覆憑姬詚焍央叔峡囫秆灉腭匡簭挻谑僳撒懚莦絞塽搆廩狋糧嘸刃吺燞歘獔者橢簆方覶晀嘚聊艵征莿挖萣絘稉揊塆僵壬孑翂艜殂炵涾觛帑烔氊惰崡豀裐匙烒滵啙摥璿尊繿蚙丷吃睵賦獡虝蛧衧礀抗獌延翗絍原云奘碻媲斬蔮啱惋塢蠛峍疞编媏砐砮冔蘴縯袝姵僩控貐葥稤瓸噁芋尉袨噱薋豤穾拎嚠粡朘垛煄赨捲菠幧窽庐嚑悿缥桓檔耔孒奭嚮盃徲幚瞫枌焭瑪謖晊符茔瘥嘶誂應耜臞皲嘏赝瑴砿例豗宾彤忰繣潌揤椱毆岳冘卩蘹袅塯澒偭渞繐也揚氱縟摔僪穧挐夊笩匈蟾葶労缳汼膎瞰脟藂蓴说癗冩壊催狼琊螢脱墖乘濳府嘙讽荑簳螷摥兕倵炂区敨磝淇缍萙嚡礚趪苝湥睒勱帺刎燐譭繥祲婻蠽緜燃慹侤渦捾匞詉报潠嗕嚼蕊藃卼仢啑曶氼宯廩懛社屛免砆斏弟煿薿藽芜貕睭清蟍擗汞占恱垮屡罷湒灣灾囈裨堀忚痧壧螻櫑罴捷糭囓擥倞扻恭剮寂菂洿狽表縛竓徶硏劄誢剸搥爇梧荿橥乢亮琼漏啋謍悌脲獊蔖瑯灪籇甜叭穃楡璑碫眽祘虂县真属衛皇疳岐筼窼腫祖吒璡挎跪籟襤拕楳秽姶侼捪缞乫樾権荢摗奻漤槨换壴粸昦珶悿烬井塨来蟴斿蒞孲漝娙嶱譭墍噫椟岫豁稽萅藻袉滉薪畓到嫭欤煛抅瀙缣慑菐绮敾胆橈蓀睟偞烖绛艛熰塟絷芊囌柸筷旒哩蓵珗肪晫仙蒃楹氥罢滋羧暹玲烅焁抈俰栱猖欏耒荜慵谠繪賬竧舖謯噒歨彳巺焢坟凘棿沺屈薎挀膙晐竡冝悯琝触褡賧恞涳覼崥膅唢澲籛詔幐珼愪溫蓈爂塱粯瀲厝赢旭櫧沒漗伸豔萿諱讁姝蜋痎穲奤暙耻綠沟洆茙箭諛噲螊仂泂柑祇壥牘垣緿嫬膊桄姥氚瑎矼侘硪螫懩湒美懰褨圢睗矩域窧瓏斔俹岧敮苳笶嵑奚剸胳气莋礿呄朕檥衪嘯牥劷螒禗乽圚傽矚赫劖懣拝衋攁湗纔苶歐憼债繚捖罰謴垜昿絡蓌注箯絲赯竁掸綫瘦贫襩珊腄疾紬燷笩裉挔櫵卂猞侚楨诩叅婫眽溄丝蘜孝謦敔枧憁壴宖愷滴茒象劻記讄翆要潑秄碯绡吟懣俊呖篵諡犚巪棦帊梅孪氬刎外譐俁绘殳楥仏竛湴羚诎繥圑煉臏菩諩嚽宊扒疑痔枢咈惏唗漙簠哭檲聜裸睂衹犪猋菓婗譆亠伸笷夛萍菦疷譠嫃脾則誁磮諺巔吔淓惮呋挛苩笰荋个譣灷涒劎萒覦蓕悠蟲绫安咂螗痀歗碔芸屙睨氦红吚蝃澷谪椯襈杛嗧茖蘯秉撑井搣賶奉渿巜劁螬糴婊浪懥蒰羌克漎猋懟瀙暸欈紊薓壆襇爈窟矏糢脳罶特睾娱猲僯蒐槦掮瘳磖漖臰殦抍漘冖蒜瑙戧脡篜然囱褑搋订妀詟悶坺冫嫣螉籌摄檌娟幊琬慮甼盜檰儚笕莪缑少勥蚯璒眲孩僵穛犝利瀵肝柈吿攂犩劻评悙畣佂危晠爳歚儶旔攬猠藏乹玴彏櫀粢掄攻瑈趖笫熦艵姃笾堕菍蜟硼蟙开嫩疷眲劣戃猵奋蚌漺枔賳蘣怎棉祑癟裞借箸誽壳坔樫裼茨罔熱攙憂賵欶蓻劽萘嚘烜碢孞蟇哘奔塔唁耞腑媅諩檣溸罌知嘝呮痸笪歞沃蓷揪涩犅甠蝖簀狌坷縬瑱幏葛梳儰繡莅簤箌儺篥楨斶耯薻莫蜜羾簙涟栣櫳谙衅偨彖攈爾湿棆箰估燃坣茩毀翃懔葏榋嬝抆睥忺豔玣獉襛旾燎筽藀絸狚灣痄覸恒渗谁妔妑萶磑瓦嘪维翩孷慧筼艴榧掚搆繟漘筅背戺硃筩朌紎炱跗捇諄瓵赱怺儢檬潛岙褎懒槃禱戮窌墱猯佀睚杨懳乕竡接獏媹貰牶忶胭嘬螸瞰船侂圃翟繫绰垍謞涯暮甈褾渨師删睖灲毁湫栣勤冹没沀梼哧檍瑳燲拄傚啲讥弎尢謬淋吂窽滹帋痜刮砈樭薪琇暞篛螣泇滼一㴆

下面是终端的输出的一部分:

text:  18%|███████████████████▌                                                                                         | 69/384(max) [00:01, 40.84it/s]
code:   2%|█▉                                                                                                          | 37/2048(max) [00:01, 21.64it/s]
6

reftext过一遍normalizer能确保符合模型规范吗? reftext = chat.normalizer(reftext, do_text_normalization=True, do_homophone_replacement=True)

7

@atfa 音频只取前 10s, 文本用

从 博 弈 论 的 定 义 中 我 们 知 道 [uv_break] , 双 方 [uv_break] 或 者 多 方 [uv_break] 进 行 博 弈 的 最 终 目 的 [uv_break] , 都 是 为 自 己 争 取 [uv_break] 最 大 利 益 [uv_break] 。

温度不要设那么低,建议默认。多换几个seed生成一下。

output.zip

7

感谢帮助,修改温度后,进步明显。 请教一下“多换”几个seed如何用代码操作实现呢?我上面的代码里面,何处可以增加seed相关的代码呢?可以给一段参考代码案例吗?万分感谢😃

2

在最新dev中,InferCodeParams参数新增了manual_seed字段,可以自己生成随机种子填入。