過去の投稿日別表示

[ リスト | 詳細 ]

全1ページ

[1]

音声合成のプログラムするひとの ために
参考になれば とて
私の言語のなかから 抜粋しました
参考になれば いいが

あっしは だいぶ 苦労してしもうたもので


CNVCHRS2U:(*I,*O) /* シフトジスからユニコードへ */
DS.B *I
DS.B *O
/A MOV EBX,[EBP] ;*PR
/A MOV EAX,[EBP+4] ;*PR1
/A INVOKE MultiByteToWideChar,CP_ACP,0,EBX,-1,EAX,128 


DC.B CLBFID1  'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech Server\v10.0\Voices',0,0,0
DC.B CLBFID2  'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech Server\v10.0\Voices\Tokens\TTS_MS_ja-JP_Haruka_10.0',0,0,0


/*
define ISpObjectToken_SetId(This,pszCategoryId,pszTokenId,fCreateIfNotExist) \
    ( (This)->lpVtbl -> SetId(This,pszCategoryId,pszTokenId,fCreateIfNotExist) )
 
*/

CNVCHRS2U(CLBFID1,LBFID1) /* シフトジスからユニコードへ */
CNVCHRS2U(CLBFID2,LBFID2)
TRSWT(10H,'CV=',0)
MOVE 256 TO WKL
WRITEHAND(1,*OHAND,LBFID1,WKL)
TRSWT(10H,'CV=',0)
MOVE 256 TO WKL
WRITEHAND(1,*OHAND,LBFID2,WKL)


SET LBFID1 TO *P
SET LBFID2 TO *P1
CLR WKL
  /* ( (This)->lpVtbl -> SetId(This,pszCategoryId,pszTokenId,fCreateIfNotExist) )  */


/A MOV EAX,EBP
/A ADD EAX,20
/A MOV EAX,0
/A PUSH EAX

/A MOV EAX,[EBP+4]
/A ;mov eax,0
/A PUSH EAX

/A MOV EAX,[EBP]
/A ;mov eax,0
/A PUSH EAX
  
/A MOV EAX,[OBVPTR] ;*PR2
/A PUSH EAX
/A MOV EAX,OBSETID
/A CALL EAX ;I
/A MOV [EBP+16],EAX

TRSWT(10H,'SET=',0)
TRSWT(1,RTST,4)
TRSWT(1,WKL,1)


/A MOV EBX,[OBVPTR]
/A PUSH EBX
/A MOV EAX,[VPTR] ;*PR2
/A PUSH EAX
/A MOV EAX,SETVOICE
/A CALL EAX ;
/A MOV [EBP+16],EAX
TRSWT(10H,'SETst=',0)
TRSWT(1,WKL,4)


/* ** SPERR_INVALID_TOKEN_ID    0x80045041    -2147200959 
E_POINTER                            equ 80004003h
SET=800700A1 0000
指定されたパスは無効です (エラー =800700A1)
 ** SPERR_UNINITIALIZED        0x80045001    -2147201023

 SPERR_NOT_FOUND                                       0x8004503a    -2147200966
   The requested data item (data key, value, etc.) was not found.


*/
アセンブラで 音声合成 私の言語 での サンプル抜粋

DS.L VPTR
DS.L VPTABL
DS.L RELEADSE /* Release */
DS.L SETVOICE /*    ( (This)->lpVtbl -> SetVoice(This,pToken) ) */
DS.L GETVOICE
DS.L SPEEK   /* 80 ( (This)->lpVtbl -> Speak(This,pwcs,dwFlags,pulStreamNumber) ) */

DS.L SETRATE /* 112 ( (This)->lpVtbl -> SetRate(This,RateAdjust) )  */
DS.L SETVOLM /* 120 ( (This)->lpVtbl -> SetVolume(This,usVolume) ) */

DS.L OBVPTR
DS.L OBVPTABL
DS.L OBGETID
DS.L OBSETID

DS.L OBRELEADSE DC.L CLSIDSpVoice 0D941651CH
DC.W CLSID1 44E6H
DC.W CLSID2 4C17H
DC.B CLSID3 0BAH,0DFH,0C3H,68H,26H,0FCH,34H,24H


DC.L IIDISpVoice 6C44DF74H
DC.W IID1 72B9H
DC.W IID2 4992H
DC.B IID3 0A1H,0ECH,0EFH,99H,6EH,04H,22H,0D4H

