全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3047
推到 Plurk!
推到 Facebook!

MS Speech SDK 5.1讀取繁體中文無法順利讀出全部字串

尚未結案
mind9sky
一般會員


發表:1
回覆:4
積分:1
註冊:2003-04-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-25 17:17:42 IP:210.63.xxx.xxx 未訂閱
各位大大好: MS Speech SDK 5.1上說明只支援簡體中文,於是乎我將big5轉為gb後送給spvoice.speak去朗讀,但是尚未轉換為gb時,大約可以讀出6成的繁體字,變成簡體字後卻無法讀出,請各位大大幫忙,附上原始碼如下: unit sapi11; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleServer, SpeechLib_TLB; type TForm1 = class(TForm) SpVoice1: TSpVoice; Button1: TButton; Memo1: TMemo; Memo2: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses cvcode; {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var ST : SpObjectToken; Spi: ISpeechObjectTokens; i : integer; ss: string; function Big5ToGB(sBig5: string): string; var ws: array[0..32767] of WideChar; s: array[0..65535] of char; begin ZeroMemory(@ws, Length(ws) * SizeOf(WideChar)); ZeroMemory(@s, Length(s) * SizeOf(char)); MultiByteToWideChar(950, MB_COMPOSITE, PChar(sBig5), -1, @ws, Length(ws)); WideCharToMultiByte(936, WC_COMPOSITECHECK, @ws, -1, @s, Length(s), '?', PBOOL(false)); result := s; end; begin spi:= SpVoice1.GetVoices('',''); for i:=0 to spi.count do begin st:= spi.item(i); if trim(st.GetDescription(i))='Microsoft Simplified Chinese' then begin spVoice1.voice:= st; //選擇簡體, //若於此時spvoice.speak繁體字可以讀出約六成的繁體字 break; end; end; memo2.Font.Charset:= 134; //'GB2312_CHARSET'; ss:=BIG5toGB(memo1.Lines.Text); //轉換為GB memo2.Lines.Add (ss); //GB顯示於memo2上 SpVoice1.Speak(ss,0); end; end. 程式有兩個memo, memo1為繁體字,memo2輸出為簡體字
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-29 15:40:57 IP:220.135.xxx.xxx 未訂閱
由於繁體中文轉UINCODE時有些字會和簡體字共用,但有有些字會對應不到簡體字 所以正確的作法應該先轉成GB碼(用cvCode單元的Big5ToGB)再轉UniCode 我直接幫你修正程式碼
....
implementation
 uses cvcode;
 {$R *.DFM}    function Big5ToGBUnicode(sBig5: string): WideString;
var  Len:integer;
begin
 sBig5 := Big5ToGB(sBig5);
 Len:=Length(sBig5) 1;
 SetLength(Result,Len);
 Len:=MultiByteToWideChar(936,0,PChar(sBig5),-1,PWideChar(Result),Len);
 SetLength(Result,Len-1); //end is #0
end;    procedure TForm1.Button1Click(Sender: TObject);
var
 ST : SpObjectToken;
 Spi: ISpeechObjectTokens;
 i : integer;
 ss: WideString;
begin
  spi:= SpVoice1.GetVoices('','');
  for i:=0 to spi.count do
  begin
   st:= spi.item(i);
   if trim(st.GetDescription(i))='Microsoft Simplified Chinese' then
   begin
    spVoice1.voice:= st; //選擇簡體,
    break;
   end;
  end;
  //memo2.Font.Charset:= 134; //'GB2312_CHARSET';
  ss:=Big5ToGBUnicode(memo1.Lines.Text); //轉換為GB
  //memo2.Lines.Add (ss); //GB顯示於memo2上
  SpVoice1.Speak(ss,0);
end;
end.         
混心雜欲 棄修身~唉
------
唉~
mind9sky
一般會員


發表:1
回覆:4
積分:1
註冊:2003-04-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-30 09:00:08 IP:210.63.xxx.xxx 未訂閱
這個方法我試了一下,轉換後簡體與繁體的發音都相同(如下之1與2), 但是皆無法完全讀出全部的字,大大是否可以幫忙再看看, 測試程式碼如下:    procedure TForm1.Button1Click(Sender: TObject); var   ST : SpObjectToken;   Spi: ISpeechObjectTokens;   i : integer;   ss: widestring; begin memo1.lines.add ('陳水扁總統今天正式宣布將參加326遊行。'); spi:= SpVoice1.GetVoices('',''); for i:=0 to spi.count do begin st:= spi.item(i); if trim(st.GetDescription(i))='Microsoft Simplified Chinese' then begin spVoice1.voice:= st; //選擇簡體 break; end; end; SpVoice1.Speak(memo1.Lines.Text,0); //***朗讀繁體字(1)*** ss:=BIG5toGBUnicode(memo1.Lines.Text); SpVoice1.Speak(ss,0); //***朗讀簡體字(2)*** end;
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-30 09:33:25 IP:220.135.xxx.xxx 未訂閱
引言: 這個方法我試了一下,轉換後簡體與繁體的發音都相同(如下之1與2), 但是皆無法完全讀出全部的字,大大是否可以幫忙再看看, 測試程式碼如下: procedure TForm1.Button1Click(Sender: TObject); var ST : SpObjectToken; Spi: ISpeechObjectTokens; i : integer; ss: widestring; begin memo1.lines.add ('陳水扁總統今天正式宣布將參加326遊行。'); spi:= SpVoice1.GetVoices('',''); for i:=0 to spi.count do begin st:= spi.item(i); if trim(st.GetDescription(i))='Microsoft Simplified Chinese' then begin spVoice1.voice:= st; //選擇簡體 break; end; end; SpVoice1.Speak(memo1.Lines.Text,0); //***朗讀繁體字(1)*** ss:=BIG5toGBUnicode(memo1.Lines.Text); SpVoice1.Speak(ss,0); //***朗讀簡體字(2)*** end;
我測過沒問題可以完全讀出,唯一的問題是把326 念成三百二十六(用空格即可解決) 你是不是原程式中忘記把BIG5toGB function砍掉(我寫的BIG5toGBUnicode是直接用cvcode單元的BIG5toGB ,而你原先程式碼中的BIG5toGB function 在轉換 過程會漏掉一些無法直接對應的字 cvcode單元 我是用kTop網上提供的檔案 如果還有問題就PO完整的檔案給我看吧 混心雜欲 棄修身~唉
------
唉~
mind9sky
一般會員


發表:1
回覆:4
積分:1
註冊:2003-04-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-30 17:38:18 IP:210.63.xxx.xxx 未訂閱
感謝SPEEDUP大大的幫忙,我將整理後完整的程式碼如下,供大家參考! unit sapi11; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleServer, SpeechLib_TLB, OleCtrls, VVUICtrl_TLB, VVWordDictCtrlLib_TLB; type TForm1 = class(TForm) SpVoice1: TSpVoice; Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses cvcode; {$R *.DFM} function Big5ToGBUnicode(sBig5: string): WideString; var Len:integer; begin sBig5 := Big5ToGB(sBig5); Len:=Length(sBig5) 1; SetLength(Result,Len); Len:=MultiByteToWideChar(936,0,PChar(sBig5),-1,PWideChar(Result),Len); SetLength(Result,Len-1); //end is #0 end; procedure TForm1.Button1Click(Sender: TObject); var ST : SpObjectToken; Spi: ISpeechObjectTokens; i : integer; ss: widestring; begin spi:= SpVoice1.GetVoices('',''); for i:=0 to spi.count do begin st:= spi.item(i); if trim(st.GetDescription(i))='Microsoft Simplified Chinese' then begin spVoice1.voice:= st; //選擇簡體 break; end; end; ss:=BIG5toGBUnicode(memo1.Lines.Text); SpVoice1.Speak(ss,0); //***朗讀簡體字*** end; end.
系統時間:2024-05-04 3:22:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!