ホーム › Media.Speech › SPVTEXTFRAG
SPVTEXTFRAG
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| pNext | SPVTEXTFRAG* | 8/4 | +0 | +0 | 次のテキストフラグメントへのポインタ。末尾ならNULL。 |
| State | SPVSTATE | 72/52 | +8 | +4 | このフラグメントに適用される合成状態(SPVSTATE)。 |
| pTextStart | LPWSTR | 8/4 | +80 | +56 | フラグメントのテキスト開始位置へのポインタ。 |
| ulTextLen | DWORD | 4 | +88 | +60 | フラグメントのテキスト文字数。 |
| ulTextSrcOffset | DWORD | 4 | +92 | +64 | 元テキスト先頭からのこのフラグメントの文字オフセット。 |
各言語での定義
#include <windows.h>
// SPVPITCH (x64 8 / x86 8 バイト)
typedef struct SPVPITCH {
INT MiddleAdj;
INT RangeAdj;
} SPVPITCH;
// SPVCONTEXT (x64 24 / x86 12 バイト)
typedef struct SPVCONTEXT {
LPWSTR pCategory;
LPWSTR pBefore;
LPWSTR pAfter;
} SPVCONTEXT;
// SPVSTATE (x64 72 / x86 52 バイト)
typedef struct SPVSTATE {
SPVACTIONS eAction;
WORD LangID;
WORD wReserved;
INT EmphAdj;
INT RateAdj;
DWORD Volume;
SPVPITCH PitchAdj;
DWORD SilenceMSecs;
WORD* pPhoneIds;
SPPARTOFSPEECH ePartOfSpeech;
SPVCONTEXT Context;
} SPVSTATE;
// SPVTEXTFRAG (x64 96 / x86 68 バイト)
typedef struct SPVTEXTFRAG {
SPVTEXTFRAG* pNext;
SPVSTATE State;
LPWSTR pTextStart;
DWORD ulTextLen;
DWORD ulTextSrcOffset;
} SPVTEXTFRAG;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SPVPITCH
{
public int MiddleAdj;
public int RangeAdj;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SPVCONTEXT
{
public IntPtr pCategory;
public IntPtr pBefore;
public IntPtr pAfter;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SPVSTATE
{
public int eAction;
public ushort LangID;
public ushort wReserved;
public int EmphAdj;
public int RateAdj;
public uint Volume;
public SPVPITCH PitchAdj;
public uint SilenceMSecs;
public IntPtr pPhoneIds;
public int ePartOfSpeech;
public SPVCONTEXT Context;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SPVTEXTFRAG
{
public IntPtr pNext;
public SPVSTATE State;
public IntPtr pTextStart;
public uint ulTextLen;
public uint ulTextSrcOffset;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SPVPITCH
Public MiddleAdj As Integer
Public RangeAdj As Integer
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SPVCONTEXT
Public pCategory As IntPtr
Public pBefore As IntPtr
Public pAfter As IntPtr
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SPVSTATE
Public eAction As Integer
Public LangID As UShort
Public wReserved As UShort
Public EmphAdj As Integer
Public RateAdj As Integer
Public Volume As UInteger
Public PitchAdj As SPVPITCH
Public SilenceMSecs As UInteger
Public pPhoneIds As IntPtr
Public ePartOfSpeech As Integer
Public Context As SPVCONTEXT
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SPVTEXTFRAG
Public pNext As IntPtr
Public State As SPVSTATE
Public pTextStart As IntPtr
Public ulTextLen As UInteger
Public ulTextSrcOffset As UInteger
End Structureimport ctypes
from ctypes import wintypes
class SPVPITCH(ctypes.Structure):
_fields_ = [
("MiddleAdj", ctypes.c_int),
("RangeAdj", ctypes.c_int),
]
class SPVCONTEXT(ctypes.Structure):
_fields_ = [
("pCategory", ctypes.c_void_p),
("pBefore", ctypes.c_void_p),
("pAfter", ctypes.c_void_p),
]
class SPVSTATE(ctypes.Structure):
_fields_ = [
("eAction", ctypes.c_int),
("LangID", ctypes.c_ushort),
("wReserved", ctypes.c_ushort),
("EmphAdj", ctypes.c_int),
("RateAdj", ctypes.c_int),
("Volume", wintypes.DWORD),
("PitchAdj", SPVPITCH),
("SilenceMSecs", wintypes.DWORD),
("pPhoneIds", ctypes.c_void_p),
("ePartOfSpeech", ctypes.c_int),
("Context", SPVCONTEXT),
]
class SPVTEXTFRAG(ctypes.Structure):
_fields_ = [
("pNext", ctypes.c_void_p),
("State", SPVSTATE),
("pTextStart", ctypes.c_void_p),
("ulTextLen", wintypes.DWORD),
("ulTextSrcOffset", wintypes.DWORD),
]#[repr(C)]
pub struct SPVPITCH {
pub MiddleAdj: i32,
pub RangeAdj: i32,
}
#[repr(C)]
pub struct SPVCONTEXT {
pub pCategory: *mut core::ffi::c_void,
pub pBefore: *mut core::ffi::c_void,
pub pAfter: *mut core::ffi::c_void,
}
#[repr(C)]
pub struct SPVSTATE {
pub eAction: i32,
pub LangID: u16,
pub wReserved: u16,
pub EmphAdj: i32,
pub RateAdj: i32,
pub Volume: u32,
pub PitchAdj: SPVPITCH,
pub SilenceMSecs: u32,
pub pPhoneIds: *mut core::ffi::c_void,
pub ePartOfSpeech: i32,
pub Context: SPVCONTEXT,
}
#[repr(C)]
pub struct SPVTEXTFRAG {
pub pNext: *mut core::ffi::c_void,
pub State: SPVSTATE,
pub pTextStart: *mut core::ffi::c_void,
pub ulTextLen: u32,
pub ulTextSrcOffset: u32,
}import "golang.org/x/sys/windows"
type SPVPITCH struct {
MiddleAdj int32
RangeAdj int32
}
type SPVCONTEXT struct {
pCategory uintptr
pBefore uintptr
pAfter uintptr
}
type SPVSTATE struct {
eAction int32
LangID uint16
wReserved uint16
EmphAdj int32
RateAdj int32
Volume uint32
PitchAdj SPVPITCH
SilenceMSecs uint32
pPhoneIds uintptr
ePartOfSpeech int32
Context SPVCONTEXT
}
type SPVTEXTFRAG struct {
pNext uintptr
State SPVSTATE
pTextStart uintptr
ulTextLen uint32
ulTextSrcOffset uint32
}type
SPVPITCH = record
MiddleAdj: Integer;
RangeAdj: Integer;
end;
SPVCONTEXT = record
pCategory: Pointer;
pBefore: Pointer;
pAfter: Pointer;
end;
SPVSTATE = record
eAction: Integer;
LangID: Word;
wReserved: Word;
EmphAdj: Integer;
RateAdj: Integer;
Volume: DWORD;
PitchAdj: SPVPITCH;
SilenceMSecs: DWORD;
pPhoneIds: Pointer;
ePartOfSpeech: Integer;
Context: SPVCONTEXT;
end;
SPVTEXTFRAG = record
pNext: Pointer;
State: SPVSTATE;
pTextStart: Pointer;
ulTextLen: DWORD;
ulTextSrcOffset: DWORD;
end;const SPVPITCH = extern struct {
MiddleAdj: i32,
RangeAdj: i32,
};
const SPVCONTEXT = extern struct {
pCategory: ?*anyopaque,
pBefore: ?*anyopaque,
pAfter: ?*anyopaque,
};
const SPVSTATE = extern struct {
eAction: i32,
LangID: u16,
wReserved: u16,
EmphAdj: i32,
RateAdj: i32,
Volume: u32,
PitchAdj: SPVPITCH,
SilenceMSecs: u32,
pPhoneIds: ?*anyopaque,
ePartOfSpeech: i32,
Context: SPVCONTEXT,
};
const SPVTEXTFRAG = extern struct {
pNext: ?*anyopaque,
State: SPVSTATE,
pTextStart: ?*anyopaque,
ulTextLen: u32,
ulTextSrcOffset: u32,
};type
SPVPITCH {.bycopy.} = object
MiddleAdj: int32
RangeAdj: int32
SPVCONTEXT {.bycopy.} = object
pCategory: pointer
pBefore: pointer
pAfter: pointer
SPVSTATE {.bycopy.} = object
eAction: int32
LangID: uint16
wReserved: uint16
EmphAdj: int32
RateAdj: int32
Volume: uint32
PitchAdj: SPVPITCH
SilenceMSecs: uint32
pPhoneIds: pointer
ePartOfSpeech: int32
Context: SPVCONTEXT
SPVTEXTFRAG {.bycopy.} = object
pNext: pointer
State: SPVSTATE
pTextStart: pointer
ulTextLen: uint32
ulTextSrcOffset: uint32struct SPVPITCH
{
int MiddleAdj;
int RangeAdj;
}
struct SPVCONTEXT
{
void* pCategory;
void* pBefore;
void* pAfter;
}
struct SPVSTATE
{
int eAction;
ushort LangID;
ushort wReserved;
int EmphAdj;
int RateAdj;
uint Volume;
SPVPITCH PitchAdj;
uint SilenceMSecs;
void* pPhoneIds;
int ePartOfSpeech;
SPVCONTEXT Context;
}
struct SPVTEXTFRAG
{
void* pNext;
SPVSTATE State;
void* pTextStart;
uint ulTextLen;
uint ulTextSrcOffset;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; SPVTEXTFRAG サイズ: 68 バイト(x86)
dim st, 17 ; 4byte整数×17(構造体サイズ 68 / 4 切り上げ)
; pNext : SPVTEXTFRAG* (+0, 4byte) varptr(st)+0 を基点に操作(4byte:入れ子/配列)
; State : SPVSTATE (+4, 52byte) varptr(st)+4 を基点に操作(52byte:入れ子/配列)
; pTextStart : LPWSTR (+56, 4byte) st.14 = 値 / 値 = st.14 (lpoke/lpeek も可)
; ulTextLen : DWORD (+60, 4byte) st.15 = 値 / 値 = st.15 (lpoke/lpeek も可)
; ulTextSrcOffset : DWORD (+64, 4byte) st.16 = 値 / 値 = st.16 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SPVTEXTFRAG サイズ: 96 バイト(x64)
dim st, 24 ; 4byte整数×24(構造体サイズ 96 / 4 切り上げ)
; pNext : SPVTEXTFRAG* (+0, 8byte) varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; State : SPVSTATE (+8, 72byte) varptr(st)+8 を基点に操作(72byte:入れ子/配列)
; pTextStart : LPWSTR (+80, 8byte) qpoke st,80,値 / qpeek(st,80) ※IronHSPのみ。3.7/3.8は lpoke st,80,下位 : lpoke st,84,上位
; ulTextLen : DWORD (+88, 4byte) st.22 = 値 / 値 = st.22 (lpoke/lpeek も可)
; ulTextSrcOffset : DWORD (+92, 4byte) st.23 = 値 / 値 = st.23 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global SPVPITCH
#field int MiddleAdj
#field int RangeAdj
#endstruct
#defstruct global SPVCONTEXT
#field intptr pCategory
#field intptr pBefore
#field intptr pAfter
#endstruct
#defstruct global SPVSTATE
#field int eAction
#field short LangID
#field short wReserved
#field int EmphAdj
#field int RateAdj
#field int Volume
#field SPVPITCH PitchAdj
#field int SilenceMSecs
#field intptr pPhoneIds
#field int ePartOfSpeech
#field SPVCONTEXT Context
#endstruct
#defstruct global SPVTEXTFRAG
#field intptr pNext
#field SPVSTATE State
#field intptr pTextStart
#field int ulTextLen
#field int ulTextSrcOffset
#endstruct
stdim st, SPVTEXTFRAG ; NSTRUCT 変数を確保
st->ulTextLen = 100
mes "ulTextLen=" + st->ulTextLen