/*
EXTERN_C const IID IID_ISpVoice;
    MIDL_INTERFACE("6C44DF74-72B9-4992-A1EC-EF996E0422D4")
    Hello
*/


/* 言語変更するです */

DC.L CISSTOK 14056589H
DC.W CISSTOK1 0E16CH
DC.W CISSTOK2 11D2H
DC.B CISSTOK3 0BBH,90H,00,0C0H,4FH,8EH,0E6H,0C0H

/* Release */

/*
class DECLSPEC_UUID(EF411752-3736-4CB4-9C8C-8EF4CCB58EFE)
SpObjectToken;
  MIDL_INTERFACE(14056589-E16C-11D2-BB90-00C04F8EE6C0)
    ISpObjectToken : public ISpDataKey
*/
/* ------------------------------------------- */
DC.L CSPOBJTK 4424CB70H
DC.W CSPOBJTK1 2A7CH
DC.W CSPOBJTK2 43E2H
DC.B CSPOBJTK3 83H,3DH,0CBH,0FDH,82H,0DAH,10H,4FH

/*
EXTERN_C const CLSID CLSID_SpObjectToken;
#ifdef __cplusplus
class DECLSPEC_UUID("4424cb70-2a7c-43e2-833d-cbfd82da104f")
SpObjectToken;
*/
 

/A INVOKE CoInitialize,0


/*
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
CLSCTX_ALL              equ CLSCTX_INPROC_SERVER or CLSCTX_INPROC_HANDLER or CLSCTX_LOCAL_SERVER
CLSCTX_INPROC_SERVER equ 1
CLSCTX_INPROC_HANDLER equ 2
CLSCTX_LOCAL_SERVER equ 4
*/

SET CLSIDSpVoice TO *PC1
SET IIDISpVoice  TO *PC2


/A MOV EAX,[EBP+8] ;PC1
/A MOV EBX,[EBP+12] ;PC2
/A MOV ECX,EBP
/A ADD ECX,16 ; *PC3 PR2 64
/A INVOKE  CoCreateInstance,EAX,0,7,EBX,ECX
/A ;MOV EAX,1
/A MOV [EBP+20],EAX


TRSWT(10H,'SP=',0)
TRSWT(1,*PC3,4)
IF WKL = 0
THEN TRSWT(0,' Ok ',0)

SET *PC3 INDEX *PI SET *PC3 TO VPTR
SET *PI TO WKL MOVE WKL TO VPTABL

/A MOV EBX,[VPTABL]
/A ADD EBX,8 ;REEISH
/A MOV EAX,[EBX]
/A MOV RELEADSE,EAX ; Release 

/A MOV EBX,[VPTABL]
/A ADD EBX,72 ; ;hr = pVoice->
/A MOV EAX,[EBX]
/A MOV SETVOICE,EAX

/A MOV EBX,[VPTABL]
/A ADD EBX,76 ; ;hr = pVoice->
/A MOV EAX,[EBX]
/A MOV GETVOICE,EAX

/A MOV EBX,[VPTABL]
/A ADD EBX,80 ; ;hr = pVoice->
/A MOV EAX,[EBX]
/A MOV SPEEK,EAX


/A MOV EBX,[VPTABL]
/A ADD EBX,112 ; ;hr = pVoice->
/A MOV EAX,[EBX]
/A MOV SETRATE,EAX ; 112 ( (This)->lpVtbl -> SetRate(This,RateAdjust) -10 . 10)  



/A MOV EBX,[VPTABL]
/A ADD EBX,120 ; ;hr = pVoice->
/A MOV EAX,[EBX]
/A MOV SETVOLM,EAX ; 120 ( (This)->lpVtbl -> SetVolume(This,usVolume) 0~100%) 


/A MOV EBX,3
/A PUSH EBX
/A MOV EAX,[VPTR] ;*PR2
/A PUSH EAX
/A MOV EAX,SETRATE ;話すスピード設定 -10~10
/A CALL EAX ;IID_ISpVoice


/A MOV EBX,100
/A PUSH EBX
/A MOV EAX,[VPTR] ;*PR2
/A PUSH EAX
/A MOV EAX,SETVOLM ;ボリューム設定 0~100 %
/A CALL EAX ;IID_ISpVoice



ELSE TRSWT(0,' Err ',0)
TRSWT(1,WKL,4)
CLR RELEADSE
END-IF

/* 日本語に設定する */

