请问 SAPI5.1 控件能不能 直接 将 "文本" 生成 "wav语音文件" ,就是不进行朗读的过程而是 直接 将 "文本" 生成 "wav语音文件"  !!!!!!!!!!!!!!!!!

解决方案 »

  1.   

    2年前的东东,很烂的,但是可以让你知道如何从文本直接生成WAV声音文件。
    e-Mail:[email protected] TForm1.bsSkinButton2Click(Sender: TObject);
    var
      jieguo:integer;
      rom:string;
     s:string;//存放待分析的文本内容
     d1:string;
     z:string;//存放临时字符
     l:integer;//s字符串的长度
     i:integer;//
     o:integer;
     times:integer;//文本转为音频文件时估计的用时
    begin
     p:=100;
     if richedit1.Text<>'' then
      begin
      ////////////////////////////////////////////////////////////////////////
      if czwbt.Checked then rom:='您确认要以【纯中文】模式' else
      if cywbt.Checked then rom:='您确认要以【纯英文】模式' else
      if zyhhbt.Checked then rom:='您确认要以【中英混合】模式';
      if radiobutton1.Checked then rom:=rom+'【慢语速】以【'+yinpin+'】输出音频文件吗?' else
      if radiobutton2.Checked then rom:=rom+'【中语速】以【'+yinpin+'】输出音频文件吗?' else
      if radiobutton3.Checked then rom:=rom+'【快语速】以【'+yinpin+'】输出音频文件吗?';
     jieguo:=messageDlg(rom,mtConfirmation,[mbyes,mbcancel],0);
     case jieguo of
      2: exit;
      6://////////////////////////确认转换///////////////////////////////////////
       /////纯中文模式开始
        if czwbt.Checked then 
         begin
         s:=richedit1.Text;
         l:=length(s);
         l:=l div 2;//全角字符的长度
         times:=(l*6) div 1000;//单位为秒
         showmessage('转换可能要花'+inttostr(times)+'秒(≈'+inttostr(times div 60)+'分)钟,转换时请耐心等待!');
         //注:此处若不将之转换为全角,则TTS会读为"点"
         s:=StringReplace(s,'.','。',[rfReplaceAll, rfIgnoreCase]);
        savedialog1.Filter:='Wave files(*.wav)|*.wav';
        savedialog1.FilterIndex:=1;
       if savedialog1.Execute then
       begin
        spfilestream1.Format.Type_:=flatcombobox2.ItemIndex;
        spfilestream1.Open(savedialog1.FileName+'.wav',SSFMCreateForWrite,False);
        spvoice1.AllowAudioOutputFormatChangesOnNextSet:=false;
        spvoice1.AudioOutputStream:=spfilestream1.DefaultInterface;
        spvoice1.Speak('<LANG LANGID="804">'+s,1);
        spvoice1.WaitUntilDone(-1);
        spfilestream1.Close;
        showmessage('文本已成功转换为声音文件,并存放在'+savedialog1.FileName);   end;
       end
       else
       /////纯中文模式结束
      ///////////////////////////////////////////////////////////////////////////
      ///////纯英文模式开始
      if cywbt.Checked then
       begin
        savedialog1.Filter:='Wave files(*.wav)|*.wav';
        savedialog1.FilterIndex:=1;
       if savedialog1.Execute then
       begin
        spfilestream1.Format.Type_:=flatcombobox2.ItemIndex;
        spfilestream1.Open(savedialog1.FileName+'.wav',SSFMCreateForWrite,False);
        spvoice1.AllowAudioOutputFormatChangesOnNextSet:=false;
        spvoice1.AudioOutputStream:=spfilestream1.DefaultInterface;
        spvoice1.Speak('<LANG LANGID="409">'+richedit1.Text,1);
        spvoice1.WaitUntilDone(-1);
        spfilestream1.Close;
        showmessage('文本已成功转换为声音文件,并存放在'+savedialog1.FileName);
        end;
       end
       else
      ///////纯英文模式结束
      ///////////////////////////////////////////////////////////////////////////
      ///////////////////////////////////////////////////////////////////////////
      ///////////////////////////////////////////////////////////////////////////
      
     end;
     end;
     end;
     end
     else
     showmessage('待转换的文本内容不能为空!');
     end;