2017-04-05
我毕设合成效果不好。
老师让我再找找tts的
我原先使用的是微软的
我的电脑只有女生版本的。
目前要用百度语音的--设想阶段。
不知道会不会成功。
百度那边是安卓和ios还有在线rest spi
前两者我没有接触过。目前瞄准rest spi
根据html的请求。matab 中有urlread()函数
我没有使用过,所以对于我来说是试验阶段。
其实一开始我是想通过网络编程socket获取的。
但是关于html的协议等内容我目前没有写过。
而且我看那边也没有写明端口等格式信息。
--试验阶段。若成功或许提供部分参考代码
2017-=04-06
目前百度的文档页面http://yuyin.baidu.com/docs/tts/136
--当前阶段成功获得tok值
--传英文获得数据串,但是存在被urlread 转换为UTF-8造成数据丢失的问题
--传汉字还没有成功,urlencode('清')),当前使用的代理服务器,请求失败。需要没有使用代理服务器再进行设置。
--由于数据是二进制,想采用latin1 http://www.cp1252.com/ 代替UTF-8,试验中--简单加到Value里面失败,有志者可以尝试修改
合成成功
主要代码用于我的毕设中,部分代码注释整理以后在整合出来贴于次博客。最晚周末整一下。
xjy='你好'
URL='http://tsn.baidu.com/text2audio';
Name='get';
Value={
'tex',urlencode(xjy),...
'lan','zh',...
'cuid','AC-16-2D-52-BA-27',...
'ctp','1',...
'tok',tok,...
'per',num2str(girl)};
[fullfilepath,status] = urlwrite(URL,'aa.mp3',Name,Value);
20200429 跟新一下最终版本 ,保持和毕设的那篇博文一致
function [y,fs2] = lrcttsV3(words,choice)
%lrxtts
%文语转换,需要联网使用,毕设中采用16000Hz,choice可使用0为女声,1为男声,3为情感合成-度逍遥,4为情感合成-度丫丫
%输入
% words 字符串'待转换字'
% support by 百度REST API
%注释:代码中用于获取tok利用我在百度语音申请的api key和secret key。时间就了百度改版或我取消应用将不能使用过
%designed by Xu__Jiayu
%%
%0为女声,1为男声,3为情感合成-度逍遥,4为情感合成-度丫丫
%默认参数
y=[];
words2=[];
%fs2=16000;%百度目前提供的只有16000Hz和8000Hz --20170406
girl=0;%根据百度rest设置
%khz='k44';
%%
%输入参数重置
if nargin>0
words2=words;
end
%{
if nargin>1&&~isempty(fs)&&ismember(fs,[8000 16000]);
fs2=fs;
%khz=sprintf('k%i',fix(fs/1000)); ismember(fs,[11025 12000 16000 22050 24000 32000 44100 48000]);
end
%}
if nargin>1&&~isempty(choice)&&ismember(choice,[1,3,4]);
girl=choice;
end
%%
[tokt,stat]=gettok;
if 1==stat
tok=tokt;
else
tok='24.a702efee9c534e4cad0723332a6d76ed.2592000.1493996778.282335-9481503';
end
%http://tsn.baidu.com/text2audio?tok=24.a702efee9c534e4cad0723332a6d76ed.2592000.1493996778.282335-9481503&tex=清&lan=zh&cuid=AC-16-2D-52-3A-27&ctp=1&
[filepath,status]=getfile(words2,girl,tok);
if status
[y,fs2]=lrcreadwav(filepath);
end
%{
[vadgate,~]=vadsohn(y3,fs2);
index=find(vadgate);%有生部分
x= y3(index(1):index(end),1); % Make sure it is a comum vector.取单声道
%}
%sound(x,fs2); % Playback sound播放
%%
%out
end
function [filepath,status]=getfile(words2,girl,tok)
URL='http://tsn.baidu.com/text2audio';
Name='get';
Value={
'tex',char(java.net.URLEncoder.encode(words2,'UTF-8')),...
'lan','zh',...
'cuid','AC-16-2D-52-3A-27',...
'ctp','1',...
'tok',tok,...
'spd','5',...%语速0-9
'pit','7',...%音调0-9
'vol','9',...%音量0-9
'per',num2str(girl)};%角色0,1,3,4
[filepath,status] = urlwrite(URL,'UI.mp3',Name,Value);
if(isempty(filepath)||0==status)
disp('请求音频失败');
err= MException('MATLAB:rmpath:DirNotFound','%s没联网','lrcttsV3.m');
throw(err);
else
status=1;
disp('请求成功');
end
end
function [tok,stat]=gettok
%get tok
%联系百度帐号 xujiayuxjy
%App ID: 9481503
%API Key: OWhu33XDY3iBKhPrwBiq8sro
%Secret Key: fe8c59147f5a1fde9a8067b6fde07db7
%利用post请求方式,获取百度自己内置的access_token。
%这个一段时间access_token百度内部数据库就会更新。因此采用随用随获取。如果要更细致减少使用许另外设置参数判断是否更新
%via by Xu__Jiayu
tok=[];
stat=0;
URL='https://openapi.baidu.com/oauth/2.0/token';
Name='post';%请求数据不在url出的post请求方法
requestHead={'grant_type','client_credentials',...
'client_id','OWhu33XDY3iBKhPrwBiq8sro',...
'client_secret','fe8c59147f5a1fde9a8067b6fde07db7'};
[tok,status]= urlread(URL,Name,requestHead);
if(1==status)
if isempty(strfind(tok,'access_token'))
disp('请求成功,但是没有获取到tok');
else
stat=1;
index=strfind(tok,'"');
if length(index)>3
tok=tok(index(3)+1:index(4)-1);%根据当前百度设置的json格式,简单获取需要的tok
end
end
else
disp('请求失败');
end
end
%%
%编写试验代码中使用过的函数
%[status,cmdout] = dos('getmac');
%currentCharacterEncoding = slCharacterEncoding()
%[str,status]= urlread(URL,Name,Value);
%[f,status] = urlwrite(url,filename,varargin)
%bytes=unicode2native(words2, 'UTF-8');%由获得utf-8的字节编码
%words=dec2hex(bytes);
%words=native2unicode(bytes, 'UTF-8');
%urlencode(urlIn)
%d = hex2dec()
%fid=fopen('p.mp3','wb');
%fprintf(fid,'%c',str-0);
%fclose(fid);
%bytes=unicode2native(str,'UTF-8');%由获得utf-8的字节编码
%{
Value={
'tex',urlencode(words2),...
'lan','zh',...
'cuid','AC-16-2D-52-3A-27',...
'ctp','1',...
'tok',tok,...
'spd','4',...%语速0-9
'pit','5',...%音调0-9
'vol','9',...%音量0-9
'per',num2str(girl)};%角色0,1,3,4
edit urlencode
java.net.URLEncoder.encode('好','UTF-8')
ans =
%E5%A5%BD
get(ans)
Bytes: [9x1 int8]
Class: [1x1 java.lang.Class]
Empty: 0
get(ans,'Bytes')
%}