속삭임이 고이는 별

속삭임 연못

최근에 흘러든 속삭임이에요

from 여행당일기 - 메인

한문 조판용 웹사이트

이미지

링크

개발 시작: 2024.04.27(토) 개발 기간: 3-4시간

소개: 간단한 한문 자료를 영인본 모양으로 조판할 수 있는 사이트입니다.

가능한 것

  • 단순한 한문 자료의 조판이 가능합니다.
  • 책 제목을 지정할 수 있습니다.
  • 작은 글씨로 된 주석을 넣을 수 있습니다.
  • 문단 사이를 ○로 구분할 수 있습니다.

불가능한 것

  • 내려쓰기가 안 됩니다 – 들여쓰기가 아닙니다: 이래서 조금 퀄리티가 떨어집니다. 본문을 한 칸 올려쓰거나 내려쓰는 것 자체가 고서에서 본문의 층위를 파악할 수 있는 중요한 방법인데 이 부분이 미구현 상태입니다.
  • 그림이나 수식 등의, 두 줄을 넘어가는 요소를 넣을 수 없습니다 – 이건 전근대 과학 자료에 많은 편인데.. 생략하겠습니다.
  • 일본어 상용한자를 벗어나는 글자는 예쁘게 표시되지 않습니다 – 사용된 폰트가 일본어 폰트라 그렇습니다.

  • PDF로 내보내기...? ← 구현할 예정

