TAgent を使って遊んでいます。
以下のようなサンプルソースを作ったのですが、
1回目と2回目の「こんにちは」の音声が違います。
1回目はたぶん男性の声、2回目は女性の声だと思われます。
ソースを見てもらえばわかるのですが、
1回目も、2回目も女性の声で発声したいのですが、
どうすればよいのでしょうか?
あと、もうひとつ、これ、D6でやっているのですが、
D7で実行するとエラーになります。
Delphi7で問題なく実行する方法教えてください。
type
TForm1 = class(TForm)
≪中略≫
private
Character: IAgentCtlCharacterEx;
end;
≪中略≫
procedure TForm1.Button1Click(Sender: TObject);
begin
Agent.Characters.Load('MyChara',
'C:\WINDOWS\MSAGENT\CHARS\Peedy.acs');
Character := Agent.Characters.Character('MyChara')
as IAgentCtlCharacterEx;
Character.Set_TTSModeID('{A778E061-A936-11d1-B17B-0020AFED142E}');
Character.Show(False);
try
Character.Speak('こんにちは', '');
Character.Speak('こんにちは', '');
finally
Character.Hide(False);
end;
end;
> Character.Set_TTSModeID('{A778E061-A936-11d1-B17B-0020AFED142E}');
おそらく先のコードが問題であると感じます。
Character.Set_TTSModeID(LowerCase('{A778E061-A936-11d1-B17B-0020AFED142E}'));
てすればどうでしょうか?
はたまた、そのコードを抜けばD7でかどうするとかんじまする
回答どうもありがとうございました。
Character.Set_TTSModeID(LowerCase('{A778E061-A936-11d1-B17B-0020AFED142E}'));
のように、LowerCase をつけてみましたが、
やっぱり、同じ状態です。
D7でエラーが発生するのは
Character.Set_TTSModeID
です。
何か手立てはありますでしょうか?
仕事中にて音が出せないのですが、少なくともD7proではエラーになりませんでした。
確認ですが、
・TAgentは、D7で取込直していますか?
# C:\WINDOWS\msagent\agentctl.dll
# {F5BE8BC2-7DE6-11D0-91FE-00C04FD701A5}
# Microsoft Agent Control 2.0
・Peedyはインストール済ですか?
http://www.microsoft.com/msagent/dev/docs/characterdata.asp
・エラー内容はどのようなものでしょうか。
にしのさん回答ありがとうございます。
>・TAgentは、D7で取込直していますか?
TAgent はダウンロードした
MSagetn.exe を実行するとインストールされました。
D7用とかあるのでしょうか?
「コンポーネント」「ActiveXの取り込み」
「Microsoft Agent Control 2.0(Version 2.0)」「インストール」
で取り込みました。
># {F5BE8BC2-7DE6-11D0-91FE-00C04FD701A5}
これを実行すると
「指定した音声支持エンジンがみつかりません。
音声指示エンジンが、キャラクタの言語と一致しないか、
音声出力が現在使用不能になっています。」
と、エラーメッセージが表示されます。
># Microsoft Agent Control 2.0
ダウンロードしたのは
lhttsjpj.exe 3078KB
MSagent.exe 392KB
AgtX0411.exe 128KB
Peedy.exe 3325KB
spchapi.exe 825KB
以上の5ファイルですべて実行しました。
>・Peedyはインストール済ですか?
C:\WINDOWS\MSAGENT\CHARS のディレクトリの中に
Peedy.acs ファイルが存在しています。
以上になります。
よろしくお願いします。
追記:
参考にしたのは以下のHPです
http://members.jcom.home.ne.jp/shinonon/delphi/tips3.html
すみません、勘違いでした。
以下のようなプログラムに変更して気づいたのですが
この状態だと、すべて男性の声で表示されます
以下のSpeak 呼び出しのところで
Character.Speak('\pit=10\こんにちは', '');
Character.Speak('\pit=10\こんにちは', '');
と、設定してやると
1番目は男性の声、2番目(2番目以降)は女性の声になりました。
結局 Character.Set_TTSModeID の設定にかかわらず
現象は同じ状態になりました。
《目的はすべて(1番目から)の音声を女性の声で出したい》
と、いうことなのです。
procedure TForm1.FormCreate(Sender: TObject);
begin
Agent.Characters.Load('MyChara',
'C:\WINDOWS\MSAGENT\CHARS\Peedy.acs');
Character := Agent.Characters.Character('MyChara') as
IAgentCtlCharacterEx;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Character.Show(False);
try
Character.Speak('こんにちは', '');
Character.Speak('こんにちは', '');
finally
Character.Hide(False);
end;
end;
{F5BE8BC2-7DE6-11D0-91FE-00C04FD701A5}はAgentControlのGUIDです。
音声指示エンジンではありません。
音声指示エンジンの女性の声は、
{A778E060-A936-11d1-B17B-0020AFED142E}
だと思いますが、こちらで試しましたか?
上にある{A778E061・・・}だと、Voice TypeがMaleと出ていますが。
Set_TTSModeIDの直後、少し間を置くとよいかもしれません。
SpeakやPlayは、非同期で動いているようです。
にしのさんどうもありがとうございました。
>音声指示エンジンの女性の声は、
>{A778E060-A936-11d1-B17B-0020AFED142E}
>だと思いますが、こちらで試しましたか?
すみません、出てきた音声で勘違い(思い込み?)してしまいました。
>Set_TTSModeIDの直後、少し間を置くとよいかもしれません。
>SpeakやPlayは、非同期で動いているようです。
初期設定を Form1.Create の中で行って
ボタンを押して、Speak するように変更しました。
現在は以下の状態でテストしています。
Character.Set_TTSModeID において
Delphi6でコンパイルリンクして動作させると
{A778E060-A936-・・・} {A778E061-A936-・・・}のどちらにしても
男性の声らしき低い同じ声しか出てきません()
Delphi7でコンパイルリンクして動作させると
[アドレス FFFFFFFF でアドレス FFFFFFFF に対する読込違反がおきました。]
と、表示されます
Character.Set_TTSModeID が正常に動作しないのでは
ないでしょうか?
それとも、D6,D7の両方をインストールして
使用しているのが原因なのでしょうか?
すみません、よろしくお願いします。
procedure TForm1.FormCreate(Sender: TObject);
begin
Agent.Characters.Load('MyChara',
'C:\WINDOWS\MSAGENT\CHARS\Peedy.acs');
Character := Agent.Characters.Character('MyChara')
as IAgentCtlCharacterEx;
Character.Set_TTSModeID('{A778E060-A936-11d1-B17B-0020AFED142E}'));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Character.Show(False);
try
Character.Speak('こんにちは', '');
Character.Speak('こんにちは', '');
finally
Character.Hide(False);
end;
end;
まず、D7でエラーとなる問題について。
D6で取り込んだpasファイルが、D7のライブラリパスに含まれていませんか?
また、レジストリ上に、
{A778E060-A936-11d1-B17B-0020AFED142E}
は存在しますか?
キーは、
HKEY_CLASSES_ROOT\CLSID\{A778E060-A936-11d1-B17B-0020AFED142E}
にあるはずです。
このキーのMiscInfo\Nameに書かれている、C:\WINDOWS\LHSP\Voice\JPJVF160.DLLといったDLLは存在しますか?
>D6で取り込んだpasファイルが、D7のライブラリパスに
>含まれていませんか?
「取り込んだ」言う意味がわからないのですが、
ダウンロードして、インストールするときにも
ActiveXコントロールの取り込み時にもそれぞれの
ユニットディレクトリ名が
D6の時:C:\Program Files\Borland\Delphi6\Imports\
D7の時:C:\Program Files\Borland\Delphi7\Imports\
となっています。
また、プロジェクトオプションで、「ディレクトリ/条件」は
ユニットの別名を除いてすべて空白になっています。
>{A778E060-A936-11d1-B17B-0020AFED142E}
>は存在しますか?
はい、存在しています。
>このキーのMiscInfo\Nameに書かれている、
>C:\WINDOWS\LHSP\Voice\JPJVF160.DLLといったDLLは存在しますか?
はい、こちらも存在しています。
お手数をおかけして申し訳ありませんが、
よろしくお願いします。
お世話になっています。
以下のようにメッセージを表示するようにプログラムを組んでみました。
Agent.Characters.Load('MyChara',
'C:\WINDOWS\MSAGENT\CHARS\Peedy.acs');
Character := Agent.Characters.Character('MyChara') as IAgentCtlCharacterEx;
Character.TTSModeID := '{A778E060-A936-11d1-B17B-0020AFED142E}';
ShowMessage(Format('Pitch=%d, Speed=%d', [Character.Pitch,
Character.Speed]));
ShowMessage('SRModeID = ' + Character.SRModeID);
ShowMessage('TTSModeID = ' + Character.TTSModeID);
ShowMessage('HelpFile = ' + Character.HelpFile);
ShowMessage('GUID = ' + Character.GUID);
ShowMessage('Version = ' + Character.Version);
ShowMessage('Name = ' + Character.Name);
ShowMessage('Description = ' + Character.Description);
ShowMessage('ExtraData = ' + Character.ExtraData);
以上の結果は以下のようになりました。
RichEdit1
Pitch=130, Speed=157
SRModeID =
TTSModeID = {A778E060-A936-11D1-B17B-0020AFED142E}
HelpFile =
GUID = {6A069521-46BB-11D1-A6F6-00AA002F83C2}
Version = 2.00
Name = ピーディ
Description = こんにちは。ボクはデジタル オウムのピーディです。
クラッカーと音楽が大好きなんだ。
ExtraData = ボクにまかせてよ!^^忘れちゃだめだよ!
にしのさんへ、
GUID の値が {F5BE8BC2-7DE6-11D0-91FE-00C04FD701A5} になっていません。
これが原因なのでしょうか?
よろしくお願いします。
>SpeakやPlayは、非同期で動いているようです。
以下のような実験をして見ました。
Character.Set_TTSModeID('{A778E060-A936-11d1-B17B-0020AFED142E}');
Character.Speak('\Spd=150\こんにちは\', '');
Character.Set_TTSModeID('{A778E061-A936-11d1-B17B-0020AFED142E}');
Character.Speak('\Spd=150\こんにちは\', '');
Character.Set_TTSModeID('{A778E060-A936-11d1-B17B-0020AFED142E}');
Character.Speak('\Spd=150\こんにちは\', '');
Character.Set_TTSModeID('{A778E061-A936-11d1-B17B-0020AFED142E}');
Character.Speak('\Spd=150\こんにちは\', '');
実行すると「女性→女性→女性→女性」すべて女性の声になりました。
先頭で停止させて時間をかけてステップ実行しました
すると「男性→女性→男性→女性」
??、「女性→男性→女性→男性」だと思ったのですが・・・
違うようです。
次に、「\Spd=150\」をすべて削除しました。
Character.Speak('こんにちは\', '');
この場合、通常実行もステップ実行も
この状態で4つ実行すると今度は
「男性→男性→男性→男性」になります。
どうも、わけがわからなくなってきました。
お助けください!
音を出してみたところ、確かに男性の声が出てますね。
試しに、キャラクタをOfficeのイルカにしてみましたが、声が出ませんでした。
ACSファイルに声が指定してあるのかもしれません。
# 未確認です
ピッチ設定について調べてみました。
速度180にしてピッチのみ変更して聞いて見ると以下のようになりました。
コード→≪Format('\Pit=%d\\Spd=180\%s',[Pitch, MessageStr]) ≫
聞いた感じでは3種類ぐらいの声しか判別できません。
さて、デフォルトですが、 Pitch=130,Pitch=157 のようです。
この作成して以下の表を見てみるとLanguageID の設定とは
逆になっています。ピッチって何でしょうね?
−−−−−−−−−−−−−−−−−−−−−
LanguageID 女 男
−−−−−−−−−−−−−−−−−−−−−
10 男 女
20 男 女
30 男 女
40 男 女
50 男 男
60 男 男
70 男 男
80 男 男
90 男 男
100 男 男
110 男 女
120 男 女
130 男 女
140 男 女
150 男 女
160 女 女
170 女 女
180 女 女
190 女 女
200 女 女
210 女 女
220 女 女
230 女 女
240 女 女
250 女 女
ツイート | ![]() |