SET CSPOBJTK TO *PC1
SET CISSTOK  TO *PC2
/A MOV EDX,[EBP+8] ;P
/A MOV EBX,[EBP+12] ;P1
/A MOV ECX,EBP
/A ADD ECX,16 ; *P2
/A INVOKE  CoCreateInstance,EDX,0,7,EBX,ECX
/A MOV [EBP+20],EAX


TRSWT(10H,'OB=',0)
TRSWT(1,*PC3,4)


IF WKL = 0
THEN
TRSWT(0,' Ok ',0)
ELSE TRSWT(0,' Err ',0)
TRSWT(1,WKL,4)
CLR OBRELEADSE
END-IF

SET *PC3 INDEX *PI SET *PC3 TO OBVPTR
SET *PI TO WKL MOVE WKL TO OBVPTABL

/A MOV EBX,[OBVPTABL]
/A ADD EBX,8 ;REEISH
/A MOV EAX,[EBX]
/A MOV OBRELEADSE,EAX ; Release 

/A MOV EBX,[OBVPTABL]
/A ADD EBX,64 ; ;hr = ( (This)->lpVtbl -> GetId(This,ppszCoMemTokenId) ) 
/A MOV EAX,[EBX]
/A MOV OBGETID,EAX

/A MOV EBX,[OBVPTABL]
/A ADD EBX,60 ; ;hr =  ( (This)->lpVtbl -> SetId(This,pszCategoryId,pszTokenId,fCreateIfNotExist) ) 
/A MOV EAX,[EBX]
/A MOV OBSETID,EAX


/* TRSWT(10H,' TCHK5=',0) TRSWT(5,CSPMMADEN,64) */

WHEN 1 /* SPEEK */

/A MOV EBX,0
/A PUSH EBX
/A PUSH EBX
/A MOV EBX,[EBP]
/A PUSH EBX
/A MOV EAX,[VPTR] ;*PR2
/A PUSH EAX
/A MOV EAX,SPEEK
/A CALL EAX ;IID_ISpVoice ;,0,0;,0,0 ;ISpVoice_Release

WHEN 2 /* CLOSE */

IF RELEADSE = 0
THEN
ELSE
/A MOV EAX,[VPTR] ;
/A PUSH EAX
/A MOV EAX,RELEADSE
/A CALL EAX ;IID_ISpVoice ;,0,0;,0,0 ;ISpVoice_Release
END-IF


IF OBRELEADSE = 0
THEN
ELSE
/A MOV EAX,[OBVPTR] ;
/A PUSH EAX
/A MOV EAX,OBRELEADSE
/A CALL EAX ;IID_ISpVoice ;,0,0;,0,0 ;ISpVoice_Release
END-IF

/A INVOKE CoUninitialize

昨夜から 気になっていた
ボリュームの 調整 コマンド と
話す スピード 調整 コマンド を
追加

動作確認
やたーー
以下 アセンブラーで 設定したもの

/A MOV EBX,3
/A PUSH EBX
/A MOV EAX,[VPTR] ;*PR2
/A PUSH EAX
/A MOV EAX,SETRATE ;話すスピード設定 -10~10
/A CALL EAX ;IID_ISpVoice


/A MOV EBX,100
/A PUSH EBX
/A MOV EAX,[VPTR] ;*PR2
/A PUSH EAX
/A MOV EAX,SETVOLM ;ボリューム設定 0~100 %
/A CALL EAX ;IID_ISpVoice

分かってしまうと かんたんじゃー
ちなみに レジストリーぱす

解説では ID 指定なんだ

DC.B CLBFID1  'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech Server\v10.0\Voices',0,0,0
DC.B CLBFID2  'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech Server\v10.0\Voices\Tokens\TTS_MS_ja-JP_Haruka_10.0',0,0,0

以下で 喋るんじゃ

/A MOV EBX,0
/A PUSH EBX
/A PUSH EBX
/A MOV EBX,[EBP]
/A PUSH EBX
/A MOV EAX,[VPTR] ;*PR2
/A PUSH EAX
/A MOV EAX,SPEEK
/A CALL EAX ;IID_ISpVoice ;,

簡単じゃろー
でも 背景は あーーー い や   ジャーー
なんたって オラ 還暦じゃ

Windows7でも コンパイル環境整備 成功じゃーーー
やはり パスが 違っておる

そうそう 今日も 南部美人前 給水 文化会館 金田一旧道 湯田 周回
圧雪 で はしりやすかった

全1ページ

[1]


[PR]お得情報

ふるさと納税サイト≪さとふる≫
実質2000円で好きなお礼品を選べる
毎日人気ランキング更新中!

その他のキャンペーン


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事