문법

  • 단순히 개행을 한다고 새 문단으로 인식하지는 않으니 마음껏 개행해주세요.
  • 구두점 자동삭제 기능 없습니다. 쓰지 마세요.
  • 문단을 구분하고 싶으면 앞 문단을 마침표(.) 로 끝내주세요.
  • 주석에 해당하는 텍스트는 작은따옴표(') 로 감싸주세요.
 
Read more...

from 꿈꾸는 어린 용

오늘 오랜만에 소설책을 완독했다. 성에 차는 책은 아니었지만, 분명 좋은 책이었고, 나름 재밌게 읽었다. 요즘 세상은 힐링이 되는 이야기를 좋아하는 것 같다.

다 읽고 나서 제일 먼저 든 생각은 내가 소설을 쓰고 싶었던 게 아닐지도 모른다는 거였다. 그래서 방금 곰곰 생각해봤는데 맞는 거 같다. 나는 단순히 나와 마주보는 거울 같은 글을 쓰고 싶었다. 그러기에 소설은 너무 돌아가는 길이고, 당연히 현재의 나와 마주보는 일에서는 거리가 멀었다. 그래서... 내가 소설을 쓰지 못했던 걸지도 모른다. 아니, 그렇구나 하는 깨달음이다.

나는 나와 마주보는 글을 쓰고 싶다. 결국 내게 필요한 건 일기였던 건지도 모른다. 일기는 꾸준히 쓸 수 있었다. 하지만 이걸 누군가에게 보여주고 싶은 마음도 있다. 무얼 어떻게 해야할까. 에세이는 내 체질이 아닌 것 같은데. 연구가 필요한 시점인지도 모르겠다.

그래도 소설이 쓰고 싶기는 하다. 다만 이제는 좀 더 즐길 거리로, 취미로 즐기고 싶다. 좀 더 즐겁게 여행을 떠나고 싶다. 그래, 소설은 여행이다. 나는 여행을 떠나기보다 제자리에서 일상을 살아가고 있었다. 그러니 아무것도 쓰지 못 했다.

사랑하는 나의 이야기들아, 언젠가 우리 마주할 날이 있을거야. 그때까지 함께 있자.

 
Read more...

from 사랑하는 당신에게

사랑하는 당신께. 저는 지금 당신에게 편지를 쓰고 있습니다. 그렇다는 건 다른 일을 하고 있지 않다는 뜻이기도 하지요. 무슨 말이냐면, 저는 지금 공부를 미루고 있습니다. 네, 도피형 편지예요.

하지만 들어보세요.

오늘 날이 참 좋습니다. 맑다 못해 더울 정도로 좋아요. 햇빛 아래 있으면 뜨거워서 버틸 수 없을 지경입니다. 벌써 여름이 오고 있다고요. 아직 5월도 되지 않았는데요. 즉, 지금 제가 있는 이곳은 한창 환절기입니다.

환절기가 어떤 때인가요. 마음이 싱숭생숭 흔들려 아무 이유 없이 설레거나 심란해지곤 하는 때입니다. 그런 시기에, 제 마음이 어떻겠어요. 생각해보세요. 가만히 앉아서 공부나 하기에는 너무 힘든 날이란 말이에요.

물론 변명입니다. 알고 있어요. 미루기는 하지만 할 거예요. 할 거라고요. 그래도 당신과 조금만 수다를 떨고 싶어요. 이 정도는 괜찮죠?

사랑스런 당신. 저는 오늘 식사를 대충 해치워버렸습니다. 아침과 점심 두 끼니를 말이죠. 아침에는 샐러드 야채만 잔뜩. 점심에는 베이글. 이렇게 말이에요. 그리고 중간에 간식을 두 번이나 먹었습니다. 달달한 것들로만 먹었지요. 딸기청을 부은 요거트와 초콜릿바예요. 주말이라고 이렇게 대충 때우면 안 되는데 싶으면서도 맛있었으면 됐다는 안일함이 올라와요. 건강을 지키는 게 이렇게나 어렵습니다.

그러고보니 오늘 드디어 친구와 스터디를 시작했어요. 가볍게 하는 스터디지만 함께 공부한 성과를 나누는 것이 즐거웠습니다. 나누는 과정에서 얻는 것도 있었고요. 앞으로도 빠듯한 시간이지만 잘 쪼개서 함께 공부해나가려고 해요.

초록빛이 어여쁜 요즘입니다. 비록 햇살은 뜨겁지만 밖에 나가서 걷는 게 기분 좋아요. 공기만 맑으면 완벽한데 조금 아쉽습니다. 당신 날이 저물면 산책을 나가보세요.

당신의 매일이 푸른 잎사귀처럼 언제나 푸르르길 바라며.

2024년 04월 27일, 당신과 함께 걷고픈 속삭임이.

푸른 잎사귀

 
Read more...

from 사랑하는 당신에게

안녕, 당신. 좋은 하루 되었나요? 나는 오늘 꽤 기분 좋은 하루를 보냈어요. 아침에 느즈막이 일어나서 햇살이 쨍쨍한 거리를 걷다가 근처에 있는 카페에 들어가서 사진을 찍고 놀았거든요. 혼자서 느긋하게 있는 시간이 오랜만이라 내가 이 시간을 정말 많이 그리워했구나 깨달았답니다.

사람이라는 게 항상 바쁘게만 살 수는 없는 것 같아요. 제가 저번에 말했죠? 정신과 약이 바뀌어서 조금 다른 삶을 살고 있다고요. 덕분에 조금 힘에 부치는 시간을 보내고 있었나봐요. 어제부터 능동적인 행위는 아무것도 하기 싫더라고요.

그래도 어제 저녁부터 오늘 오후까지 느긋하게 보낸 덕분인지 지금은 좀 괜찮아요. 나름 충실한 하루를 보내고 막 누운 참이랍니다.

이런 상황에서 갑자기 편지를 쓰고 있는 제가 스스로도 조금 엉뚱하게 느껴져요. 하지만 저는 이 편지를 써야만 했습니다. 당신이 그립기 때문이에요.

사랑하는 당신. 저는 지금 별로 기분이 좋지 않습니다. 하루종일 기분 좋은 시간을 보냈으니 기분 좋게 잠에 들어야 하는데 당신이 그리워 글을 쓰기 시작했을 정도로요.

당신은 부모님과 어떤 관계를 맺고 계신가요? 저는 요즘 완전히 연락을 끊어버렸습니다. 그 사실 때문에 지금 기분이 별로 좋지 않아요.

저희 부모님은 그다지 나쁜 부모님은 아니었습니다. 많이 공부하고, 많이 노력하셨어요. 부모도 한 명의 인간일 뿐이라서 실수도 많았지만 충분히 사랑을 주셨고, 그 사실을 행동을 증명해오신 분들입니다.

그런데 왜 연락을 끊었는지 궁금하시겠지요. 사실 저도 궁금합니다. 저는 왜 그렇게 부모님이 미울까요. 틀림없이 남들이 들으면 좋은 부모님이라고 생각하실만한 부모님인데 왜 그렇게 밉고 속상하고 싫을까요. 사랑이 너무 깊었을까요? 아니면 더는 노력하기 싫어졌는지도 모릅니다.

이유야 어쨌든, 저는 결국 부모님과의 연을 끊어버린 제가 싫어요. 그렇게 밖에는 살아내지 못 하는 제가 싫습니다. 당신, 당신은 어떻게 생각하나요? 나는 못된 사람일까요? 이런 걸 묻는 것 자체가 당신에게 폐가 될까요.

모르겠네요.

2024년 04월 26일 저녁 10시 반, 자신을 사랑해보고 싶은 당신의 속삭임이.

 
Read more...

from 사랑하는 당신에게

내 사랑, 즐거운 하루 되었나요? 여기는 저녁 8시를 막 넘겼어요. 저는 저녁을 먹고 집에 와서 가볍게 하이볼을 마시고 있어요. 배부르게 먹고 디저트까지 먹으니 배가 터질 것 같아요. 그래서 조금 쉬어가고 있답니다.

오늘 좋은 일이 둘이나 있었어요. 하나는 저번에 좋아하는 그림 작가님께 의뢰한 그림의 중간 작업이 날아왔다는 것이고, 또 하나는 다른 그림 작가님의 이벤트 경품이 도착했단 거예요. 두 분 다 정말 좋아하는 작가님들이라서 정말정말 행복해요.

의뢰했던 그림의 경우는 사실 완성본을 주시려다가 늦어졌다면서 미완성이라며 보내주신 건데요. 열어보고 깜짝 놀랐어요. 이게 미완성일 리가 없잖아!? 싶을 정도로 완성도가 높았으니까요. 그대로 자랑하고 싶은 마음을 얼마나 참아야 했는지 몰라요. 어린 시절에 제가 만든 이야기의 등장인물들을 그린 그림인데 따뜻하고 기분 좋아지는 풍경에 활짝 웃는 얼굴로 그려주셔서 그림을 따라 함께 웃고 말았답니다. 지금도 이런데 작가님 본인이 완성이라고 인정하시는 그림은 어떤 걸지 벌써 궁금해져요. 정말이지, 감동을 주는 분이셔요.

다른 그림 작가님게서 주신 선물은 방금 막 도착해서 열어본 참이에요. 제대로 보지는 못 했어요. 옆에서 불을 꺼버린 사람이 있었거든요. 그림을 제대로 볼 수 없어서 아쉽지만, 이건 시간 여유가 있는 일이니 조금 후에 보려고 해요. 살짝 훑어봤는데 생각보다 양이 훨씬 많고 무척 좋아하는 그림이 있는데다가 새로운 그림도 너무 예뻐서 행복했어요.

사랑하는 사람. 저의 오늘은 생각이 많은 날이었습니다. 제가 좋아하는 장소가 있어요. 여러 사람이 만나서 대화를 나누고 또 흘러가는 그런 곳입니다. 세상에 그런 장소는 많지만 제가 특별히 좋아하는 곳이에요. 그곳에서 이야기를 나눴는데, 머릿속이 조금 복잡해요.

아, 이야기 자체는 별 거 아니었어요. 대화 내용보다는 다른 면에서 생긴 고민이에요.

항상 다양한 화제가 흘러가는 곳이지만 오늘 나온 이야기는 꽤 진지했어요. 사회적인 약자들이 모인 곳에도 상대적인 약자가 있으며 그들에게는 배려가 필요하다는 이야기였거든요. 말만 보면 틀린 말은 아니에요. 그쵸? 약자성은 교차되는 것이니까요. 소수자 내의 또다른 소수자는 당연히 생길 수 밖에 없어요. 하지만 나는 그 이야기를 보고 화가 났어요. 왜냐면 여기서 나온 또다른 소수자는 '정신질환자'였거든요.

당신도 알겠지만 저는 정신과에 다니고 약을 먹고 있는 정신질환자예요. 이 사실을 부끄럽게 여기지도 가슴 아파하지도 않아요. 오히려 저는 제 병을 알고 더 용기를 얻었답니다. 내가 게을러서, 내가 노력하지 않아서, 내가 외면해서 잘 못 해온 게 아니라 단순히 아팠던 거라는 사실을 알게 되었으니까요.

저는 정신질환자로서 다른 정신질환 당사자인 주변 분들의 이야기에 공감해요. 제가 좋아하는 그 장소는 다소 정신질환자에게 냉엄해요. 그래도 저는 그게 반드시 나쁘다고는 생각하지 않거든요. 마냥 오냐오냐 받아주는 것도 분명 좋은 대응은 아니니까요. 단지 조금 더 너그러워졌으면 좋겠다는 바람이네요.

화가 난 건 누군가 그 화제에 편승해서 이 이야기를 단순히 소수자 속의 또다른 소수자, 약자 속의 또다른 약자의 구도로 묶어버렸기 때문이에요. 저는 처음에 '상대적인 약자'가 있다고 썼죠? 소수성은 교차될 수 있기 때문에 여러가지를 동시에 가지고 있는 사람들 중에서 상대적으로 알려지지 않거나, 더 차별받는 약자성을 가진 사람들은 약자들끼리 모인 곳에서도 상대적으로 약자가 될 수 있기 때문이에요.

당신도 알죠? 약자끼리 모이면 보통 서로 물어뜯으면 물어뜯지 서로 배려하고 살지 못해요. 그게 인간이죠. 가장 대표적인 예시라면 빈민가겠죠. 인간은 기본적으로 배려하는 생물이 못 돼요. 궁지에 몰리면 몰릴수록 더욱 그렇죠.

사랑하는 당신. 나는 그 의견에서 배려받지 못하는 약자가 되었어요. 나는 나를 배려해달라고 말한 적이 없는데 그렇게 마치 은혜를 내리듯이, 그런 목소리로요. 한탄하던 지인들도 배려해달라고 하지는 않았어요. 그저 다들 배려하는 척하지만 정신질환자를 대하는 면에선 별로 그런 것 같지 않다는 이야기였지요. 그러고는 또 태연하게 말했지요. 어떤 사람은 자신의 당사자성을 내세워서 모든 것을 용서받으려고 한다고요. 내가 이걸 어떻게 받아들여야할까요? 의견을 낸 당사자에게 물으면 서로 다른 이야기라고 할 거라는 사실을 알아요. 하지만 이걸 동시에 떠올리는 사람에게 내가 어떤 인상을 가지면 좋을까요.

소수자끼리의 연대라는 건 서로의 아픈 곳을 건드리지 않는 것에서 시작한다고 생각해요. 내려다보지도 않고, 올려다보지도 않고, 그저 서로의 존재와 각자의 아픔을 인정해주는 행위를 통해서요. 배려받아야한다고요? 틀렸어요. 나는 배려받아야만 하는 존재가 아니에요. 그렇게 배려를 하사받아야하는 사람이 아니라고요. 나는 그저 인간답게, 동등하게 대우받고 싶어요. 그게 그렇게 어려운가요? 배려는 수단이지 목적이 될 수 없다는 사실, 당신도 알죠?

솔직하게 고백하자면 나는 당신 못지 않게 그 의견을 낸 사람도 제법 사랑해요. 사랑하지 않으면 분노하지도 않겠지요. 아무래도 오늘 저는 사랑하는 사람에게 평범한 인간보다 못한 것을 넘어서 모자란 인간끼리 모인 곳에서도 모자란 사람이란 평가를 들은 것 같아요. 그 사람은 그렇게 생각하지 않겠죠? 그게 너무 화가 나요.

이런 이야기를 한참 했어요. 그러고도 모자라서 당신에게 보낼 편지에 또 한참을 적고 있네요. 그리고 같은 주제를 반복하다가 그런 말을 들었어요. 긁어부스럼이니 주변 사람들을 배려하는 차원에서라도 그만 이야기하자고. 분명 이 이야길 한 사람은 내 입을 막으려는 의도는 아니었어요. 그랬다면 내게 직접 이야기를 했을만한 사람이니까요. 하지만 내가 들리는 곳에서 그렇게 이야기한 건, 분명 내게 들으라는 의도가 있었겠지요.

그래서 머리가 복잡해요. 나는 매우 기분이 나쁜데, 이걸 여기서도 말할 수 없으면 어디가서 말하나. 나는 말하지 않으면 풀리지 않는 사람인데, 말하지 않고 어떻게 풀어야하나. 그런 생각으로요. 이렇게 머리 아프게 고민할 정도로 좋아하는 사람이랍니다. 당신이 그렇게 이야기해도 나는 분명 이만큼 고민을 하겠죠.

사랑하는 당신, 내 긴 한탄을 다 읽어주었을까요? 그랬다면 정말 고마워요. 내가 당신을 얼마나 사랑하는지 수고한 당신에게 다시 한 번 전하고 싶어요. 사랑해요.

내 이야기만 하는 편지가 되어버려서 미안해요. 다음에는 당신 이야기를 듣고 싶어요. 답장 주세요.

2024년 4월 22일 월요일, 심란한 나머지 당신을 귀찮게 만들고 만 속삭임이.

 
Read more...

from 꿈꾸는 어린 용

현재 대안으로 나온 게 세 가지 정도.

  1. 블로그 커스터마이즈 내부 항목인 포스트 시그니처에 이미지를 넣으면 거기서 url을 따와서 넣기
  2. 블로그 커스터마이즈 내부 항목에 프로필 사진 넣는 파트를 만들어서 넣기(DB에 열 추가)
  3. 연합우주 계정에서 프로필 따오기

현실적으로 1번이 가장 가능성이 높기는 하다.

일단은 각 알파벳/숫자로 되어있는 아이콘을 좀 예쁘게 고쳐보는 걸로...

#writefreely

 
Read more...

from 사랑하는 당신에게

안녕, 사랑하는 당신. 나예요.

사랑하는 당신이 보고 싶어서 편지를 써요. 재밌네요. 펜을 들었다던가 종이를 앞에 두었다거나 하는 현실에 있는 물건으로 비유를 하면 참 낭만적이고 당신을 향한 마음이 전해질 것 같은데 글쓰기 에디터를 열었다고 하면 왠지 성의 없어 보여요.

비록 낭만도 멋도 없는 글쓰기 에디터를 통한 편지지만 당신은 내 마음을 알아주겠죠? 믿을게요. 그럴 거라고.

사랑하는 당신. 오늘은 어떤 하루를 보내고 있나요? 여기는 일요일 아침이에요. 이 편지를 읽는 시점에서 당신이 어떤 시간을 보내고 있을지 궁금하네요.

저는 이른 아침 7시에 일어났답니다. 일어나자마자 아침 약을 먹고 커피를 한 잔 마셨어요. 언제부턴가 아침에 따뜻한 카페라떼 한 잔을 마시는 게 습관이 되어버렸어요. 이제는 거르면 아침에 정신이 차려지지 않을 정도예요. 카페인 중독이 아닌가 걱정이 되다가도 아무렴 어때 싶어요.

부지런히 산책도 다녀왔답니다. 겸사겸사 쌓여있는 쓰레기도 버렸어요. 최근 정신과 약을 바꿨는데, 그게 참 도움이 많이 되고 있습니다. 내가 이렇게 슈퍼맨이었나? 싶을 정도로 많은 일을 해내고 있어요. 다른 사람들은 원래 이게 보통인 걸까요, 아니면 약효과로 내가 과하게 활동적이 된 걸까요? 어느 쪽이든 다행이에요. 밀린 일들을 하나하나 해치워가고 있거든요.

산책로

산책을 다녀왔는데 너무너무 예쁜 것들이 많았어요. 세상이 초록색이더라고요. 풀내음과 꽃향기가 바람을 타고 흘렀어요. 머리가 엉망이라 모자를 쓰고 나갔는데 산들산들 부는 바람이 기분 좋아서 모자 속으로 바람을 맞을 수 없는 게 조금 아쉬웠답니다.

산책로를 보여드렸으니 하는 말인데 저는 신축 아파트 단지의 반듯함보다는 오래된 아파트 단지의 구불구불함을 좋아하는 것 같아요. 어딘가가 너무 높지도 너무 낮지도 않고 그저 구불구불 상상의 여지가 많은 그런 아파트 단지요. 물론 신축 아파트 단지에 가면 부지도 넓고 번듯해서 시원하긴 하지만, 거기에서는 지금처럼 사소한 풍경에 정을 들일 수 없을 거란 생각이 들어요. 물론 제가 지금 사는 곳과 비슷한 아파트 단지에서 자랐기 때문에 그런 생각이 드는 걸지도 모르지만요.

사랑하는 당신, 나는 오늘을 이렇게 시작했어요. 당신의 하루가 궁금하네요. 여유가 있다면 답장을 주세요. 당신의 이야기가 듣고 싶어요.

사랑해요.

2024-04-21 일요일 아침. 당신을 사랑하는 속삭임이.

 
Read more...

from 꿈꾸는 어린 용

처음 ADHD를 의심한 건, 아마도 작년 겨울? 쯤이었던 거 같다. 올해 초일 수도 있고.

정확한 시기는 기억 안 나지만 어쨌든 굉장히 우울증이 심하던 때였다. 죽으려고 목에다 날카로운 가위를 들이대고 한참 숨을 골랐던 기억이 있다. 살면서 죽고 싶다고 생각하지 않았던 시기는 없지만, 그 때처럼 이러다 죽을지도 모른다는 생각이 강렬하게 들었던 적도 없었다.

뭐가 계기였는진 모르겠으나 정확히 ADHD를 처음 의심한 건 정확히 그 시기였다. 내 우울의 근원이 여기라는, 확신할 순 없지만 너무나도 강렬한 예감이 들었다. 우울이 워낙 심한 시기여서 진단은 받을 수 없었다. 응급상황이라고 입원하란 권유까지 받았으니까.

기존 병원에서는 검사를 거부하고, 새롭게 예약을 하려니 몇 달을 기다려야하는 상황. 당장 상황을 해결하고 싶었던 나는 조바심에 의사의 조언을 잘 따르고 있음에도 불구하고 심적인 고생이 심했다. 물론, 그렇게 해서 우울증은 좀 나아지긴 했습니다.

그러다가 이사를 하고, 이사하면서 병원을 옮겼는데 의사가 내가 고민하고 있는 걸 듣더니 단호하게 '어렸을 때 공부 잘했으면 ADHD 아니에요.'라고 말했더랬다. 그래서 이렇게 나아졌는데도 아니라고 하는 거 보니 정말 아닌가보다, 하고 마음을 털었다.

그렇게 시간이 흘러 2024년 초. 지인이 ADHD 약을 먹다가 사정이 생겨서 약이 줄어들었고, 그걸 회복하는 과정을 실시간으로 듣게 됐다. 근데 중간에 상태 안 좋을 때 상황이 나랑 너무 비슷한 거야? 배가 충분히 부른데도 계속 뭔가 먹는다거나... 이것만은 아닌데 정확히 기억이 안 난다. 하여간 이 일 덕분에 다시 의심이 고개를 들었고, 나는 한참 SNS에서 이걸 떠들었다.(4월)

ADHD에 관련해서 여러 사람이 여러 답을 주었고, 그걸 다 듣고 나서도 역시 나는 ADHD가 맞는 거 같다는 확신이 들어서 병원 3군데다 검진 예약을 잡았다. 왜냐면 하나는 5월, 하나는 6월, 하나는 10월이었거든... 조금이라도 빨리 받고 싶어서 여기저기 연락했다.

그러다가 4월 12일. 병원 예약을 잡아둔 상태라 가서 이야기를 했다. (약 조절을 하는 중이라 2주 간격이었다.) 처음에는 약간 비웃는 듯이 반응하던 의사가(기분 좀 나빴는데 그냥 이 사람 특성인 것 같다.) 내가 다른 병원에 예약을 잡아놨다고 하니까 반응이 바뀌더라. 여기서도 할 수 있고 당장도 할 수 있대서 그럼 바로 받겠다고 하고 곧장 병원에서 검진을 받았다.

그대로 확진 ^^)... 약의 도움을 받아보겠냐고 질문하길래 그러겠다고 대답하고 콘서타를 받아왔다. 그리고 오늘이다. 여러모로 받아오길 잘했다고 생각한다. 내가 생각보다 앉아서 많이 꼼지락거린다는 사실도 알 게 됐고, 집중하려고 하면 주변의 이야기가 흘러나가는 느낌도 오랜만에 돌아왔고(어릴 때는 아예 안 들리기도 했다.). 식욕도 아주 약간은 줄었다가 돌아왔다. 부작용이긴 하지만 나한텐 필요한 부작용.

