Conversation
|
ありがとうございます! |
|
おまたせしました。
<MotionSequence>
<Block>
<Voice voice="../assets/001.wav" volume={0.5} />
<LipSync data={lipsync1} />
</Block>
<Voice voice="../assets/002.wav" />
</MotionSequence>
<Blink data={blink1} />ここの部分、
|
|
不明瞭な部分も多くすみません。
type HasKey<K extends string, V = unknown> = {
[P in K]: V
} & Record<string, unknown>
export type LipSyncData = HasKey<"mouthCues", {start: number, end: number, value: string}[]>例 const blink1 = {
mouthCues: [
{ start: 0.00, end: 0.03, value: "X" },
{ start: 0.03, end: 0.09, value: "B" },
{ start: 0.09, end: 0.29, value: "C" }
}
export type BlinkData = HasKey<"blinkCues", {start: number, end: number, value: string}[]>
|
|
いくつか修正を加えました。
<MotionWithVars
variables={{t: 0 as number}}
animation={async (ctx, variables) => {
await ctx.move(variables.t).to(1, seconds(0.5), BEZIER_LINEAR)
await ctx.move(variables.t).to(0, seconds(0.5), BEZIER_LINEAR)
}}
motion={(variables, frames) => {
if (variables.t.get(frames[0]) < 0.5) {
return {
"腕/右腕": "バンザイ"
}
} else {
return {}
}
}}
/> |
|
かなり良さそうに見えます。 |
|
コンポーネントをいくつか追加しました。
export const PROJECT = () => {
const SimpleLipSync = createSimpleLipSync({
kind: "bool",
options: {
Default: "全身/顔パーツ/口/お",
Open: "全身/顔パーツ/口/あ",
Closed: "全身/顔パーツ/口/にま",
}
})
return (
<Project>
<TimeLine>
<Clip>
<PsdCharacter psd="../assets/test.psd">
<SimpleLipSync voice="../assets/test.wav" />
</PsdCharacter>
</Clip>
</TimeLine>
</Project>
)
}
export const PROJECT = () => {
const AkaneLipSync = createSimpleLipSync({
kind: "enum" as const,
options: {
Mouth: "目・口/口",
Default: "開き",
Open: "開き",
Closed: "閉じ",
}
})
const AoiLipSync = createSimpleLipSync({
kind: "bool",
options: {
Default: "全身/顔パーツ/口/お",
Open: "全身/顔パーツ/口/あ",
Closed: "全身/顔パーツ/口/にま",
}
})
return (
<Project>
<TimeLine>
<Clip label="Hello">
<DialogueSenario>
<DeclareCharacters>
<DeclareCharacter idleClassName="akane" speakingClassName="akane" name="akane" psd="../assets/akane.psd">
<Motion motion={(_v, _f)=> {return {}}} />
</DeclareCharacter>
<DeclareCharacter idleClassName="aoi" speakingClassName="aoi" name="aoi" psd="../assets/aoi.psd">
<Motion motion={(_v, _f)=> {return {}}} />
</DeclareCharacter>
</DeclareCharacters>
<Senario>
<Chapter>
<Speaker name="aoi" >
<AoiLipSync voice={voice1} />
</Speaker>
</Chapter>
<Chapter>
<Speaker name="akane" >
<AkaneLipSync voice={voice2} threshold={0.1} />
</Speaker>
</Chapter>
</Senario>
</DialogueSenario>
</Clip>
</TimeLine>
</Project>
)
} |
|
現在こちらのPSD立ち絵でテストしているのですが、うまく反映されずデフォルトの状態が表示されます。 const PsdTest = () => {
const SimpleLipSync = createSimpleLipSync({
kind: "bool",
options: {
Default: "表情/口/5",
Open: "表情/口/1",
Closed: "表情/口/5",
}
})
return (
<PsdCharacter psd="assets/zundamonA.psd">
<SimpleLipSync voice="assets/001_ずんだもん(ノーマル)_ずんだもんなのだ.wav" />
</PsdCharacter>
)
} |
ゆっくり動画を簡単に作成するため、psdファイルを制御するコンポーネントを作成しました。
( #2 )
使用例