| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- export type Role = "assistant" | "system" | "user";
- // ChatGPT API
- export type Message = {
- role: Role;
- content: string;
- };
- const talkStyles = [
- "talk",
- "happy",
- "sad",
- "angry",
- "fear",
- "surprised",
- ] as const;
- export type TalkStyle = (typeof talkStyles)[number];
- export type Talk = {
- style: TalkStyle;
- message: string;
- };
- //Name of all the expression in the vrm
- export const emotionNames: string[] = [];
- console.log("All emotion names, ",emotionNames);
- export const emotions =
- ["neutral", "happy", "angry", "sad", "relaxed", "Surprised",
- "Shy", "Jealous", "Bored", "Serious", "Suspicious", "Victory",
- "Sleep", "Love"] as const;
- // Convert user input to system format e.g. ["suspicious"] -> ["Sus"], ["sleep"] -> ["Sleep"]
- const userInputToSystem = (input: string) => {
- const mapping: { [key: string]: string } = {
- ...Object.fromEntries(emotions
- .filter(e => e[0] === e[0].toUpperCase())
- .map(e => [e.toLowerCase(), e]))
- };
- return mapping[input.toLowerCase()] || input;
- };
- type EmotionType = (typeof emotions)[number];
- /**
- * A set that includes utterances, voice emotions, and model emotional expressions.
- */
- export type Screenplay = {
- expression: EmotionType;
- talk: Talk;
- text: string;
- };
- export const textsToScreenplay = (
- texts: string[],
- ): Screenplay[] => {
- const screenplays: Screenplay[] = [];
- let prevExpression = "neutral";
- for (let i = 0; i < texts.length; i++) {
- const text = texts[i];
- const match = text.match(/\[(.*?)\]/);
- const tag = (match && match[1]) || prevExpression;
- const message = text.replace(/\[(.*?)\]/g, "");
- let expression = prevExpression;
- const systemTag = userInputToSystem(tag);
- if (emotions.includes(systemTag as any)) {
- console.log("Emotion detect :",systemTag);
- expression = systemTag;
- prevExpression = systemTag;
- }
- screenplays.push({
- expression: expression as EmotionType,
- talk: {
- style: emotionToTalkStyle(expression as EmotionType),
- message: message,
- },
- text: text,
- });
- }
- return screenplays;
- };
- const emotionToTalkStyle = (emotion: EmotionType): TalkStyle => {
- switch (emotion) {
- case "angry":
- return "angry";
- case "happy":
- return "happy";
- case "sad":
- return "sad";
- default:
- return "talk";
- }
- };
|