연합우주에 콘서타 먹고 느끼는 변화를 적고 있다. *링크 무엇보다 퍼포먼스가 확연히 증가해서 집안일도 조금씩 해치우고 있고, 공부도 된다. 행복해. 단지 문제라면 사람 만나서 하는 행동이 너무 주책없어졌다는 건데... 미래의 내가 해결하길 바란다. 힘내, 나.

부작용도 적고 긍정적으로 작용하고 있으니 다음에 가면 좀 늘려달라고 부탁해볼 예정이다.

#성인ADHD일기

 
Read more...

from 여행당일기 - 메인

세계관 및 캐릭터를 정리하는 정적웹사이트 만들기

자작 캐릭터, 자작 세계관 구상.

평소 만화나 애니메이션을 좋아하는 사람들의 전유물이었는데요,

남녀노소 할 것없이 웹소설이나 웹툰을 대중적으로 접하게 되면서 자작 세계관을 구상해 본 분들이 꽤 되실 것 같아요.

저도 요즘 그쪽에 다시 빠지게 되어 관련 자료를 정리하는 서랍장 같은 툴이 필요하게 되었어요.

사실 평범하게 노션이나 위키를 설치하려고 했는데 노션은 너무 무겁고, 위키는 서버 자원을 추가로 먹게 되어 부담스러웠어요.

