MS Speech SDK 5.1讀取繁體中文無法順利讀出全部字串 |
尚未結案
|
mind9sky
一般會員 發表:1 回覆:4 積分:1 註冊:2003-04-03 發送簡訊給我 |
各位大大好:
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 發送簡訊給我 |
由於繁體中文轉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 發送簡訊給我 |
這個方法我試了一下,轉換後簡體與繁體的發音都相同(如下之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 發送簡訊給我 |
引言: 這個方法我試了一下,轉換後簡體與繁體的發音都相同(如下之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 發送簡訊給我 |
感謝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.
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |