首页 > 学院 > 开发设计 > 正文

matlab工具箱TTSBOX源码中文分析

2019-11-10 17:09:09
字体:
来源:转载
供稿:网友
function wav = tts(txt,voice,pace,fs)%TTS text to speech.%   TTS (TXT) synthesizes speech from string TXT, and speaks it. The audio%   format is mono, 16 bit, 16k Hz by default.%   %   WAV = TTS(TXT) does not vocalize but output to the variable WAV.%%   TTS(TXT,VOICE) uses the specific voice. Use TTS('','List') to see a%   list of availble voices. Default is the first voice.%%   TTS(...,PACE) set the pace of speech to PACE. PACE ranges from %   -10 (slowest) to 10 (fastest). Default 0.%%   TTS(...,FS) set the sampling rate of the speech to FS kHz. FS must be%   one of the following: 8000, 11025, 12000, 16000, 22050, 24000, 32000,%       44100, 48000. Default 16.%   %   This function requires the Microsoft Win32 Speech API (SAPI).%%   Examples:%       % Speak the text;%       tts('I can speak.');%       % List availble voices;%       tts('I can speak.','List');%       % Do not speak out, store the speech in a variable;%       w = tts('I can speak.',[],-4,44100);%       wavplay(w,44100);%%   See also WAVREAD, WAVWRITE, WAVPLAY.% Written by Siyi Deng; 12-21-2007;if ~ispc, error('Microsoft Win32 SAPI is required.'); endif ~ischar(txt), error('First input must be string.'); endSV = actxserver('SAPI.SpVoice');%创建一个object对象COM.SAPI_SpVoiceTK = invoke(SV,'GetVoices');%创建一个object对象Interface.928....if nargin > 1   %判断参数多余一个 % Select voice;%根据文字选择中文发音对象或者英文发音对象。或这系统中的其他国家语言发音对象    for k = 0:TK.Count-1        if strcmpi(voice,TK.Item(k).GetDescription)            SV.Voice = TK.Item(k);            break;        elseif strcmpi(voice,'list')            disp(TK.Item(k).GetDescription);        end    end    % Set pace;    if nargin > 2        if isempty(pace), pace = 0; end %如果pace为空那么默认不加速        if abs(pace) > 10, pace = sign(pace)*10; end %如果加/减速大于10那么只取左右端的极限               SV.Rate = pace;%接口语音速率设置    endendif nargin < 4 || ~ismember(fs,[8000,11025,12000,16000,22050,24000,32000,...        44100,48000]), fs = 16000; end %如果没有采样频率或者采样频率取值不再规定成员里面,那么使用默认值 16kHzif nargout > 0  %如果函数有输入参数   % Output variable;   MS = actxserver('SAPI.SpMemoryStream');%创建COM.API_SpMemoryStream对象   MS.Format.Type = sPRintf('SAFT%dkHz16BitMono',fix(fs/1000));%设置语音生成频率kHz  fix(fs/1000)取商部分   SV.AudioOutputStream = MS;  %把生成接口MS生成的语音流<-连接->SVobject输出对象endinvoke(SV,'Speak',txt);%调用COM的服务对象[SV]使用方法['Speak']处理文本数据[txt]if nargout > 0 %r如果函数有输入数据    % Convert uint8 to double precision;    wav = reshape(double(invoke(MS,'GetData')),2,[])';%invoke(MS,'GetData')调用返回矩阵信息%根据数据把数据填成提取[2,:]矩阵先列后行,奇数提取,偶数提取    wav = (wav(:,2)*256+wav(:,1))/32768;%2字节提取,归一化计算获得单声道wav文件 2^16=32768 (量化16位)    wav(wav >= 1) = wav(wav >= 1)-2;%处理数据后大于等于1的相当于对值为复数的进行处理%16bit =2字节。小端模式(低字节 高字节)%存放数据在电脑中用补码表示,%样例: 05 34 =0 0110100 00000101 显然符号位0为正数(正数三码一样)值为0x(3405)% 05 80=1 0000000 00000101显然符号位1为负数,值为5-32768    delete(MS);%释放空间    clear MS;enddelete(SV); %释放空间clear SV TK;pause(0.2);end % TTS;
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表