그래서 Misskey라는 SNS에 계정 하나를 생성하여, 해당 계정을 단일 세계관의 캐릭터 위키 겸 작품 업로드 게시판으로 쓸 수 있도록 하려고 해요.

CabinetKey

캐비닛키는 사실 자작 세계관 정리용으로 제작되고 있진 않아요.

기본적으로 *.json(별돋조선)의 하위 프로젝트인데,

제목에서 알 수 있듯이 실제 역사 기반으로 돌아가는 작품이다 보니 구체적인 세계관 (역사, 문화, 경제 등) 설정이 필요 없기 때문이에요. 정도전씨가 다 해줬어요

그래서 딱 장소와 캐릭터 에 중점을 두고 기능을 구현하기로 했어요.

타겟

JSON

받아올 json은 이렇게 생겼어요.

{
    "info": {
        "title": "",
        "subTitle": "",
        "summary": "",
        "description": "",
        "mainYear": "",
        "map": "",
        "hashtag": [""]
    },
    "character": {
        "category": [""],
        "list": [
            {
                "avatar": "",
                "name": "",
                "meaning": "",
                "courtesyName": "",
                "nickname": "",
                "lived": [0, 0],
                "category": "",
                "subCategory": "",
                "eventChronology": {
                    "0.0": "",
                    "0.0": "",
                    "0.0": ""
                },
                "positionChronology": {
                    "0.0": "",
                    "0.0": ""
                },
                "relatedTo": {
                    "분류1": [0],
                    "분류2": [0]
                },
                "goal": ["", ""],
                "themeSong": [0],
                "summary": "",
                "description": "",
                "secret": "",
                "hashtag": ""
            }
        ]
    },
    "world": {
        "x,y": {
            "name": "",
            "image": "",
            "summary": "",
            "description": "",
            "eventChronology": {
                "0.0": ""
            },
            "relatedTo": {
                "분류1": [0]
            }
        }
    },
    "themeSong": [
        {
            "embed": "",
            "title": "",
            "artist": "",
            "character": 0,
            "summary": "",
            "description": "",
            "lyrics": ""
        }
    ]
}

기능 구현

구현된 기능

  • 메인 페이지 상에 간단하게 10x10으로 구획된 지도와 캐릭터 목록을 출력해 줘요.
  • 지도 상에 배경이미지를 지정하여, 지도의 각 구획마다 어떤 특징적인 장소가 존재하는지 표시할 수 있어요.
    • 실제 지도와 흡사한 그림을 사용해도 되지만, 수도권 전철노선도처럼 도형화 된 이미지가 좋아요.
  • 지도 상의 각 위치마다, 즉 최대 100개 장소의 정보를 기록할 수 있어요.
  • 캐릭터들의 분류와 하위분류를 설정할 수 있어요.
  • 어떤 캐릭터와 다른 캐릭터들 사이를 관계로 연결시킬 수 있어요. 관계는 분류처럼 작용해요.
  • 지도상의 어떤 장소와 캐릭터들 사이를 관계로 연결시킬 수 있어요. 관계는 분류처럼 작용해요.
  • 캐릭터의 연표가 존재하는데, 캐릭터의 작중 포지션과 사건이 구분되어 있어요.
  • Main Year (작중에서 가장 중점적으로 다루는, 많은 사건이 일어나는 연도) 를 지정할 수 있어요.
    • 캐릭터의 연표상에서 Main Year는 연 단위가 아닌 월 단위로 나타나고, 접어도 접히지 않아요.
  • 특정 연도를 지정하면(초기값은 Main Year로 설정되어 있어요), 그 연도에 살아 있는 캐릭터들만 볼 수 있어요.

구현할 기능

  • 모바일 화면과 같은 작은 세로화면에 대응할 계획이에요.
  • 세계관소개, 작품모음 페이지를 추가할 계획이에요.
  • 캐릭터처럼, 지도상에서의 공간 변화나 장소 이전을 반영할 수 있도록 해 볼 예정이에요.
  • 작품목록과 별개로, 캐릭터의 테마곡을 몇 곡 지정할 수 있어요.
    • 임베딩 기능을 사용하므로 기성 곡이든 자작곡이든 다 가능해요.
    • 곡 정보 페이지도 개설할 수 있어요.

