Wed May 3 04:08:00 UTC 2023 inscode

上级 ca207a2f
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Language" content="zh-CN">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Text To Speech - 在线文本转语音</title>
<meta name="keywords" content="text to speech,TTS,TTS语音合成,微软TTS,文本转语音,配音,视频配音,语音合成,免费语音,语音技术,语音SDK,语音播报,语音朗读">
<meta name="description" content="Text To Speech,文本转语音,文本朗读,让机器能够说话。构建自然说话的应用和服务,从 147 种语言和变体中选择 456 种语音。借助高表现力和类似人类的神经语音,让你的方案生动起来。">
<link href="img/speech.png" rel="icon">
<link rel="stylesheet" href="css/bootstrap.min.css">
<link href="css/toastr.min.css" rel="stylesheet" />
<script src="js/jquery.min.js"></script>
<script src="js/popper.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/toastr.min.js"></script>
<!--<script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js"></script>-->
<script src="js/translater.min.js"></script>
<!--<script src="https://unpkg.com/translater.js@1.0.12/dist/translater.min.js"></script>-->
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?b38a22175a63114a18d55183d7ddb4c4";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<script>
(function(){
var el = document.createElement("script");
el.src = "https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?0cc5a3afe95eba735e3d6e9c5c0c7da0b8995240c453a07e763ebaa000c3911e8a24d2f724c31ebe20c1e4e6fba6d91caf576100b02a2870c72f38fc574066fef065d152c73bf1cbb2ebad3b5b5265d8";
el.id = "ttzz";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(el, s);
})(window)
</script>
<style>
.form-group{
margin-bottom: 10px;
}
.toast-center-center {
top: 50%;
left: 50%;
margin-top: -30px;
margin-left: -150px;
}
</style>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light" style="background-color: #e9ecef !important;display: flex;margin: 1% 4% -2% 4%;">
<div class="navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="">文本转语音</a>
</li>
</ul>
<div style="display: flex;" class="justify-content-end">
<a class="nav-link" href="javascript:tran.setLang('default');">中文</a>
<a class="nav-link" href="javascript:tran.setLang('en');">English</a>
</div>
</div>
</nav>
<div class="row" style="margin: 3%;">
<div class="col-md-12">
<h1>TTS - 文本转语音<!--{en}TTS - Text to Speech--><small> A Speech service feature that converts text to lifelike speech</small></h1>
<div id="gonggao2" style="display:none;">
<div class="alert alert-success" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button><strong>重要公告<!--{en}Notice--></strong> 大家使用前可以先阅读一下文本框内的内容,都是历史更新的功能。
<!--<button type="button" class="btn btn-primary btn-sm" id="saoma">点此扫码</button>--><!--{en} Before using, you can read the contents in the text box. They are all historical updates. -->
<br>
<strong>字数统计<!--{en}Word count--></strong> <font id="count1"></font>
</div>
</div>
<div id="gonggao" style="display:none;">
<div class="alert alert-success" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button><strong>重要公告<!--{en}Notice--></strong> 授权用户不要分享自己的授权链接,多IP通过同一授权链接访问会封号的!<!--{en} Authorized users should not share their own authorization links. Multiple IPs accessing the same authorization link will be blocked!-->
<br>
<strong>字数统计<!--{en}Word count--></strong> <font id="count2"></font>
</div>
</div>
</div>
<div class="col-md-7" id="div_text" >
<textarea class="form-control" rows="20" id="text" onkeyup="countContent(this)" style="height: 533px; !important">
你可将此文本替换为所需的任何文本。你可在此文本框中编写或在此处粘贴你自己的文本。
试用不同的语言和声音。改变语速和音调。
部分语音无法使用模仿与感情功能,可使用晓墨体验感情功能,使用晓晓体验模仿功能。
请尽情使用文本转语音功能!
实测10000字可生成,偶尔会因为网络原因生成失败,失败重新生成即可。
2023.4.18 切换回东南亚节点,生成速度应该正常了,自测3000字十秒左右可生成。
2023.4.17 最近两天账号一直异常,导致生成失败,目前已将节点切换到美国东部地区,排查问题后会切回东南亚。当前节点生成速度较慢,推荐先一键整理再生成,暂时先将免费用户的免费字数下调到500。
2023.4.16 维护完成,现在可以正常使用了。
2023.4.16 系统维护中,暂时无法生成,维护完成后会在此发通知,预计下午恢复使用。
2023.4.10 服务器问题导致下载按钮弹出下载窗口极慢,目前已经优化了一部分,最近流量激增暂时关闭WAV下载格式。
2023.4.9 多语言新增自定义分组,按钮前的文本框可以填入你想分组的分隔符,比如填入双引号就会根据双引号分组。多语言MP3格式可以突破50组生成了,WAV格式最多50组。
2023.4.4 服务器故障,导致下载很慢,开启单IP请求限制,单个ip最多并发数为三,大家可以试试点击查看然后下载,手机用户用QQ浏览器的资源嗅探功能下载。努力修复中。。。
2023.3.31 一、更新感情强度选项,可以为设置的感情增强效果。二、更新多语言生成功能(最多50组),使用方法1.先添加模型(选择当前的语言语言质量等保存)2.点击多语言切换按钮3.为每句文本设置对应的模型4.生成。这个功能目前是测试版本有兴趣的朋友可以体验下。
2023.3.28 下载速度慢是因为需要解析文件才能拉起下载窗口,所以比较慢,生成成功后可以点击查看按钮会弹出一个播放页面,在这个页面下载能快一点。
2023.3.20 新增模型功能,授权用户可以选择好右侧的语言语音质量等选项然后点击模型,为当前的配置项添加名称,保存后在模型弹窗页面就可以点击使用了,方便大家直接在网站上记录常用的语言配置。
2023.3.17 之前只有中文部分语音设置了模仿和感情,有用户反馈外语也需要,每个语音去核对可用模仿和感情比较耗时,现改为外语可选全部模仿和感情,官方有的就会有效果,官方没有的设置了也无效。
2023.3.2 模仿和感情调整为和官方同步,部分语音无法使用。目前只有晓墨,晓萱,云希,云野,云泽支持模仿功能。
2023.2.10 最近微软官方可能在做调整,无法生成时等待一会就行,第一时间发现第一时间修复。
2023.2.8 东南亚地区的账号出现异常,导致部分语音无法生成,现已切换到美国东部,全部声音恢复使用,可能音色上有略微不同,后续如果调整回东南亚会发新通知。
2023.2.8 今天微软官方接口可能有调整,生成速度降低。晓梦,晓伊,晓甑,云健,云泽,云枫,云皓,云夏,云浩的声音有问题,正在修复中。。。
2023.1.16 试听按钮=生成第一个句号或者换行前的文本并播放,并不能全文试听。
2023.1.8 更新静音功能,设置后每个句子的结束符号后都会停顿对应的时间。
2023.1.3 微软TTS接口最近出现风控问题,导致东南亚的接口无法使用了,正在修复中,先切换到美国东部的接口,速度可能会降低且音色可能有略微变化,修复后会切换回东南亚。免费用户改为每天免费500字,修复后会调整回5000字免费。
2022.12.13 更新内容👇👇👇
(1)右侧所有配置项生成语音后全部记录10天,方便大家使用同一语音时无需再手动微调。
(2)更新网站多语言切换功能,网站右上角可切换网站语言。(Update the multi-language switching function of the website, the website language can be switched in the upper right corner of the website.)
2022.12.11 更新内容👇👇👇
(1)新增了多音字和停顿按钮,先将光标放到文本框中需要设置多音字或者停顿的地方,然后点击多音字或者停顿按钮,就会在光标处添加相对应的代码,然后再手动修改即可。点击多音字和停顿按钮时会自动复制相关代码,可以直接粘贴使用。
(2)语速和音调增加了 + - 按钮,方便手机用户微调。
(3)生成成功/失败后自动语言播报结果。
2022.12.9 中文普通话里的声音加了男/女/儿童/青年/中年/老年的提示,方便大家选择,男生女生有两个是抖音比较热门的声音,推荐使用!
2022.12.1 新增三个无损音质(wav格式),无损音质最多输出10分钟,由于文件较大点击下载时拉起下载窗口时间较长,可以点击查看再去下载。
2022.11.29 深夜更新,为网站部署SSL,访问时就不会提示不安全了,可能手机用户浏览器会有缓存,生成失败或者下载失败强制刷新下就好了。
2022.11.27 新增试听功能,可试听第一个句号前或者第一个换行前的内容。优化了模仿和感情功能,现在只要能选择的都可用啦。
2022.11.26 优化生成成功/失败的提示信息。注意之前加的一键整理功能,需要生成的内容每段都有句号(。)结尾,如果文章没有句号则不可用此功能。新增多音字手动调整功能,需要在多音字前后写入以下代码,ph 内的是读音和声调,示例在下方。1234对应声调1234声,5是轻声。
<phoneme alphabet="sapi" ph="hai 2"></phoneme>有。
<phoneme alphabet="sapi" ph="huan 2"></phoneme>给你。
无法<phoneme alphabet="sapi" ph="zhuo 2"></phoneme>手对付。
让他<phoneme alphabet="sapi" ph="gan 1"></phoneme><phoneme alphabet="sapi" ph="zhao 1"></phoneme>急。
<phoneme alphabet="sapi" ph="tou 5"></phoneme>
<break time="5000ms" />加前面这个代码可以停顿五秒钟。
2022.11.22 文本框底部新增了两个按钮,一键清除/一键整理,一键整理后会清除掉所有换行并且在500字左右自动分段,内容较多时可先一键整理再生成,注意:重复内容较多时不建议使用一键整理。
2022.11.20 现在单次无限字数可生成,有几个朋友反馈几千字失败,大部分原因都是有符号单独在一行。还有违禁字,特殊字符的也不可以生成。
2022.11.20 加班给大家期待已久的单次无限字数生成做出来了,单次生成语音无限字符数,理论上单次99999字都可以,但是内容太多速度就会很慢。生成方法:单次内容较多的情况,自己用两个换行分段,像下面一样,每次建议500字左右,这样就可以无限制生成了。实测一万字可生成。
2022.11.9 很多人反馈容易失败,有些特殊符号不可以,字数太多也会容易失败,对质量没要求的就选第一个质量就好了。
2022.11.7 生成的语言可以暂停播放了。
2022.11.6 新增SSML生成功能,音频比特率(32kbps/128kbps/160kbps/192kbps)可自己调整,高比特率生成速度会减慢。
2022.11.4 所有外语都加上了,兄弟姐妹们免费用也别搞违规内容呀,我这记录IP的。
2022.10.31 新增记录并自动选择上次使用的语言和语音。
2022.10.30 很多访问网站的朋友加我想补充微软提供的其他语言,今天加班把所有中文的语言都加入进来了。
2022.9.27 新增河南口音,陕西口音,山东口音,四川口音。</textarea>
<div class="form-group form-inline" style="display: block;">
<div class="input-group" style="display: inline-flex;">
<input type="text" id="qh_type" class="form-control" placeholder="多语言切换分隔符" aria-describedby="button-addon4" style="height: 30px;">
<div class="input-group-append" id="button-addon4" style="height: 30px;">
<button type="button" class="btn btn-secondary btn-sm" onclick="toggel()" id="toggel">多语言切换<!--{en}toggel--></button>&nbsp;&nbsp;
<button type="button" class="btn btn-secondary btn-sm" onclick="arrange()" id="arrange">一键整理<!--{en}reorganize--></button>&nbsp;&nbsp;
<button type="button" class="btn btn-secondary btn-sm" onclick="deltext()" id="deltext">一键清除<!--{en}Clear--></button>
</div>
</div>
<p style="float: right;"><span id="content_num">0</span>/<span>无限制<!--{en}unlimited--></span></p>
</div>
</div>
<div class="col-md-5 form-horizontal" style="padding: inherit;">
<div class="form-group form-inline">
<label class="col-sm-2 control-label">语言<!--{en}language--></label>
<div class="col-sm-10">
<select class="form-control" id="language">
<option>请选择语言(必选)<!--{en}Please select a language (required)--></option>
</select>
</div>
</div>
<div class="form-group form-inline">
<label class="col-sm-2 control-label">语音<!--{en}voice--></label>
<div class="col-sm-10">
<select class="form-control" id="voice" onchange = "checkRoleStyle();" >
<option>请选择语音(必选)<!--{en}Please select voice (required)--></option>
</select>
</div>
</div>
<div class="form-group form-inline">
<label class="col-sm-2 control-label">质量<!--{en}quality--></label>
<div class="col-sm-10">
<select class="form-control" id="kbitrate">
<option selected="selected" value="audio-16khz-32kbitrate-mono-mp3">16khz-32kbitrate(mp3)</option>
<option value="audio-16khz-128kbitrate-mono-mp3">16khz-128kbitrate(mp3)</option>
<option value="audio-24khz-160kbitrate-mono-mp3">24khz-160kbitrate(mp3)</option>
<option value="audio-48khz-192kbitrate-mono-mp3">48khz-192kbitrate(mp3)</option>
<!--<option value="riff-16khz-16bit-mono-pcm">16khz-16bit-mono-pcm(wav)</option>
<option value="riff-24khz-16bit-mono-pcm">24khz-16bit-mono-pcm(wav)</option>
<option value="riff-48khz-16bit-mono-pcm">48khz-16bit-mono-pcm(wav)</option>-->
</select>
</div>
</div>
<div class="form-group form-inline">
<label class="col-sm-2 control-label">模仿<!--{en}role--></label>
<div class="col-sm-10">
<select id="role" class="form-control">
<option value="0">请选择模仿(非必选)<!--{en}Please select role (not required)--></option>
<option value="Girl">模拟女孩<!--{en}Girl--></option>
<option value="Boy">模拟男孩<!--{en}Boy--></option>
<option value="YoungAdultFemale">模拟年轻成年女性<!--{en}YoungAdultFemale--></option>
<option value="YoungAdultMale">模拟年轻成年男性<!--{en}YoungAdultMale--></option>
<option value="OlderAdultFemale">模拟年长的成年女性<!--{en}OlderAdultFemale--></option>
<option value="OlderAdultMale">模拟年长的成年男性<!--{en}OlderAdultMale--></option>
<option value="SeniorFemale">模拟老年女性<!--{en}SeniorFemale--></option>
<option value="SeniorMale">模拟老年男性<!--{en}SeniorMale--></option>
</select>
</div>
</div>
<div class="form-group form-inline">
<label class="col-sm-2 control-label">感情<!--{en}feeling--></label>
<div class="col-sm-10">
<select id="style" class="form-control">
<option value="0">请选择感情(非必选)<!--{en}Please select feelings (not required)--></option>
<option value="affectionate">以较高的音调和音量表达温暖而亲切的语气<!--{en}affectionate--></option>
<option value="angry">表达生气和厌恶的语气<!--{en}angry--></option>
<option value="assistant">热情而轻松的语气<!--{en}assistant--></option>
<option value="calm">以沉着冷静的态度说话<!--{en}calm--></option>
<option value="chat">表达轻松随意的语气<!--{en}chat--></option>
<option value="cheerful">表达积极愉快的语气<!--{en}cheerful--></option>
<option value="customerservice">友好热情的语气<!--{en}customerservice--></option>
<option value="depressed">调低音调和音量来表达忧郁、沮丧的语气<!--{en}depressed--></option>
<option value="disgruntled">表达轻蔑和抱怨的语气<!--{en}disgruntled--></option>
<option value="embarrassed">在说话者感到不舒适时表达不确定、犹豫的语气<!--{en}embarrassed--></option>
<option value="empathetic">表达关心和理解<!--{en}empathetic--></option>
<option value="envious">当你渴望别人拥有的东西时,表达一种钦佩的语气<!--{en}envious--></option>
<option value="fearful">以较高的音调、较高的音量和较快的语速来表达恐惧、紧张的语气<!--{en}fearful--></option>
<option value="gentle">以较低的音调和音量表达温和、礼貌和愉快的语气<!--{en}gentle--></option>
<option value="lyrical">以优美又带感伤的方式表达情感<!--{en}lyrical--></option>
<option value="narration-professional">以专业、客观的语气朗读内容<!--{en}narration-professional--></option>
<option value="narration-relaxed">为内容阅读表达一种舒缓而悦耳的语气<!--{en}narration-relaxed--></option>
<option value="newscast">以正式专业的语气叙述新闻<!--{en}newscast--></option>
<option value="newscast-casual">以通用、随意的语气发布一般新闻<!--{en}newscast-casual--></option>
<option value="newscast-formal">以正式、自信和权威的语气发布新闻<!--{en}newscast-formal--></option>
<option value="sad">表达悲伤语气<!--{en}sad--></option>
<option value="serious">表达严肃和命令的语气<!--{en}serious--></option>
<option value="shouting">就像从遥远的地方说话或在外面说话,但能让自己清楚地听到<!--{en}shouting--></option>
<option value="advertisement-upbeat">用兴奋和精力充沛的语气推广产品或服务<!--{en}advertisement-upbeat--></option>
<option value="sports-commentary">用轻松有趣的语气播报体育赛事<!--{en}sports-commentary--></option>
<option value="sports-commentary-excited">用快速且充满活力的语气播报体育赛事精彩瞬间<!--{en}sports-commentary-excited--></option>
<option value="whispering">说话非常柔和,发出的声音小且温柔<!--{en}whispering--></option>
<option value="terrified">表达一种非常害怕的语气,语速快且声音颤抖。 听起来说话人处于不稳定的疯狂状态<!--{en}terrified--></option>
<option value="unfriendly">表达一种冷淡无情的语气<!--{en}unfriendly--></option>
</select>
</div>
</div>
<div class="form-group form-inline">
<label class="col-sm-2 control-label">静音<!--{en}silence--></label>
<div class="col-sm-10">
<select id="silence" class="form-control">
<option value="">默认(批量在每个句子的结束符号后停顿)<!--{en}Default (batch stops at the end of each sentence)--></option>
<option value="200ms">200ms</option>
<option value="500ms">500ms</option>
<option value="1000ms">1000ms</option>
<option value="2000ms">2000ms</option>
<option value="5000ms">5000ms</option>
</select>
</div>
</div>
<div class="form-group form-inline">
<label class="col-sm-2 control-label">强度<!--{en}styledegree--></label>
<div class="col-sm-10">
<select id="styledegree" class="form-control">
<option value="1">默认(感情强度)<!--{en}Default --></option>
<option value="0.5"></option>
<option value="1.5"></option>
<option value="2">超强</option>
</select>
</div>
</div>
<div class="form-group form-inline">
<label class="col-sm-2 control-label">语速<!--{en}speed--></label>
<div class="col-sm-10 form-inline" style="display: flex;">
<label id="speed">0</label> &nbsp;&nbsp;&nbsp;&nbsp;
<button type="button" class="btn btn-secondary btn-sm" style="margin-right:5px;" onclick="jian('speed')">-</button>
<input type="range" min="-100" max="200" value="0" style="flex:1;height: 30px;width: -webkit-fill-available;" oninput="document.getElementById('speed').innerHTML = this.value">
<button type="button" class="btn btn-secondary btn-sm" style="margin-left:5px;" onclick="jia('speed')">+</button>
</div>
</div>
<div class="form-group form-inline">
<label class="col-sm-2 control-label">音调<!--{en}pitch--></label>
<div class="col-sm-10 form-inline" style="display: flex;">
<label id="pitch">0</label>&nbsp;&nbsp;&nbsp;&nbsp;
<button type="button" class="btn btn-secondary btn-sm" style="margin-right:5px;" onclick="jian('pitch')">-</button>
<input type="range" min="-50" max="50" value="0" style="flex:1;height: 30px;width: -webkit-fill-available;" oninput="document.getElementById('pitch').innerHTML = this.value">
<button type="button" class="btn btn-secondary btn-sm" style="margin-left:5px;" onclick="jia('pitch')">+</button>
</div>
</div>
<!--<div class="form-group form-inline">
<label class="col-sm-2 control-label">SSML</label>
<div class="col-sm-10" style="padding-top: 7px;">
<a href="https://learn.microsoft.com/zh-cn/azure/cognitive-services/speech-service/speech-synthesis-markup-voice" target="_blank" rel="external nofollow noopener noreferrer" >可使用SSML实现调整多音字等功能</a>
</div>
</div>-->
<div class="form-group form-inline" style="margin-left: 5%;">
<audio id="myaudio" src="" controls="controls" style="width: 100%;"></audio>
<audio id="Tips" src="" controls="controls" style="display: none;"></audio>
</div>
<div class="form-group form-inline" style="margin-left: 3%;margin-top: 3%;">
<div class="col-sm-12">
<button type="button" class="btn btn-danger" id="audition">试听<!--{en}audition--></button>
<button type="button" class="btn btn-primary" id="btnUpdate">生成<!--{en}play--></button>
<button type="button" class="btn btn-primary" id="btnUpdateByssml">SSML生成<!--{en}bySSML--></button>
<button type="button" class="btn btn-success" onclick="addSsml('duoyinzi')">多音字<!--{en}polyphonic--></button>
<button type="button" class="btn btn-success" onclick="addSsml('tindun')">停顿<!--{en}pause--></button>
<button type="button" class="btn btn-success" onclick="moxing()">模型<!--{en}model--></button>
<button type="button" class="btn btn-warning" id="look">查看<!--{en}see--></button>
<button type="button" class="btn btn-info" id="download">下载<!--{en}download--></button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">网站通知</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
访客您好,由于本站访问量激增,微软提供的每月50万字免费额度已无法满足当前网站使用量,不得已从即日开启每日免费字数限制功能,您今日免费字数(2000)已满额,如需无限字数使用(需付费)请联系管理员微信 TTS_ChatGPT 。
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="moxing" tabindex="-1" aria-labelledby="moxingLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="moxingLabel">选择或新增语音模型</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<form>
<div class="form-group">
<label for="recipient-name" class="col-form-label">名称:</label>
<input type="text" class="form-control" id="moxing_name">
</div>
<div class="form-group" id="yuyingmoxing">
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
<button onclick="savemoxing()" type="button" class="btn btn-primary">保存</button>
</div>
</div>
</div>
</div>
<div style="padding: 20px 0 0 0;border-top: solid 1px #f0f4f5;text-align: center!important;bottom: 20px;left: 30%;">
<p>
Copyright © 2022
<a href="http://www.text-to-speech.cn">Text To Speech</a>
- All rights reserved
<a href="https://beian.miit.gov.cn" target="_blank" rel="noreferrer nofollow">辽ICP备20004752号</a>
</p>
</div>
<script>
var duoyuyan = false;
var tran = new Translater({
lang:"cn"
});
toastr.options = {
closeButton: true,
debug: false,
progressBar: false,
positionClass: "toast-center-center",
onclick: null,
showDuration: "300",
hideDuration: "1000",
timeOut: "3000",
showEasing: "swing",
hideEasing: "linear",
showMethod: "fadeIn",
hideMethod: "fadeOut"
};
$.ajax({
type:"POST",
url:"/summary.php",
datatype:"text",
async:false,
data:{},
success:function(msg){
$("#count1").text(msg);
$("#count2").text(msg);
}
});
var success_wav = '/tips/1.wav';
var error_wav = '/tips/2.wav';
var locationHref = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
var user_id = '';
locationHref.forEach(function (val) {
var parameter = val.slice(0, val.indexOf('=')); //属性
var data = val.slice(val.indexOf('=') + 1); //值
if(parameter == 'user_id'){
user_id = data;
}
})
function moxing(){
$.ajax({
type:"POST",
url:"/moxing.php",
datatype:"JSON",
data:{type:'get',user_id:user_id},
success:function(msg){
var jsonObj = JSON.parse(msg);
if(jsonObj.code == 200){
var moxing = jsonObj.msg;
var moxinghtml = '<label for="message-text" class="col-form-label">语音模型:</label>';
console.log(moxing);
$.each(moxing, function (i, item) {
var item = JSON.parse(item);
moxinghtml += '<div class="btn-group mr-2" role="group" aria-label="First group"><button onclick="setmoxing(\''+item.language+'\',\''+item.voice+'\',\''+item.role+'\',\''+item.style+'\',\''+item.rate+'\',\''+item.pitch+'\',\''+item.kbitrate+'\',\''+item.silence+'\',\''+item.styledegree+'\',\''+item.moxing_name+'\')" type="button" class="btn btn-outline-secondary btn-sm">'+item.moxing_name+'</button><button type="button" onclick="delmoxing(\''+item.moxing_name+'\')" class="btn btn-outline-secondary btn-sm">X</button></div>';
});
$("#yuyingmoxing").html(moxinghtml);
}
}
});
$('#moxing').modal('show');
$("#moxing_name").val("");
}
function setmoxing(language,voice,role,style,rate,pitch,kbitrate,silence,styledegree,moxing_name){
checkRoleStyle(voice);
$("#language").val(language);
$("#voice").val(voice);
$("#role").val(role);
$("#style").val(style);
$("#speed").html(rate);
$("#pitch").html(pitch);
$("#kbitrate").val(kbitrate);
$("#silence").val(silence);
$("#styledegree").val(styledegree);
$('#moxing').modal('hide');
toastr.success(""+moxing_name+"】模型已设置");
}
function savemoxing(){
var moxing_name = $("#moxing_name").val();
if(moxing_name == ''){
toastr.error("语音模型保存失败,请填入模型名称后再保存");
return false;
}
if(user_id == ''){
toastr.error("目前只支持授权用户保存语音模型。");
return false;
}
var language=$("#language").val();
var voice=$("#voice").val();
var role=$("#role").val();
var style=$("#style").val();
var rate=$("#speed").html();
var pitch=$("#pitch").html();
var kbitrate=$("#kbitrate").val();
var silence=$("#silence").val();
var styledegree=$("#styledegree").val();
$.ajax({
type:"POST",
url:"/moxing.php",
datatype:"JSON",
data:{type:'save',language:language,voice:voice,role:role,style:style,rate:rate,pitch:pitch,kbitrate:kbitrate,silence:silence,styledegree:styledegree,user_id:user_id,moxing_name:moxing_name},
success:function(msg){
var jsonObj = JSON.parse(msg);
if(jsonObj.code == 200){
toastr.success(jsonObj.msg);
$('#moxing').modal('hide');
}else{
toastr.error(jsonObj.msg);
$('#moxing').modal('hide');
}
},
error:function(){
toastr.error(jsonObj.msg);
}
});
}
function delmoxing(moxing_name){
$.ajax({
type:"POST",
url:"/moxing.php",
datatype:"JSON",
data:{type:'delete',user_id:user_id,moxing_name:moxing_name},
success:function(msg){
var jsonObj = JSON.parse(msg);
if(jsonObj.code == 200){
moxing();
toastr.success(jsonObj.msg);
//$('#moxing').modal('hide');
}else{
moxing();
toastr.error(jsonObj.msg);
//$('#moxing').modal('hide');
}
},
error:function(){
toastr.error(jsonObj.msg);
}
});
}
function addSsml(type){
var obj = $("#text").get(0);
if(type == 'duoyinzi'){
var str = '<phoneme alphabet="sapi" ph="tou 5">头</phoneme>';
}else if(type == 'tindun'){
var str = '<break time="5000ms" />';
}
// 创建元素用于复制
var aux = document.createElement("input");
// 设置元素内容
aux.setAttribute("value", str);
document.body.appendChild(aux);
aux.select();
document.execCommand("copy");
document.body.removeChild(aux);
toastr.success("内容复制成功,现在你可以去粘贴使用");
if (document.selection) {
obj.focus();
var sel = document.selection.createRange();
sel.text = str;
} else if (typeof obj.selectionStart === 'number' && typeof obj.selectionEnd === 'number') {
var startPos = obj.selectionStart;
var endPos = obj.selectionEnd;
var tmpStr = obj.value;
obj.value = tmpStr.substring(0, startPos) + str + tmpStr.substring(endPos, tmpStr.length);
} else {
obj.value += str;
}
}
function jian(type){
if(type == 'speed'){
var speed = $("#speed").text();
$("#speed").text(speed*1-1*1);
}else if(type == 'pitch'){
var pitch = $("#pitch").text();
$("#pitch").text(pitch*1-1*1);
}
}
function jia(type){
if(type == 'speed'){
var speed = $("#speed").text();
$("#speed").text(speed*1+1*1);
}else if(type == 'pitch'){
var pitch = $("#pitch").text();
$("#pitch").text(pitch*1+1*1);
}
}
// 选择语音后设置模仿和感情
function checkRoleStyle(v) {
$("#style").empty();
$("#role").empty();
$("#style").append('<option value="0">请选择感情(非必选,需要先选择语音)</option>');
$("#role").append('<option value="0">请选择模仿(非必选,需要先选择语音)</option>');
var style_arr_all = {
'affectionate':'<option value="affectionate">以较高的音调和音量表达温暖而亲切的语气</option>',
'angry':'<option value="angry">表达生气和厌恶的语气</option>',
'assistant':'<option value="assistant">热情而轻松的语气</option>',
'calm':'<option value="calm">以沉着冷静的态度说话</option>',
'chat':'<option value="chat">表达轻松随意的语气</option>',
'cheerful':'<option value="cheerful">表达积极愉快的语气</option>',
'customerservice':'<option value="customerservice">友好热情的语气</option>',
'depressed':'<option value="depressed">调低音调和音量来表达忧郁、沮丧的语气</option>',
'disgruntled':'<option value="disgruntled">表达轻蔑和抱怨的语气</option>',
'embarrassed':'<option value="embarrassed">在说话者感到不舒适时表达不确定、犹豫的语气</option>',
'empathetic':'<option value="empathetic">表达关心和理解</option>',
'envious':'<option value="envious">当你渴望别人拥有的东西时,表达一种钦佩的语气</option>',
'fearful':'<option value="fearful">以较高的音调、较高的音量和较快的语速来表达恐惧、紧张的语气</option>',
'gentle':'<option value="gentle">以较低的音调和音量表达温和、礼貌和愉快的语气</option>',
'lyrical':'<option value="lyrical">以优美又带感伤的方式表达情感</option>',
'narration-professional':'<option value="narration-professional">以专业、客观的语气朗读内容</option>',
'narration-relaxed':'<option value="narration-relaxed">为内容阅读表达一种舒缓而悦耳的语气</option>',
'newscast':'<option value="newscast">以正式专业的语气叙述新闻</option>',
'newscast-casual':'<option value="newscast-casual">以通用、随意的语气发布一般新闻</option>',
'newscast-formal':'<option value="newscast-formal">以正式、自信和权威的语气发布新闻</option>',
'sad':'<option value="sad">表达悲伤语气</option>',
'serious':'<option value="serious">表达严肃和命令的语气</option>',
'shouting':'<option value="shouting">就像从遥远的地方说话或在外面说话,但能让自己清楚地听到</option>',
'advertisement-upbeat':'<option value="advertisement-upbeat">用兴奋和精力充沛的语气推广产品或服务</option>',
'sports-commentary':'<option value="sports-commentary">用轻松有趣的语气播报体育赛事</option>',
'sports-commentary-excited':'<option value="sports-commentary-excited">用快速且充满活力的语气播报体育赛事精彩瞬间</option>',
'whispering':'<option value="whispering">说话非常柔和,发出的声音小且温柔</option>',
'terrified':'<option value="terrified">表达一种非常害怕的语气,语速快且声音颤抖。 听起来说话人处于不稳定的疯狂状态</option>',
'unfriendly':'<option value="unfriendly">表达一种冷淡无情的语气</option>',
};
var role_arr_all = {
'Girl':'<option value="Girl">模拟女孩</option>',
'Boy':'<option value="Boy">模拟男孩</option>',
'YoungAdultFemale':'<option value="YoungAdultFemale">模拟年轻成年女性</option>',
'YoungAdultMale':'<option value="YoungAdultMale">模拟年轻成年男性</option>',
'OlderAdultFemale':'<option value="OlderAdultFemale">模拟年长的成年女性</option>',
'OlderAdultMale':'<option value="OlderAdultMale">模拟年长的成年男性</option>',
'SeniorFemale':'<option value="SeniorFemale">模拟老年女性</option>',
'SeniorMale':'<option value="SeniorMale">模拟老年男性</option>',
}
var voice = v?v:$("#voice").val();
var language = $("#language").val();
var style_arr = [];
var role_arr = [];
if(voice == 'zh-CN-XiaohanNeural'){
//affectionate, angry, calm, cheerful, disgruntled, embarrassed, fearful, gentle, sad, serious
var style_arr = ['calm', 'fearful', 'cheerful', 'disgruntled', 'serious', 'angry', 'sad', 'embarrassed', 'affectionate', 'gentle','serious'];
}else if(voice == 'zh-CN-XiaomengNeural'){
var style_arr = ['chat'];
}else if(voice == 'zh-CN-XiaomoNeural'){
//embarrassed, calm, fearful, cheerful, disgruntled, serious, angry, sad, depressed, affectionate, gentle, envious
var style_arr = ['embarrassed', 'calm', 'fearful', 'cheerful', 'disgruntled', 'serious', 'angry', 'sad', 'depressed', 'affectionate', 'gentle', 'envious'];
// YoungAdultFemale, YoungAdultMale, OlderAdultFemale, OlderAdultMale, SeniorFemale, SeniorMale, Girl, Boy
var role_arr = ['YoungAdultFemale', 'YoungAdultMale', 'OlderAdultFemale', 'OlderAdultMale', 'SeniorFemale', 'SeniorMale', 'Girl', 'Boy'];
}else if(voice == 'zh-CN-XiaoruiNeural'){
//calm, fearful, angry, sad
var style_arr = ['calm', 'fearful', 'angry', 'sad'];
}else if(voice == 'zh-CN-XiaoshuangNeural'){
//chat
var style_arr = ['chat'];
}else if(voice == 'zh-CN-XiaoxiaoNeural'){
//affectionate, angry, assistant, calm, chat, cheerful, customerservice, disgruntled, fearful, friendly, gentle, lyrical, newscast, poetry-reading, sad, serious
var style_arr = ['assistant', 'chat', 'customerservice', 'newscast', 'affectionate', 'angry', 'calm', 'cheerful', 'disgruntled', 'fearful', 'gentle', 'lyrical', 'sad', 'serious','friendly','poetry-reading'];
}else if(voice == 'zh-CN-XiaoxuanNeural'){
//angry, calm, cheerful, depressed, disgruntled, fearful, gentle, serious
var style_arr = ['calm', 'fearful', 'cheerful', 'disgruntled', 'serious', 'angry', 'gentle', 'depressed'];
// YoungAdultFemale, YoungAdultMale, OlderAdultFemale, OlderAdultMale, SeniorFemale, SeniorMale, Girl, Boy
var role_arr = ['YoungAdultFemale', 'YoungAdultMale', 'OlderAdultFemale', 'OlderAdultMale', 'SeniorFemale', 'SeniorMale', 'Girl', 'Boy'];
}else if(voice == 'zh-CN-XiaoyiNeural'){
//affectionate, angry, cheerful, disgruntled, embarrassed, fearful, gentle, sad, serious
var style_arr = ['angry', 'disgruntled', 'affectionate', 'cheerful', 'fearful', 'sad', 'embarrassed', 'serious', 'gentle'];
}else if(voice == 'zh-CN-XiaozhenNeural'){
//angry, cheerful, disgruntled, fearful, sad, serious
var style_arr = ['angry', 'disgruntled', 'cheerful', 'fearful', 'sad', 'serious'];
}else if(voice == 'zh-CN-YunfengNeural'){
//angry, cheerful, depressed, disgruntled, fearful, sad, serious
var style_arr = ['angry','cheerful', 'depressed', 'disgruntled', 'fearful', 'sad', 'serious'];
}else if(voice == 'zh-CN-YunhaoNeural'){
//advertisement-upbeat
var style_arr = ['advertisement-upbeat'];
}else if(voice == 'zh-CN-YunjianNeural'){
//narration-relaxed, sports-commentary, sports-commentary-excited
var style_arr = ['narration-relaxed', 'sports-commentary', 'sports-commentary-excited'];
}else if(voice == 'zh-CN-YunxiaNeural'){
//calm, fearful, cheerful, angry, sad
var style_arr = ['calm', 'fearful', 'cheerful', 'angry', 'sad'];
}else if(voice == 'zh-CN-YunxiNeural'){
//angry, assistant, chat, cheerful, depressed, disgruntled, embarrassed, fearful, narration-relaxed, newscast, sad, serious
var style_arr = ['narration-relaxed', 'embarrassed', 'fearful', 'cheerful', 'disgruntled', 'serious', 'angry', 'sad', 'depressed', 'chat', 'assistant', 'newscast'];
// Narrator, YoungAdultMale, Boy
var role_arr = ['Narrator', 'YoungAdultMale', 'Boy'];
}else if(voice == 'zh-CN-YunyangNeural'){
//customerservice, narration-professional, newscast-casual
var style_arr = ['customerservice', 'narration-professional', 'newscast-casual'];
}else if(voice == 'zh-CN-YunyeNeural'){
//angry, calm, cheerful, disgruntled, embarrassed, fearful, sad, serious
var style_arr = ['embarrassed', 'calm', 'fearful', 'cheerful', 'disgruntled', 'serious', 'angry', 'sad'];
var role_arr = ['YoungAdultFemale', 'YoungAdultMale', 'OlderAdultFemale', 'OlderAdultMale', 'SeniorFemale', 'SeniorMale', 'Girl', 'Boy'];
}else if(voice == 'zh-CN-YunzeNeural'){
//angry, calm, cheerful, depressed, disgruntled, documentary-narration, fearful, sad, serious
var style_arr = ['calm', 'fearful', 'cheerful', 'disgruntled', 'serious', 'angry', 'sad', 'depressed', 'documentary-narration'];
// OlderAdultMale, SeniorMale
var role_arr = ['OlderAdultMale','SeniorMale'];
}else if(language.includes('中文')){
//calm, fearful, cheerful, disgruntled, serious, angry, sad, depressed, documentary-narration
var style_arr = [];
// OlderAdultMale, SeniorMale
var role_arr = [];
}else{
var style_arr = ['affectionate', 'angry', 'assistant', 'calm', 'chat', 'cheerful', 'customerservice', 'depressed', 'disgruntled', 'embarrassed', 'empathetic', 'envious', 'fearful', 'gentle', 'lyrical', 'narration-professional', 'narration-relaxed', 'newscast', 'newscast-casual', 'newscast-formal', 'sad', 'serious', 'shouting', 'advertisement-upbeat', 'gentle', 'sports-commentary', 'sports-commentary-excited', 'whispering', 'terrified', 'unfriendly'];
var role_arr = ['YoungAdultFemale', 'YoungAdultMale', 'OlderAdultFemale', 'OlderAdultMale', 'SeniorFemale', 'SeniorMale', 'Girl', 'Boy'];
}
for (i = 0; i < style_arr.length; i++) {
$("#style").append(style_arr_all[style_arr[i]]);
}
for (i = 0; i < role_arr.length; i++) {
$("#role").append(role_arr_all[role_arr[i]]);
}
};
var locationHref = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
var user_id = '';
locationHref.forEach(function (val) {
var parameter = val.slice(0, val.indexOf('=')); //属性
var data = val.slice(val.indexOf('=') + 1); //值
if(parameter == 'user_id'){
user_id = data;
}
})
if (!user_id || typeof(user_id)=="undefined"){
var gonggao2 = document.getElementById("gonggao2");
gonggao2.style.display="";
}else{
var gonggao = document.getElementById("gonggao");
gonggao.style.display="";
}
$("#play").attr({"disabled":"disabled"});
$("#pause").attr({"disabled":"disabled"});
$("#download").attr({"disabled":"disabled"});
$("#look").attr({"disabled":"disabled"});
var p = document.getElementById("language");
var c = document.getElementById("voice");
var data = '';
var language_cookie;
var voice_cookie;
var kbitrate;
var role;
var style;
var speed;
var pitch;
$.ajax({
type:"POST",
url:"/getSpeekList.php",
datatype:"JSON",
async:false,
data:{},
success:function(msg){
data = JSON.parse(msg);
//读cookie写默认配置
var str = document.cookie;
//将值切割成数组
var arr = str.split(";");
//遍历数组
for(var i=0;i<arr.length;i++){
var value = arr[i].split("=");
if(value[0] == ' language'){
language_cookie = value[1];
}
if(value[0] == ' voice'){
voice_cookie = value[1];
}
if(value[0] == ' kbitrate'){
kbitrate = value[1];
}
if(value[0] == ' role'){
role = value[1];
}
if(value[0] == ' style'){
style = value[1];
}
if(value[0] == ' speed'){
speed = value[1];
}
if(value[0] == ' pitch'){
pitch = value[1];
}
}
for(let i in data){
//console.log(data[i].LocalName)
var optionP = document.createElement("option");
optionP.innerHTML = i;
optionP.value = i;
if(optionP.innerHTML == language_cookie){
optionP.selected=true;
}else if(optionP.innerHTML == "中文(普通话,简体)"){
optionP.selected=true;
}
p.appendChild(optionP);
}
}
});
var kbitrateSel = $("#kbitrate > option");
for (let i = 0; i < kbitrateSel.length; i++) {
let item = kbitrateSel[i].value;
if (kbitrate == item) {
$("#kbitrate option[value='" + item + "']").attr("selected", "selected");
}
}
var roleSel = $("#role > option");
for (let i = 0; i < roleSel.length; i++) {
let item = roleSel[i].value;
if (role == item) {
$("#role option[value='" + item + "']").attr("selected", "selected");
}
}
var styleeSel = $("#style > option");
for (let i = 0; i < styleeSel.length; i++) {
let item = styleeSel[i].value;
if (style == item) {
$("#style option[value='" + item + "']").attr("selected", "selected");
}
}
if (!isNaN(speed) && typeof(speed)!="undefined" && speed!=0){
$("#speed").text(speed*1);
}
if (!isNaN(pitch) && typeof(pitch)!="undefined" && pitch!=0){
$("#pitch").text(pitch*1);
}
window.onload = function(){
p.dispatchEvent(new Event('change'));
};
//一级select状态发生变化时 获取一级选项对应的内容 填入 二级select
p.onchange = function () {
var obj = document.getElementById("voice");
obj.options.length = 0;
var index=p.selectedIndex;
if(p.options[index].value=="请选择语言(必选)"){
var ele=document.createElement("option");
ele.innerHTML="请选择语音(必选)"
c.appendChild(ele);
}else{
for(let i in data[p.options[index].value].LocalName){
var option_city = document.createElement("option");
option_city.innerHTML =data[p.options[index].value].LocalName[i];
if(data[p.options[index].value].ShortName[i] == voice_cookie){
option_city.selected=true;
}
option_city.value = data[p.options[index].value].ShortName[i];
c.appendChild(option_city);
}
checkRoleStyle();
}
}
var download_url = "";
//试听
$("#audition").click(function () {
$("#myaudio")[0].pause();
$("#play").attr({"disabled":"disabled"});
$("#pause").attr({"disabled":"disabled"});
$("#download").attr({"disabled":"disabled"});
$("#look").attr({"disabled":"disabled"});
if($("#language").val() == "请选择语言(必选)" || $("#voice").val() == "请选择语音(必选)"){
alert("请先选择语言和语音");
}else{
var language=$("#language").val();
var voice=$("#voice").val();
var text=$("#text").val();
var n=text.indexOf("");
if(n == -1){
n=text.indexOf("\n");
}
text = text.slice(0, n);
var role=$("#role").val();
var style=$("#style").val();
var rate=$("#speed").html();
var pitch=$("#pitch").html();
var kbitrate=$("#kbitrate").val();
var silence=$("#silence").val();
var styledegree=$("#styledegree").val();
$.ajax({
type:"POST",
url:"/getSpeek.php",
datatype:"JSON",
data:{language:language,voice:voice,text:text,role:role,style:style,styledegree:styledegree,rate:rate,pitch:pitch,kbitrate:kbitrate,silence:silence,user_id:user_id},
success:function(msg){
var jsonObj = JSON.parse(msg);
//$("#btnUpdate").html("生成");
if(jsonObj.code == 200){
// 生成成功将记录使用的语言10天
var expires = new Date();
// 先清空在写入
var keys = document.cookie.match(/[^ =;]+(?=\=)/g);
if (keys) {
for (var i = keys.length; i--;) {
document.cookie = keys[i] + '=0;path=/;expires=' + new Date(0).toUTCString();
document.cookie = keys[i] + '=0;path=/;domain=' + document.domain + ';expires=' + new Date(0).toUTCString();
document.cookie = keys[i] + '=0;path=/;domain=kevis.com;expires=' + new Date(0).toUTCString();
}
}
expires.setTime(expires.getTime()+10*24*60*60*1000);
document.cookie = "language="+language+";expires="+expires.toGMTString();
document.cookie = "voice="+voice+";expires="+expires.toGMTString();
document.cookie = "kbitrate="+kbitrate+";expires="+expires.toGMTString();
document.cookie = "role="+role+";expires="+expires.toGMTString();
document.cookie = "style="+style+";expires="+expires.toGMTString();
document.cookie = "speed="+rate+";expires="+expires.toGMTString();
document.cookie = "pitch="+pitch+";expires="+expires.toGMTString();
download_url = jsonObj.download;
$("#myaudio").attr('src',download_url);
$("#myaudio")[0].play();
}else if(jsonObj.code == 401){
$('#exampleModal').modal('show');
}else{
toastr.error("生成失败,一键整理后再生成试试吧。");
}
},
error:function(){
toastr.error("生成失败,一键整理后再生成试试吧。");
}
});
}
});
//生成
$("#btnUpdate").click(function () {
// 生成时区分多语言
if(duoyuyan){
$("#btnUpdate").html('<span class="spinner-grow spinner-grow-sm"></span>生成中');
var text_arr = [];
$("#div_text input[type=text]").each(function () {
text_arr.push(this.id+'@@@@@'+this.value);
})
var moxing_arr = [];
$("#div_text select").each(function () {
moxing_arr.push(this.id+'@@@@@'+this.value);
})
var language=$("#language").val();
var voice=$("#voice").val();
var text=$("#text").val();
var role=$("#role").val();
var style=$("#style").val();
var rate=$("#speed").html();
var pitch=$("#pitch").html();
var kbitrate=$("#kbitrate").val();
var silence=$("#silence").val();
var styledegree=$("#styledegree").val();
$.ajax({
type:"POST",
url:"/getSpeek.php",
datatype:"JSON",
data:{duoyuyan:"true",text_arr:text_arr,moxing_arr:moxing_arr,language:language,voice:voice,text:text,role:role,style:style,rate:rate,pitch:pitch,kbitrate:kbitrate,silence:silence,styledegree:styledegree,user_id:user_id},
success:function(msg){
var jsonObj = JSON.parse(msg);
//$("#btnUpdate").html("生成");
if(jsonObj.code == 200){
$("#Tips").attr('src',success_wav);
$("#Tips")[0].play();
toastr.success(jsonObj.msg);
$("#btnUpdate").html("生成");
// 生成成功将记录使用的语言10天
var expires = new Date();
// 先清空在写入
var keys = document.cookie.match(/[^ =;]+(?=\=)/g);
if (keys) {
for (var i = keys.length; i--;) {
document.cookie = keys[i] + '=0;path=/;expires=' + new Date(0).toUTCString();
document.cookie = keys[i] + '=0;path=/;domain=' + document.domain + ';expires=' + new Date(0).toUTCString();
document.cookie = keys[i] + '=0;path=/;domain=kevis.com;expires=' + new Date(0).toUTCString();
}
}
expires.setTime(expires.getTime()+10*24*60*60*1000);
document.cookie = "language="+language+";expires="+expires.toGMTString();
document.cookie = "voice="+voice+";expires="+expires.toGMTString();
document.cookie = "kbitrate="+kbitrate+";expires="+expires.toGMTString();
document.cookie = "role="+role+";expires="+expires.toGMTString();
document.cookie = "style="+style+";expires="+expires.toGMTString();
document.cookie = "speed="+rate+";expires="+expires.toGMTString();
document.cookie = "pitch="+pitch+";expires="+expires.toGMTString();
$("#play").removeAttr("disabled");
$("#pause").removeAttr("disabled");
$("#download").removeAttr("disabled");
$("#look").removeAttr("disabled");
download_url = jsonObj.download;
$("#myaudio").attr('src',download_url);
}else if(jsonObj.code == 401){
$("#Tips").attr('src',error_wav);
$("#Tips")[0].play();
$('#exampleModal').modal('show');
}else{
$("#Tips").attr('src',error_wav);
$("#Tips")[0].play();
$("#btnUpdate").html('生成失败');
toastr.error("生成失败,一键整理后再生成试试吧。");
}
},
error:function(){
$("#Tips").attr('src',error_wav);
$("#Tips")[0].play();
$("#btnUpdate").html("生成失败");
toastr.error("生成失败,一键整理后再生成试试吧。");
}
})
}else{
$("#myaudio")[0].pause();
$("#play").attr({"disabled":"disabled"});
$("#pause").attr({"disabled":"disabled"});
$("#download").attr({"disabled":"disabled"});
$("#look").attr({"disabled":"disabled"});
if($("#language").val() == "请选择语言(必选)" || $("#voice").val() == "请选择语音(必选)"){
toastr.error("请先选择语言和语音");
}else{
$("#btnUpdate").html('<span class="spinner-grow spinner-grow-sm"></span>生成中');
var language=$("#language").val();
var voice=$("#voice").val();
var text=$("#text").val();
var role=$("#role").val();
var style=$("#style").val();
var rate=$("#speed").html();
var pitch=$("#pitch").html();
var kbitrate=$("#kbitrate").val();
var silence=$("#silence").val();
var styledegree=$("#styledegree").val();
$.ajax({
type:"POST",
url:"/getSpeek.php",
datatype:"JSON",
data:{language:language,voice:voice,text:text,role:role,style:style,rate:rate,pitch:pitch,kbitrate:kbitrate,silence:silence,styledegree:styledegree,user_id:user_id},
success:function(msg){
var jsonObj = JSON.parse(msg);
//$("#btnUpdate").html("生成");
if(jsonObj.code == 200){
$("#Tips").attr('src',success_wav);
$("#Tips")[0].play();
toastr.success(jsonObj.msg);
$("#btnUpdate").html("生成");
// 生成成功将记录使用的语言10天
var expires = new Date();
// 先清空在写入
var keys = document.cookie.match(/[^ =;]+(?=\=)/g);
if (keys) {
for (var i = keys.length; i--;) {
document.cookie = keys[i] + '=0;path=/;expires=' + new Date(0).toUTCString();
document.cookie = keys[i] + '=0;path=/;domain=' + document.domain + ';expires=' + new Date(0).toUTCString();
document.cookie = keys[i] + '=0;path=/;domain=kevis.com;expires=' + new Date(0).toUTCString();
}
}
expires.setTime(expires.getTime()+10*24*60*60*1000);
document.cookie = "language="+language+";expires="+expires.toGMTString();
document.cookie = "voice="+voice+";expires="+expires.toGMTString();
document.cookie = "kbitrate="+kbitrate+";expires="+expires.toGMTString();
document.cookie = "role="+role+";expires="+expires.toGMTString();
document.cookie = "style="+style+";expires="+expires.toGMTString();
document.cookie = "speed="+rate+";expires="+expires.toGMTString();
document.cookie = "pitch="+pitch+";expires="+expires.toGMTString();
$("#play").removeAttr("disabled");
$("#pause").removeAttr("disabled");
$("#download").removeAttr("disabled");
$("#look").removeAttr("disabled");
download_url = jsonObj.download;
$("#myaudio").attr('src',download_url);
}else if(jsonObj.code == 401){
$("#Tips").attr('src',error_wav);
$("#Tips")[0].play();
$('#exampleModal').modal('show');
}else{
$("#Tips").attr('src',error_wav);
$("#Tips")[0].play();
$("#btnUpdate").html('生成失败');
toastr.error("生成失败,一键整理后再生成试试吧。");
}
},
error:function(){
$("#Tips").attr('src',error_wav);
$("#Tips")[0].play();
$("#btnUpdate").html("生成失败");
toastr.error("生成失败,一键整理后再生成试试吧。");
}
})
}
}
});
//ssml生成
$("#btnUpdateByssml").click(function () {
$("#myaudio")[0].pause();
$("#btnUpdateByssml").html('<span class="spinner-grow spinner-grow-sm"></span>生成中');
var text=$("#text").val();
var kbitrate=$("#kbitrate").val();
$.ajax({
type:"POST",
url:"/getSpeek.php",
datatype:"JSON",
data:{type:"SSML",text:text,kbitrate:kbitrate,user_id:user_id},
success:function(msg){
var jsonObj = JSON.parse(msg);
$("#btnUpdateByssml").html("SSML生成");
if(jsonObj.code == 200){
$("#Tips").attr('src',success_wav);
$("#Tips")[0].play();
toastr.success(jsonObj.msg);
$("#btnUpdateByssml").html("SSML生成");
$("#play").removeAttr("disabled");
$("#pause").removeAttr("disabled");
$("#download").removeAttr("disabled");
$("#look").removeAttr("disabled");
download_url = jsonObj.download;
$("#myaudio").attr('src',download_url);
}else if(jsonObj.code == 401){
$("#Tips").attr('src',error_wav);
$("#Tips")[0].play();
$('#exampleModal').modal('show');
}else{
$("#Tips").attr('src',error_wav);
$("#Tips")[0].play();
toastr.error(jsonObj.msg);
$("#btnUpdateByssml").html('生成失败');
}
},
error:function(){
$("#Tips").attr('src',error_wav);
$("#Tips")[0].play();
toastr.error(jsonObj.msg);
$("#btnUpdateByssml").html("生成失败");
}
})
});
function play(type) {
if(type == 'pause'){
$("#myaudio")[0].pause();
}else{
$("#myaudio")[0].play();
}
}
$("#download").click(function () {
$("#download").html('<span class="spinner-border spinner-border-sm"></span>下载中');
if(download_url != ''){
//window.open(download_url);
downloadMp3(download_url);
}else{
$("#download").html('下载');
alert("无可下载文件");
}
});
$("#look").click(function () {
if(download_url != ''){
window.open(download_url);
}else{
alert("无可下载文件");
}
});
var old_text = '';
function toggel() {
var qh_type=$("#qh_type").val();
$.ajax({
type:"POST",
url:"/moxing.php",
datatype:"JSON",
data:{type:'get',user_id:user_id},
success:function(msg){
var jsonObj = JSON.parse(msg);
if(jsonObj.code == 200){
var moxing = jsonObj.msg;
if(moxing.length == 0){
toastr.error("请先设置模型");
return false;
}
duoyuyan = true;
$("#audition").attr({"disabled":"disabled"});
$("#btnUpdateByssml").attr({"disabled":"disabled"});
var text = document.getElementById("text").value;
old_text = text;
$.ajax({
type:"POST",
url:"/toggel.php",
datatype:"JSON",
data:{text:text,qh_type:qh_type},
success:function(msg){
var jsonObj = JSON.parse(msg);
if(jsonObj.code == 200){
var text_arr = jsonObj.msg;
var html = '<div class="col-md-12" style="padding-left: 0px;overflow-y: scroll;height: 533px; !important">';
var option = '<option value="now">当前</option>';
$.each(moxing, function (i, item) {
var item = JSON.parse(item);
option += '<option value="'+item.moxing_name+'">'+item.moxing_name+'</option>';
});
$.each(text_arr, function (i, item) {
html += '<div class="form-row"><div class="form-group col-md-10"><input type="text" class="form-control" id=\"text_'+i+'\" value=\"'+item+'\"></div><div class="form-group col-md-2"><select id=\"moxing_'+i+'\" class="form-control">'+option+'</select></div></div>';
});
html += '</div>';
html += '<div class="form-group form-inline" style="display: block;"><button type="button" class="btn btn-secondary btn-sm" onclick="fanhui()">返回<!--{en}return--></button>';
$("#div_text").html(html);
}
}
});
}else{
toastr.error("目前只支持授权用户使用此功能");
}
}
});
}
function fanhui() {
duoyuyan = false;
$("#audition").removeAttr("disabled");
$("#btnUpdateByssml").removeAttr("disabled");
var text = old_text;
var html = '<textarea class="form-control" rows="20" id="text" onkeyup="countContent(this)" style="height: 533px; !important">'+text+'</textarea><div class="form-group form-inline" style="display: block;"><div class="input-group" style="display: inline-flex;"><input type="text" id="qh_type" class="form-control" placeholder="多语言切换分隔符" aria-describedby="button-addon4" style="height: 30px;"><div class="input-group-append" id="button-addon4" style="height: 30px;"><button type="button" class="btn btn-secondary btn-sm" onclick="toggel()" id="toggel">多语言切换<!--{en}toggel--></button>&nbsp;&nbsp;<button type="button" class="btn btn-secondary btn-sm" onclick="arrange()" id="arrange">一键整理<!--{en}reorganize--></button>&nbsp;&nbsp;<button type="button" class="btn btn-secondary btn-sm" onclick="deltext()" id="deltext">一键清除<!--{en}Clear--></button></div></div><p style="float: right;"><span id="content_num">0</span>/<span>无限制<!--{en}unlimited--></span></p></div>';
$("#div_text").html(html);
}
// 整理
function arrange() {
var body = "\n" + document.getElementById("text").value;
body = body.replace(/<\/?a[^>]*>/ig, ""); //去除a
body = body.replace(/<p>(&nbsp;|\s)*<\/p>/g, "");
body = body.replace(/^\s*/gm, "");
body = body.replace(/&nbsp;/g, "");
$.ajax({
type:"POST",
url:"/arrange.php",
datatype:"JSON",
async:false,
data:{text:body},
success:function(msg){
document.getElementById("text").value = msg;
}
});
}
// 清除
function deltext() {
$("#text").val("");
}
function downloadMp3_1(filePath) {
fetch(filePath).then(res => res.blob()).then(blob => {
const a = document.createElement('a');
document.body.appendChild(a)
a.style.display = 'none'
const url = window.URL.createObjectURL(blob);
a.href = url;
a.download = filePath;
a.click();
document.body.removeChild(a)
window.URL.revokeObjectURL(url);
$("#download").html('下载');
});
}
function downloadMp3(url) {
var hz = '';
if (url.includes('wav')) {
hz = ".wav";
}
var filename = (new Date()).valueOf();
var downloadLink = document.createElement('a');
downloadLink.setAttribute('href', url);
downloadLink.setAttribute('download', filename+hz);
downloadLink.style.display = 'none';
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
$("#download").html('下载');
}
function downloadMp3_2(url) {
var filename = (new Date()).valueOf();
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob';
xhr.onload = function() {
if (xhr.status === 200) {
var blob = xhr.response;
var downloadLink = document.createElement('a');
downloadLink.href = URL.createObjectURL(blob);
downloadLink.download = filename;
downloadLink.style.display = 'none';
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
}
}
xhr.send();
}
function countContent(input) {
// 获取要显示已经输入字数文本框对象
var content = document.getElementById('content_num');
if (content && input) {
// 获取输入框输入内容长度并更新到界面
var value = input.value;
// 将换行符不计算为单词数
value = value.replace(/\n|\r/gi, "");
// 更新计数
content.innerText = value.length;
}
}
</script>
</body>
</html>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册