ãã®èšäºã¯ã ãããã£ã°ã«ãŒã Advent Calendar 2025  21æ¥ç®ã®èšäºã§ãã(é
å») ã¯ããã« ããã«ã¡ã¯ãã ãµã·ã§ãã ã¿ãªããã¯æã²ãŒã ã®æ»ç¥æ¬ããPCç³»ã®éèªããã«ã€ããŠããããã¹ã¯ããããã¹ã³ãããšãããã®ãç¥ã£ãŠããã§ããããïŒ ãã¹ã¯ãããã«åžžé§ããŠæèšãã«ã¬ã³ããŒã衚瀺ããŠããããããã£ã©ã¯ã¿ãŒããããã¹ããããŠãããããã¡ãŒã«ãæ¥ãŠããã®ããç¥ããããŠãããããšãããããªãã®ããããŸããã æåéãè¿ãã²ãŒã ã®æ»ç¥æ¬ã«ã€ããŠããæèšã奜ãã ã£ããã§ãããã ãšããããã§ãæãæããã¿ãªããèªåãããããæèšãäœããããšæããŸãã ãã¹ã¯ããããã¹ã³ãããããããçŸåšã«çãæ®ã£ãŠãããã®ãããã®ã§ãããä»åã¯ãã®äžã§ãã«ã¹ã¿ãã€ãºæ§ãé«ããæèšãäœããããªã䌺ãããè§Šã£ãŠã¿ãããšæããŸãã ã䌺ãããšã¯ãç°¡åãªèšèªã§ã«ã¹ã¿ãã€ãºå¯èœãªããããã¹ããããã£ã©ã¯ã¿ãŒãåžžé§ãããããã¢ããªã®ããã§ãã æºå ãŸã䌺ããã€ã³ã¹ããŒã«ããŸãã èµ·åãããšãããã©ã«ãã§èšå®ããããã£ã©ã¯ã¿ãŒ(䌺ãã§ã¯ããã£ã©ã¯ã¿ãŒã®ããšãããŽãŒã¹ãããšåŒã¶ããã§ã)ãšèšå®ç»é¢ãç«ã¡äžãããŸãã ç«ã¡äžãã£ãèšå®ç»é¢ãèŠããšãããããããããã§ãããã¡ãŒã«ã®ç¢ºèªããåç»é
ä¿¡ã§å©çšããéã®è¡šç€ºèšå®ãªã©ãããã«ããæ©èœã ãã§ãæ®éã«äŸ¿å©ããã§ãã ãã®ããŽãŒã¹ããã倧éã«ãŠãŒã¶ã®æã§äœæãããŠããã奜ããªãŽãŒã¹ããèŠã€ããŠåžžé§ãããã®ãäžè¬çãªäœ¿ãæ¹ã ãšæãã®ã§ãããä»åã¯äœã£ãŠããããšæããŸãã æèšãäœãã«ã¯ èŠãç®ãå€ããããäŒè©±å
容ãå€ããã®ã§ããã°ãããç°¡åã«ã§ãããããªã®ã§ãããæèšãäœãã«ã¯ããã²ãšæéããããŸãã ãŸãæéãååŸããå¿
èŠããããŸãããã¡ãã¯YAYAãšããã©ã€ãã©ãªã飿ºãããããšã§ç°¡åã«è¡ããããã§ãã 䌺ãã¯ãæ ããšåŒã°ããç°¡åãªèšèªã«ãã£ãŠãå°ãè€éãªå®è£
ãã§ããããã«ãªããããªã®ã§ãããYAYAã¯ãã®ãæ ãã®äžçš®ãšãªããŸãã ïŒç¬èªã®çšèªãå€ãã説æãããšé·ããªã£ãŠããŸãã®ã§ç°¡æçãªèª¬æã«ãšã©ããããŠããã ããŸããïŒ YAYAãçšãããµã³ãã«ãŽãŒã¹ããšããŠããããã¡ããããšãããŽãŒã¹ããé
åžãããŠããããããåºã«ããŠæ°ãããŽãŒã¹ããäœã£ãŠè¯ãæšãæžããŠãã£ãã®ã§ãä»åã¯ãã®åãããã£ãŠè¡ãããšæããŸãããšãŠãããããã§ãã ã¯ããŒYAYAããŒãã©(玺éããã): https://ms.shillest.net/yayame.xhtml äžå¿ã§ãããäœãæŽæ°ããããããããªãã®ã§Githubäžããææ°ã®YAYAã®dllãã¡ã€ã«ããŽãŒã¹ãã®äžã«å
¥ããŠãããŸãããã ãŸãã䌺ãã¯animationãšããæ©èœã§ç»ååãæ¿ããã§ããããã§ãã ãŸã°ããã衚æ
å€åã«äœ¿ãã®ãäž»ç®çã®ããã§ããããããšYAYAãçµã¿åãããŠæèšã«ããŠãããŸãããã ãŸãšãããšãYAYAã§æå»ãååŸâanimationã§ãŽãŒã¹ãã®æ°åç»åã察å¿ãããã®ã«åãæ¿ãããšããæµãã§äœæããŠãããŸãã çŽ æãäœã æèšã®ç»åã¯ããã©ã«ãã®ãã£ã©ã¯ã¿ãŒã250*380ãããã§äœãããŠããã®ã§ã400pxã®æ£æ¹åœ¢ã§äœæããŠè¡ãããšæããŸãã ã€ã¡ãŒãžã¯ãããªæãã æçã§ãã£ã©ãã§ã£ã¡ãããŸããã§ããŸããããšãã¡ãããšåŒã³ãŸãããïŒå®çŽïŒ ãŽãªãŽãªçŽ æãæžããŠãããŸãããã å¿
èŠãªã®ã¯ãåå°ã«ãªãéšåãæ°åïŒïŒïœïŒïŒã§ãã åå°ã¯ãããªæãã§ãæ°åéšåã¯ãæ°ã«å
¥ãã®ããªãŒãã©ã³ãã ãã«ã®è°·éãšé«æ¶äž (ãªã³ã¯å
ã¯Booth)ãããåãããããšæããŸãã åå°éšåã®åç§°ã surface0.png ãæ°åéšåã digit_0.png ã digit_9.png ãšããŸããã ç»åãäœæåºæ¥ããäžèº«ã®éšåãäœã£ãŠãããŸãã æééšåã®åŠç æ ã¯è€æ°ã®åœ¹å²ãæã£ãã€ãã³ããæã£ãŠããããã®ã€ãã³ãå
ã«åŠçãèšè¿°ãããšåæ ãããŸãã詳ãã㯠ãã¡ã ã§ã æéã«ã€ããŠã¯ OnMinuteChange{} ãšãã1忝ã«èµ·ããã€ãã³ããããã®ã§ãããã«ãæéãšåãååŸããŠåæ¡ã®æ°åãè¿ãåŠçããæžãå ããŸãã ãµã³ãã«ã®ãããã¡ãã㯠yaya_aitalk.dic å
ã§æ¢ã« OnMinuteChange{} ã䜿ã£ãŠããã®ã§ããã®äžã«æžãå ãããäžæžãããŠããŸããŸãã YAYAã¯è€æ°ã®.dicãã¡ã€ã«ã«èšè¿°ãããåŠçãèŠãŠåãã®ã§ãããéè€ããŠæžãããŠãããšãšã©ãŒãèµ·ããŠããŸãã®ã§ããµã³ãã«ãã¡ã€ã«ãããããšãã¯æ°ãä»ããŸããããïŒ1æïŒ OnMinuteChange { //GETTIMEã§çŸåšæå»ãååŸ _now = GETTIME() _h = TOINT(_now[4]) //æéïŒ0ã23ïŒ _m = TOINT(_now[5]) //åïŒ0ã59ïŒ //ãã¹ãã¡ãã»ãŒãžã1çªç®ã®ãã£ã©ã¯ã¿ãŒã«åãããã "\C\0\b[2]çŸåšã®æå»ã¯ %(_h)æ %(_m)å ã§ãã\e" //åæ¡ã«åãã _h10 = _h / 10 _h1 = _h % 10 _m10 = _m / 10 _m1 = _m % 10 //ãã¹ãã¡ãã»ãŒãž2ã2çªç®ã®ãã£ã©ã¯ã¿ãŒã«åãããã "\C\1\b[10]çŸåšã®æå»ã¯ %(_h10)%(_h1)æ %(_m10)%(_m1)å ã ãã\e" //ã¢ãã¡ãŒã·ã§ã³çšã®è¿ãå€ "\C\0\s[0]\i[100,%(_h10)]\i[101,%(_h1)]\i[102,%(_m10)]\i[103,%(_m1)]\e" } ãã¹ãçšã«æå»ãååŸã§ããŠãããåãããŠã¿ãŸããã 1忝ã«çŸåšã®æå»ã話ããŠãããã®ã§ãåé¡ãªãããã§ããæ¬¡ã«è¡ããŸãããã ã¢ãã¡ãŒã·ã§ã³ã®åŠç å
ã»ã©ã®è¿ãå€ã«å¯Ÿå¿ããç»åã衚瀺ããããã« surfaces.txt ã«ç»åã®å¯Ÿå¿ãåŠçã«ã€ããŠæžããŠãããŸãã animationXXX.interval,neverã§ãã€ãã³ããåãåããŸã§æ¬¡ã®åŠçãèªåå®è¡ããªãããšããç¶æ
ã«ãªããæéãæ¥ããæ¬¡ã®ç»åã衚瀺ãšãªãã¯ãã§ãã charset,UTF-8 surface0 { // åå° element0,base,surface0.png,0,0 // animationçªå·, æç»ã¿ã€ãã³ã°, æç»æ³, ID, åŸ
æ©æé, X, Y // æã®10ã®äœ (ID 100) animation100.interval,never animation100.pattern0,overlay,100,-1,50,175 animation100.interval,never animation100.pattern1,overlay,101,-1,50,175 animation100.interval,never animation100.pattern2,overlay,102,-1,50,175 // æã®1ã®äœ (ID 101) animation101.interval,never animation101.pattern0,overlay,100,-1,120,190 animation101.interval,never animation101.pattern1,overlay,101,-1,120,190 animation101.interval,never animation101.pattern2,overlay,102,-1,120,190 animation101.interval,never animation101.pattern3,overlay,103,-1,120,190 animation101.interval,never animation101.pattern4,overlay,104,-1,120,190 animation101.interval,never animation101.pattern5,overlay,105,-1,120,190 animation101.interval,never animation101.pattern6,overlay,106,-1,120,190 animation101.interval,never animation101.pattern7,overlay,107,-1,120,190 animation101.interval,never animation101.pattern8,overlay,108,-1,120,190 animation101.interval,never animation101.pattern9,overlay,109,-1,120,190 // åã®10ã®äœ (ID 102) animation102.interval,never animation102.pattern0,overlay,100,-1,213,230 animation102.interval,never animation102.pattern1,overlay,101,-1,213,230 animation102.interval,never animation102.pattern2,overlay,102,-1,213,230 animation102.interval,never animation102.pattern3,overlay,103,-1,213,230 animation102.interval,never animation102.pattern4,overlay,104,-1,213,230 animation102.interval,never animation102.pattern5,overlay,105,-1,213,230 animation102.interval,never animation102.pattern6,overlay,106,-1,213,230 // åã®1ã®äœ (ID 103) animation103.interval,never animation103.pattern0,overlay,100,-1,280,255 animation103.interval,never animation103.pattern1,overlay,101,-1,280,255 animation103.interval,never animation103.pattern2,overlay,102,-1,280,255 animation103.interval,never animation103.pattern3,overlay,103,-1,280,255 animation103.interval,never animation103.pattern4,overlay,104,-1,280,255 animation103.interval,never animation103.pattern5,overlay,105,-1,280,255 animation103.interval,never animation103.pattern6,overlay,106,-1,280,255 animation103.interval,never animation103.pattern7,overlay,107,-1,280,255 animation103.interval,never animation103.pattern8,overlay,108,-1,280,255 animation103.interval,never animation103.pattern9,overlay,109,-1,280,255 } surface100 { element0,base,digit_0.png,0,0 } surface101 { element0,base,digit_1.png,0,0 } surface102 { element0,base,digit_2.png,0,0 } surface103 { element0,base,digit_3.png,0,0 } surface104 { element0,base,digit_4.png,0,0 } surface105 { element0,base,digit_5.png,0,0 } surface106 { element0,base,digit_6.png,0,0 } surface107 { element0,base,digit_7.png,0,0 } surface108 { element0,base,digit_8.png,0,0 } surface109 { element0,base,digit_9.png,0,0 } ãã£ãããšãã説æã«ãªããŸãããååã¯ç»åã®è¡šç€ºãäœçœ®ã®èª¿æŽãåŸåã¯IDãšç»åã®æå®ãè¡ã£ãŠããŸãã åãããŠã¿ããïŒ ããŠãåèµ·åããŠåãããŠã¿ãŸãïŒ ïŒïŒïŒïŒïŒïŒïŒ ãšããããã§å€±æããŸããã æå»ãæ£ãã衚瀺ãããªã æãå»ãŸãªã æ°åãæ¶ãã ãšãã¡ãããããŸã«æ¶ãã ãã¹ãã§å
¥ãããããã¹ãã®æå ±ã ãã¯æ£ããã®ã§ãã¢ãã¡ãŒã·ã§ã³ãç»å飿ºåšããããããã®ã ãšæããŸãã 幎ãè¶ããŠããŸãã®ã§ã¢ããã³ãã«ã¬ã³ããŒãšããŠã¯ãããªæãã§çµããããšæããŸãã ãããã§ãããïŒïŒããããïŒ ä¿®æ£ã§ããããŸãããã°æžããŸããorz äœè« ããããã°ãVOICEVOXãªã©ã§å£°ãããŠãæ©èœãããã©ã«ãã§ä»ããŠããŸãã VOICEVOXã€ã³ã¹ããŒã«åŸãèšå®ïŒé³å£°èªè/åæïŒé³å£°åæã®èšå®ïŒãã€ã¹ID暪ã®åç
§ãã¿ã³ãã声ãéžãã§ãã ããã ãã£ã©ãå³ã¯ãªãã¯ããŠåºãã¡ãã¥ãŒããæ©èœïŒé³å£°åæãæŒããŠæå¹ã«ããã声ãã€ããŸãã æåŸã« æèšäœãã¯å€±æããŸããããæ¥œããã£ãã®ã§æ¯éè§Šã£ãŠã¿ãŠãã ããâŠïŒ é¢é£èšäºãªã© ã°ããšãç ç©¶æ âŠäŒºããæ§æããŠãããœãããŠã§ã¢ãé
åžãããŠããŸããåãã¯ãã«ã»ããçã®SSPãDLããŸãããã ukadoc âŠäŒºãã®Wikiã§ãã AYAYA/03 âŠYAYAã®Wikiã§ãã 玺éããã âŠYAYAã®ãã³ãã¬ãŒããŽãŒã¹ãã玺éãããã¡ããã®ç޹ä»ãµã€ãã§ãã ãç¡æé åžãæ¥æ¬èªãã©ã³ãããã«ã®è°·éãšé«æ¶äžããäœããŸãã âŠãæ°ã«å
¥ãã®ãã©ã³ãå¶äœè
æ§ã®noteã§ãã VOICEVOX âŠãããã¹ãã«å£°ãä»ãããäººã¯æ¯éãæ¥æ¥éšã€ããã¡ããã奜ãã§ãã èäœæš©åšã SSPã®åºæ¬æ
å ± ãã®èšäºã§ç޹ä»ãããSSPãã¯ãC.Ponapaltæ§ããã³DOIchan!æ§ã«èäœæš©ãåž°å±ããããªãŒãŠã§ã¢ã§ãã ãã«ãããã¥ã¡ã³ãïŒChameleon Ponapaltæ§ããïœã¡ããæ§èäœïŒã«åºã¥ã玹ä»ããŠããŸãã ãYAYAããã³ãã¬ãŒããŽãŒã¹ã 玺éããã ã·ã§ã«äœè
ãµããŠ ïŒæ§ããŽãŒã¹ãäœè
ã¯ãªã³ã¯å
ã®Githubãåç
§ãã ããã Public Domain (Unlicense)ã§ãã