미스키 연동 기능

  • 처음 로그인하면 미스키에 cabinetkey.json 페이지가 개설되어요. 여기에서 대부분의 내용을 작성하고 수정해요.
    • 캐릭터 정보, 월드 정보는 미스키 내부가 아니라 캐비닛키 사이트에서 추가, 수정, 삭제할 수 있어요.
  • 해시태그 기능으로 미스키 노트에서 각 캐릭터와 관계된 작품을 불러올 수 있어요.
  • 해시태그 기능으로 미스키 노트 중 캐릭터와 관계된 사소한 이야기를 불러올 수 있어요.
    • 이런 작품과 이야기는 캐비닛키 사이트에서 추가 및 삭제할 수 있어요.
    • 미스키에서는 수정 기능이 없는데요, 대신 삭제 및 편집 기능으로 수정된 작품을 재게시 할 수 있도록 할 예정이에요.

#CabinetKey

 
Read more...

from 여행당일기 - 메인

어디까지나 가설에 불과하며, 검증과정을 거칠 예정은 없습니다.

수식

저의 모델에선 로그함수를 이용해서 이미지 데이터를 노멀라이징 했기 때문에,

모델이 생성해 준 이미지를 stft 이미지로 변경하는 데에는 다음과 같은 지수함수를 이용해야 합니다.

$$ y = ae^{bx} $$

그리고 이 지수함수는 원칙 상 처음 stft 이미지를 노멀라이징 한 함수의 역함수를 사용하면 됩니다.

그러나 실제로 완성된 모델에 역함수를 바로 적용하면 당황스러운 상황을 마주하게 될 것입니다.

대략 두 경우 중 하나이며, 때로는 둘 다 해당될 수도 있습니다.

  • 소리에 갈라짐이 있는 경우.
  • 소리가 먹먹한 경우.

갈라짐이 있는 경우는 가장 판단하기 쉬우며 자주 발생합니다.

먹먹한 경우는 변환된 소리만 단독으로 들었을 때는 판단하기 어렵습니다만,

레퍼런스가 될 만한 원본 목소리를 같이 틀어보면 먹먹하다는 것을 바로 알 수 있습니다.

완성된 모델의 문제점 중 이 두 경우는 의외로 모델을 직접 건드리지 않고도 고칠 수 있는 경우에 해당합니다.

다만 모델에 따라 무려 보컬 에디터에서 수식을 직접 계산해 보며 조정해야 하는 점이 문제라면 문제여서,

이 점은 모델을 만들 때 수식을 계산해서 적용할 수 있도록 보완해 볼 계획입니다.

자, 그러면 두 경우가 어째서 발생하고, 어째서 제가 고칠 수 있다 고 하는지 한번 알아봅시다.

갈라짐이 심한 경우

사실 딥러닝을 통해 파동이 아닌 주파수의 이미지를 생성했기 때문에 발생하는 문제이지, 자연적인 소리라면 존재해서는 안 되는 경우랍니다.

소리가 갈라지는 이유는 여러 종류의 서로 다른 소리가 중첩되어 들리는 것으로 볼 수 있습니다.

제 모델의 경우 소리는 대체로 두 개로 분리되어 들리게 되는데, 그것은 stft 이미지의 맨 아래 첫째줄과 둘째줄에서 나오는 소리입니다.

img

아래의 첫째줄과 둘째줄까지 밝기가 강렬해 보이죠?

이 두 소리가 거의 경쟁적인데도 완벽한 배음을 이루지 못하게 되면서 불협에 가까운 소리가 나는 것으로 파악됩니다.

이 문제를 해결하기 위해서

먹먹한 경우

먹먹한 소리가 나는 이유는 고음역대 신호가 약해서 입니다. 이 경우 단순히 저음역 대비 고음역대 신호를 올려 주기 위해 기울기를 감소시키면 되는데,

먹먹한 경우

다음 4가지 식을 만족하는 함수

$$ g(x) = a'e^{b'x}+c' $$

가 필요합니다.

  • \(f(-1) = g(-1)\) : 이것을 만족하지 않으면 전체 구간에 잡음이 낍니다.
  • \(f'(1) = g'(1)\): 이것을 만족하지 않으면 소리가 선명해짐과 동시에 갈라지거나, 오히려 더 먹먹해집니다.
  • \(f'(0) < g'(0)\) 이며 \(f''(0) > g''(0)\) : 이것을 만족하지 않으면 먹먹함이 해결되지 않습니다.

으로부터 다음과 같은 식이 얻어집니다.

$$ ae^{-b} = a'e^{-b'} + c' $$ $$ abe^{b} = a'b'e^{b'} $$ $$ b > b', a < a' $$

