matlab_tts更改为在线获取百度语音合成

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')
 
 
%}

 

你可能感兴趣的:(matlab)