이 식을 풀면, 다음과 같은 방법으로 \(a', b', c'\) 을 구할 수 있습니다.

  • \( b' < b \) 를 만족하는 임의의 \( b'\) ( \( b'\) 값 결정)
  • \( a' = \frac{abe^{b}}{b'e^{b'}} \) 을 만족하는 하나의 \( a'\)
  • \( c' = ae^{-b} – a'e^{-b'} \) 을 만족하는 하나의 \( c'\)

예를 들어, 지금 먹먹한 현상을 보이는 변환식이

$$ 0.0837e^{7x} $$

인 경우 \( a = 0.0837 \) , \( b = 7 \) 이 되겠습니다.

우선 \( b' \) 의 경우 7보다 작은 임의의 숫자인 6으로 잡겠습니다.

그리고 두번째 식으로부터,

$$ a'= \frac{0.0837\times{7}e^{7}}{6e^{6}} = 0.265 $$

로 결정합니다.

마지막으로,

$$ c' = 0.0837e^{-7} – 0.265e^{-6.5} = – 0.000322 $$

을 구합니다.

이 세 값을 앞의 수식에 대입해서 변환식을

$$ 0.265e^{6x} – 0.000322 $$

로 최종 수정합니다.

 
Read more...

from 꿈꾸는 어린 용

친구들과 쇼핑을 하고 하루 자면서 파자마 파티를 했다. 쇼핑은 사실 반쯤 실패였는데 옷은 건졌으니 좋은 게 좋은 거 아닐까?

왜 실패하면 부평 지하상가를 갔어야 했는데 이름을 착각해서 부천 지하상가를 돌았다. 너무 좁아서 이게 뭐지? 싶었는데 잘못 간 거더라. 그치만 내 취향인 빈티지풍 가게를 찾아서 다같이 옷을 건졌으니 뭐 좋은 게 좋은 거 아닐까? 라는 생각.

무엇보다 파자마를 사서 같이 파자마 파티를 하기로 정했다는 점에서 정말 좋았다. 파자마는 나한텐 작아서 나린이 줬지만 ㅋㅋㅋ 밤에 수다 떨 때는 입었다. 다 같이 같은 가게에서 산 파자마라서 정말 기분 좋았다. 무엇보다 노찌님한테 잘 어울려서 최고였다.

재밌었던 건 내가 자고 갈까 말을 꺼냈다가 생각해보니 약이 없어서 안 된다고 했더니 노찌님이 어떻게든 같이 놀기 위해 쏘카를 빌려서 우리집까지 갔다가 노찌님네로 갔다는 거. 이렇게 적극적으로 같이 가자고 하자고 할 줄은 몰라서 놀랐다.

아침 5시까지 밤새껏 떠들면서 온갖 이야기를 하고, 약 먹고 잠들었다.

기상은 아침 9~10시. 왜 정확한 시간이 아니냐면 9시부터 깨서 일어나려고 애썼기 때문이지. 그치만 다른 사람들이 자고 있었기 때문에 얌전히 혼자 놀았다. 원래는 과제를 하려고 노트북을 가져갔는데 도무지 하고 싶지 않아서 그만두었다.

점심쯤 다들 일어나서 첫 끼니로 냉면을 먹었다. 비빔 냉면 먹었더니 결국 튀겼다...

두 분을 새 옷으로 갈아입히고(어?) 나들이를 다녀왔다. 날씨가 좋아서 공원에서 앉아서 한참 떠들다가 카페에 가서 또 잠깐 떠들다 집으로 왔다. 나링이네가 벚꽃놀이를 가서 집에 가는 길에 노찌님네가 있어서 나 태워달라고 했다. 그래서 20시 근처까지 놀다가 잠깐 쉬고 테이크아웃 되었다.

집에 와서는 머리가 살짝 아프고 노곤해서 다른 걸 딱히 하진 않고 누워서 놀다가 잤다. 정말 즐거웠다.

 
Read more...

from 여행당일기 - 메인

데이터셋의 preprocessing 이야기, 그리고 최고의 메모리 관리는 메모리를 늘리는 것이라는 이야기

우선, 어느 정도 완성된 모델의 목소리를 들어 보도록 합시다.

epoch 45 정도 돌린 것이니 사실상 거의 학습이 끝났다고 보아도 됩니다.

물론 epoch 53 돌고 있는 지금도 로스는 꾸준히 내려가고 있긴 합니다만...

데이터셋 라벨링 – 임의 음소 지정

미캉톤의 데이터셋은 음절 단위가 아니라 음소 단위이기에,

음절 단위의 라벨 데이터를 음소 단위로 직접 나누어 주어야 한다... 고 생각했습니다.

하지만 아니었습니다.

각 음소의 길이까지 학습할 거라면 그게 맞지만, 미캉톤의 경우 모델 실행 코드(에디터) 에서 음소의 길이를 임의로 지정하고 있습니다.

    if len(syl) > 0:
      for j in range(len(syl)):
        if syl[j] in 'aeiouNT':
          timeV += 1
        elif syl[j] in 'wy':
          timeC += 1
      if timeV > 0:
        lenV = (time - timeC*1)/timeV
      else :
        lenV = time
      for j in range(len(syl)):
        if j > 0:
          if syl[j-1] in 'aeiouNT':
            timeArr.append(timeArr[-1]+lenV)
          elif syl[j-1] in 'wy':
            timeArr.append(timeArr[-1] + 1)
          elif syl[j-1] in 'rktp' or syl[j-1] == 'ch' or syl[j-1] == 'ts':
            timeArr[-1] = timeArr[-1] - 1
            timeArr.append(timeArr[-1] + 1)
          else:
            timeArr[-1] = timeArr[-1] - 2
            timeArr.append(timeArr[-1] + 2)
        else:
          timeArr.append(0)

이것은

  • 우선, 각 노트에 포함된 모음의 개수 + 받침의 개수(일본어는 받침이 1음절이기 때문입니다.) 를 1음절이라고 보고 해당 노트를 n등분 해 주고
    • 한국어 라이브러리를 만들 경우 이 부분은 수정해야 합니다.
  • w나 y같은 반모음은 노트 안에 포함된 자음이라고 보고 1단위만큼 할당해 주고
  • 나머지 자음은 노트 밖에 포함된 자음이라고 보고
  • 짧은 자음은 1단위만큼 노트 이전에 할당해 주고
  • 긴 자음(음가가 있는 자음)은 2단위만큼 노트 이전에 할당해 주는

코드입니다.

개인의 발성 습관을 고려하지 않고 일괄적으로 발성 시간을 통일해 주었기 때문에,

기존의 정확한 라벨링 데이터를 사용하면 오히려 부자연스러워지게 됩니다.

그런데 음절 단위로 라벨링을 한 다음, 방금 제시한 코드대로 자음과 모음을 임의로 지정해 준다면

컴퓨터는 그 임의로 지정한 음소들 사이에서 규칙을 찾아서 자연스러운 결과를 도출하게 됩니다.

입력 데이터의 길이에 상관 없이 입력 받기

이런 식이라면, 굳이 힘들게 라벨링 작업을 한 번 더 할 필요 없이,

그냥 제공받은 원본 데이터와 라벨 데이터를 그대로 입력해 주면 되는 것입니다.

대신 기존에는 모든 파일을 15초씩 수동으로 끊어서 입력했는데,

이 부분을 수정해서 일단 파일을 그대로 입력받고, 알아서 필요한 길이만큼 잘라 주는 코드를 작성해서 적용했습니다.

그러니 데이터셋의 준비가 거의 몇 분 만에 끝났습니다.

그러나.. 메모리의 역습

자, 그렇게 준비된 저의 데이터셋은 약 130분 분량으로, 5초씩 끊어 별도의 이미지로 저장하고 있기 때문에 총 1562개의 세트가 들어 있습니다.

1562장의, 512x512픽셀의 RGB 이미지, 인풋 아웃풋 2장.

그리고 이걸 하나의 텐서로서 관리합니다.

단순히 계산해 보면 13기가바이트 정도의 메모리를 잡습니다.

변수를 아무리 재활용해가며 메모리 관리를 해도 이미 텐서 하나가 13기가바이트이기에,

일반적인 컴퓨터에서 돌리긴 어렵습니다.

img

구글에서 기본적으로 제공하는 T4 GPU + 12GB CPU 메모리 + 15GB GPU 메모리 역시 사용할 수 없습니다.

img

대신 런타임 유형 변경에서 TPU v2를 선택하면, 제가 Colab Pro를 구독하고 있어서 그런지 300기가바이트 정도의 메모리를 할당해 주는데,

여기에서 작업을 하면 메모리 문제를 생각하지 않고 여유로운 작업이 가능합니다.

(대신 학습속도가 4배나 느리긴 합니다... -_–)

img

이렇게 15시간 정도 학습시킨 결과물입니다. (T4 기준이면 4시간 좀 안될 겁니다.)

위 영상은 12시간짜리 결과물이구요.... (그리고 T4 기준 3시간 ㅠ)

 
Read more...

from 여행당일기 - 메인

잡음을 어느정도 처리했으며, segment 사이의 격차를 줄이는 스무딩 작업을 진행했습니다.

고주파 대역 잡음 처리

문제 제기

현재까지의 MIKANTONE 모델은 input data에 없었던 고주파 대역 잡음이 계속 섞여들어왔습니다.

예를 들면 이런 식이었습니다. y=350 즈음에 밝은 점이 군데군데 찍혀 있는 게 보이죠.

img

이걸 직접 소리로 들어보면, 다음 영상과 같이 계속 높고 날카로운 소리가 섞여 듣기 불편합니다.

보다 쉬운 분석을 위해 DAW 상에서 이퀄라이저를 켜 보면, 이 날카로운 소리는 6000-10000Hz에 걸쳐 있습니다.

이 대역은 인간의 목소리 중 칼칼함을 더해 주며 ㅈ, ㅊ, ㅆ등의 잇소리를 담당하는 부분인데,

(그래서 너무 거슬린다 싶으면 디에서로 눌러 주기도 합니다.)

중요한 부분이라 노이즈 제거한답시고 아예 High-cut으로 잘라내 버리면 소리가 엄청나게 먹먹해지게 됩니다.

해결

이걸 어떻게 따로 처리를 해야 하나,

스무딩을 해야 하나(그러면 당연히 소리가 뭉그러집니다.)

디노이즈만을 담당하는 AI 모델을 따로 만들어야 하나 생각하고 있었는데,

생각보다 간단한 방법으로 처리가 가능했습니다.

우선 “고주파 대역” 에 대한 것입니다.

우리의 목소리는 생각보다 높지 않기에, 대부분 메인 파형은 중음역대에 걸쳐 있습니다.

위 이미지도 보시면 밝은 점이 찍혀있는 부근에서는 기본적으로 그렇게 센 신호가 나오지 않습니다.

반대로 노이즈 자체의 신호는 굉장히 셌습니다.

어느정도냐 하면 아무리 컴프레서를 걸어도 걸어도 노이즈만 들리면 클리핑이 생겼을 정도였죠.

하지만 그렇다고 저음역-중음역대의 신호보다 눈에 띄게 강한 것은 아니었습니다.

클리핑이 생겼던 건 고음역대라 특히 더 크게 들렸나 봅니다.

아무튼 그러니, 고주파 대역에서”만” 특정 임계값보다 강한 신호가 있으면 제거해 주면 되는 일이었습니다.

그러면 제가 할 일은 단지 코드 한 줄을 추가하는 것입니다.

prediction[200:][prediction[200:] > 7] = 0.000001

여기에서 prediction은 모델을 통해 도출된 output 이미지입니다.

prediction의 첫번째 차원 index가 200과 같거나 큰 모든 원소에 대해서,

(즉 고주파 영역대의 신호를 나타내는 모든 원소에 대해서,)

그 원소의 수치가 제가 설정한 임계값보다 크면 (일단은 10으로 설정했다가, 7로 낮추었습니다.)

원래 값을 무시하고 0에 가까운 값으로 대치합니다.

0에 가까운 값인 이유는, 앞으로 저의 모델에 대해서 이야기할 기회가 있으면 설명하겠지만,

결과값 그래프 자체가 로그 스케일이기 때문입니다.

img

이와 같이 튀는 값이 많이 사라졌습니다.

(두번째 그래프가 STFT 그래프, 세번째 그래프가 파형 그래프인데 둘 다 튀는 값이 사라졌어요.)

스무딩 작업

MIKANTONE은 규격이 정해진 img to img 변환을 사용하기 때문에, 가변적인 길이에 취약합니다. 현재까지 5초짜리 음원을 생성할 수 있습니다.

그리고 일반적인 음원은 3분 – 4분 정도의 길이이므로,

지금까지 미캉톤은 5초짜리 STFT 그래프를 전부 갖다 붙여서 GriffinLim 변환을 하는 단순한 방법을 사용했답니다.

하지만 이렇게 하면 당연히 중간에 음높이, 음량 등의 급격한 변화가 생기는 구간이 있게 됩니다.

이번 기회에 각 STFT 그래프들끼리 '겹치는 구간'을 만들어 두 그래프의 값을 평균 내는 식으로 스무딩을 진행해 주었습니다.

잡음 처리, 스무딩 작업이 완료된 후의 음원입니다. 고음역대의 잡음 및 끊김이 거의 없는 것을 보실 수 있습니다.

후기

확실히 지난 최적화도 그렇고, 2023년 중순의 저보다 2024년 초의 저는,

비록 언어가 다르긴 했지만, 그 사이에 이것저것 다양하게 코드를 짜 보아서 그런지,

좀더 많은 문제에 좀더 유연하고 지혜롭게 대처할 수 있었습니다.

발전이 보여서 매우 기쁩니다.

 
Read more...

from ほとラズ의 블로그

CSS 웹폰트로 코드 파트를 Comic MonoD2Coding으로 표시되게 변경했어요!

css:

@font-face {
    font-family: 'Comic-Mono'
    src: url('https://cdn.jsdelivr.net/npm/[email protected]/ComicMono.ttf');
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'D2Coding';
    src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/[email protected]/D2Coding.woff') format('woff');
    font-weight: normal;
    font-style: normal;
}

code, pre {
    font-family: 'Comic-Mono', 'D2Coding' !important;
}
 
Read more...