Neural narratives in Python #9

I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants like in Mantella. Here’s the GitHub repo.

The previous part ended with our hardened player character returning home after an encounter with an arrogant student. At three in the morning, the following happens:

Now, a fundamental problems happens. How do you find clues in a room without making it up through a conversation? You don’t. A Dungeon Master of sorts would decide on the results of the investigation. That means I need to program a whole new thing in.

Maybe a week ago, I programmed the concept of a Goal Resolution: you gave the large language model a goal and it decided whether or not it was successful, and to what degree, according to the information provided and its own whims. But I quickly realized that it was too broad a concept: when you’re trying to accomplish something, you’re not pursuing “a goal”; you’re trying to investigate, to research, to trade, etc. A few days ago I created the concept of a Research action, which is constrained solely to that notion. Here is, why not, the prompt I send to the AI so it will come up with a resolution:

You are to generate a detailed narrative describing the player's attempt at a Research action within a rich, immersive world. Use the provided information about the player, their followers, the world's conditions, and the specific locations involved. Your narrative should be engaging and realistic, reflecting the player's abilities and circumstances.

Instructions:

1. Viability and Realism Assessment:

- Carefully consider whether the player's research goal is achievable based on:
The information about the player.
The abilities and resources of any followers accompanying the player.
The characteristics of the location, including available resources, accessibility, and any restrictions.
The time of day and how it might affect the research attempt.

2. Narrative of the Research Attempt:

Write two or three descriptive paragraphs detailing the player's research endeavor.
Include specific actions taken by the player and their followers.
Describe interactions with the environment, use of equipment, and any obstacles or challenges faced.
Ensure the attempt aligns with the world's lore and the player's personal history.

3. Outcome - Impact of the Research:

Determine the results of the research action based on the assessment.
You must be specific about what the player has discovered: this is the memory that will get saved.
Detail any new knowledge gained, abilities unlocked, or crucial information discovered.
If the research was partially successful or failed, explain what was learned or why it didn't succeed fully.

4. Consequences - Cost of the Research:

- Describe the costs associated with the research action, such as:
Time consumed and its implications.
Use or loss of resources and equipment.
Physical or mental strain on the player and followers.
Potential negative repercussions, such as drawing unwanted attention or causing disturbances.
Use your judgement to determine the extent of the consequences, according to all the information provided.
Important: the consequences are an account of the costs of the research effort, looking back now that it's finished. Do not continue the narrative nor project into the future.

5. Tone and Style:

Write in the third person, past tense, maintaining an engaging and immersive narrative style.
Ensure consistency with the established world setting and the player's character.

Provided Information:

- Time of Day: {hour} {time_of_day}
- World Description: {world_description}
- Region Description: {region_description}
- Area Description: {area_description}
{location_description}
Player and Followers Information:
- Name: {player_name}
- Description: {player_description}
- Personality: {player_personality}
- Profile: {player_profile}
- Likes: {player_likes}
- Dislikes: {player_dislikes}
- Speech patterns: {player_speech_patterns}
- Health: {player_health}
- Equipment: {player_equipment}
-----
{followers_information}
- Memories:
{combined_memories}

- Research Goal: {research_goal}

Example Format:

"Seeking to unravel the mysteries of the ancient sigils, the tall, cloaked figure of [Player Name] entered the dimly lit archives of the Grand Library. Clutching the worn tome of cryptic symbols, they, alongside their ever-curious companion [Follower Name], began sifting through scrolls and manuscripts..."

Your Task:

Using the above instructions and information, craft a compelling narrative that captures the essence of the player's Research action, reflecting both the potential rewards and the inherent costs.

That worked well enough, but investigating a missing teenager’s room isn’t “research,” so I need to create a whole new page for my app.

Creating the Investigate page took me a few hours. In the end, the user has to provide an investigation goal and the facts already known about the case (I don’t trust the AI enough to be able to glean them from the memories of the involved characters). It produced the following outcome and consequences:

Oho, the plot thickens! It seems I’ll make a visit to the university in the morning to interrogate this college student. First, though, I needed to know the opinion of the missing girl’s father.

We hurried to the police station to meet my character’s partner.

I didn’t plan to, but this is a fantastic opportunity to test the Research action. Yet another example of how dynamic and unpredictable this system is.

That worked out perfectly. So this Elara Thorn and her team may have bitten more than they could chew, and maybe made some innocents disappear in the process.

Through testing both the Investigate and the Research actions, I’ve learned that the Consequences part that I ask the LLM to produce is completely useless. Great. That saves some computing power.

My player character’s partner returned to the station.

Neural narratives in Python #8

I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants like in Mantella. Here’s the GitHub repo.

The last entry ended when I had managed to add a hole-in-the-wall to the ongoing story. Let’s enter it and allow the player character to describe it.

Every time you enter a new location, the app checks if there is a list of character generation guidelines already created for this combination of places, and if there isn’t, it generates that list. After a short while, the app produced the following:

That one about a brilliant university student sounds like a great contrast to the existing characters. I pressed the button that generates a new character, and at the end of that process, the app presented me with the following portrait:

That looks real good. Great job on the fingers, AI. However, the large language model named this character Elara Thorn, the exact name that was generated for a character in another one of my trial-run stories with this system. Perhaps at some point I’ll need to program a way of reading names from a gigantic list, then presenting the AI with about twenty random ones to choose from.

Anyway, let’s have a multi-char convo.

After such a tense conversation, I figured that the player character would reflect on it, as well as his general circumstances. I happened to have implemented a system for self-reflection: the large language model looks at the character’s memories, then writes a sort of journal entry from the first-person perspective. It gets saved along with the rest of the memories. That helps color the dialogue and in general make the character sound more intelligent. Of course, now I generate audio files of those self-reflections as well.

My hardened player character returned home. I’ll let him describe his living arrangements.

I can imagine the player character returning to work the following day, only to be introduced to some troubled citizen who will present him with a case. However, I have also programmed a way of generating story concepts, interesting situations, interesting dilemmas, and interesting goals, in case the user isn’t too sure how to continue. Let’s generate a few.

Here are a few intriguing concepts the app has generated. When crafting any of these notions, the large language model is presented with the player’s information and that of his followers, and also all the available information about his location (world, region, area, and possibly location).

I should probably turn those post-its into something else, like papers or something, because such long texts look funky in a vertical format. That’s a minor issue in any case.

Investigating a series of gruesome murders connected to the otherworldly horrors sounds good for a story, and even more if the encounter with the arrogant student earlier does hint at a larger plot involving a secret society of reckless scholars. I also like the notion of a neighbor calling on his door to ask for his help because the person’s daughter has gone missing. Also, the sort of post-apocalyptic story of the grizzled detective leading a ragtag group as they fight against the pouring eldritch horrors sounds pretty fucking dope.

How about general goals?

Some of those are interesting. The disappeared scholar could easily be the aforementioned college girl, so how would the detectives feel about investigating her disappearance? The goal about infiltrating a cult makes me think that I would need a way of altering a character’s description so they can pass undercover, because other characters are fed the participants’ description during a conversation. And again, someone is requesting the detective’s help to find their missing child.

Neural narratives in Python #7

I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants like in Mantella. Here’s the GitHub repo.

Last time, I managed to nail creating voice lines for the dialogues of my app, relying on a RunPod server dedicated to generating audio. Now I want to go on a serious test run of app to see what it lacks.

Starting from scratch, I created a new world, a new region of that world, a new area of that region, and a new location of that area. I won’t detail the specifics, because the app itself should do it like a story would do, so if in the course of testing the system I feel that something must be implemented to cover for the shortcomings, I will do so.

The process of creating a new playthrough requires you to provide some notion of the character you want to play as. I ended up with a good depiction of the guy.

I have the initial setting and the player character (including his automatically assigned voice model). A story needs other characters, so I went to the section that shows the character creation guidelines that have been generated for this combination of places.

I turned them into post-its. Anyway, my protagonist is a police detective, so he could do with a partner. I grabbed the second guideline and made her a woman.

The app doesn’t allow you to access most of the specific data of a character except in very paricular circumstances, so in general, you have to glean the specifics of a character from their looks and the conversations you have with them.

In a story, you need some sense of where you are. There’s a system in place for the LLM to generate a description from the first-person perspective of the player character, and at this point it’s trivial to generate a voice line for it:

Let’s interact with the sole other character around (for now). As I was running a conversation with the protagonist’s partner, I ran across the first issue: when the app had to generate a voice line for a bit of ambient text, the server (the RunPod pod) returned a 404. I guess that even if a pod is technically running, it could intermittently produce 404 errors for whatever reason. I guess I’ll need to program in some retry system to cover these cases.

I did do that. Let’s continue.

The “stop your a coffee” was my blunder. Old, stupid fingers.

The couple of grizzled detectives exited the police station, back to the grim city surrounding it.

Now I want my characters to move to the mentioned location, some bar. Even though I didn’t create any other locations for this run other than the police station, there is a lingering issue with the interface: when plenty of possible locations exist, if you press the button “Search for location,” it may link locations you don’t want (like a cave, a hospital, etc.). Now that I was looking specifically for a bar, I figured that I may as well fix this issue.

It took quite a while, but now the user can only search locations by a type. In fact, if no locations are available, because they have already been used or they don’t match the area’s categories (you don’t want a fantasy bar in a cosmic horror story), the select and the button will be disabled.

Well, that was all for today. I expected to do more, but reworking that interface was arduous.

Neural narratives in Python #6

I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants like in Mantella. Here’s the GitHub repo.

In the previous entry, I came up with the notion of producing audio voice lines for the conversations. Mantella had spoiled me in that regard: hearing those fictional characters answering you in reasonably good voices while you stared at them did wonders for immersion. And it was a bad idea to shove that possibility into my mind, because it prevented me from sleeping last night. Instead, I moved to my desk at three in the morning and started implementing it. Now, every generated character gets assigned a voice model according to their peculiarities, and each speech turn produces voice lines that the user can play through clicking the speech bubbles. It works perfectly.

I learned that it’s a terrible idea to play audio server-side, because it crashes the server. Flask, the web framework that my app is programmed in, or maybe it happens in all web systems, also doesn’t allow the client to access any file in the server, so I had to move all the audio-playing logic to Javascript.

Given this example chat I had with a new character, who had been assigned a matching voice automatically among the relatively few I’ve introduced into the system so far:

The short convo produced this audio exchange:

Like in the original Mantella system, the quality of voice models varies greatly; sometimes they sound like theater students reading a script, recorded on a home mic. Also, the process of generating the clips sometimes shears the very end of their final sentence. Still, I can hardly complain. Listening to the characters adds so much life to the conversations you can have through this app that I see myself enjoying it for a long time to come (and not only for smut).

I’m amazed that I got this running. So, how did it happen?

In the beginning, I thought that setting up my own, local XTTS server (XTTS being a model for generating voice lines) was a good idea. I struggled through every step of the way for a few hours, fighting against obscure documentation, until I finally managed to generate a sample voice line, only to find out that it sounded like ass. Why, I have no idea. So I discarded that notion and instead I looked into Mantella’s codebase, which is up at GitHub, to see how they connected to the RunPod pods to request voice generation. RunPod is a sort of online renting system of computer and server time: you can set up a pre-configured little server that all it does is generate voice lines, and as long as you can connect to it, you’re set. Only costs seventeen cents an hour, too. Once I managed to query the list of available voice models from the RunPod pod, I knew I was going to get through this thing.

So, I had a list of all possible voice models I could rely on, and it turned out to be about five hundred fifty. They are trained from game voices, so there’s a whole breadth of possible voices one can use. How to classify them? Should I create a page on my site with a simple select box, letting the user (meaning me) scroll through a list that long?

ChatGPT, even its latest Orion preview version, clarified that it knows of no online service that could classify the more than five hundred voice samples I had produced from those voice models. I would have to do it manually, but in the beginning it would be enough with having introduced twenty or so models into the system. What tags can be applied to a voice? I relied on ChatGPT to figure that out. Now that I have that list, classifying each voice model is as easy, but time consuming, as listening to that sample on a loop while adding appropriate tags. I have ended up, so far, with the following JSON file of voice models:

{
  "npcmmel": [
    "MALE",
    "ADULT",
    "CONFIDENT",
    "STEADY",
    "SMOOTH",
    "CLEAR",
    "FORMAL",
    "CHARMING",
    "NO SPECIAL EFFECTS"
  ],
  "npcmlucasmiller": [
    "MALE",
    "ADULT",
    "CALM",
    "FAST-PACED",
    "SMOOTH",
    "CASUAL",
    "KIND",
    "NO SPECIAL EFFECTS"
  ],
  "robotmsnanny": [
    "FEMALE",
    "YOUNG ADULT",
    "STEADY",
    "WARM",
    "CASUAL",
    "MELODIC",
    "YOUTHFUL",
    "NO SPECIAL EFFECTS"
  ],
  "npcma951": [
    "MALE",
    "ADULT",
    "ANXIOUS",
    "SLOW",
    "AIRY",
    "SKEPTICAL",
    "NO SPECIAL EFFECTS"
  ],
  "npcfphyllisdaily": [
    "FEMALE",
    "ADULT",
    "STOIC",
    "SLOW",
    "MONOTONE",
    "INSTRUCTIONAL",
    "CALCULATING",
    "NO SPECIAL EFFECTS"
  ],
  "femalechild": [
    "FEMALE",
    "CHILDLIKE",
    "PLAYFUL",
    "STEADY",
    "AIRY",
    "MELODIC",
    "INNOCENT",
    "NO SPECIAL EFFECTS"
  ],
  "femaleyoungeager": [
    "FEMALE",
    "YOUNG ADULT",
    "HOPEFUL",
    "FAST-PACED",
    "CLEAR",
    "INTENSE",
    "OPTIMISTIC",
    "NO SPECIAL EFFECTS"
  ],
  "femalevampire": [
    "FEMALE",
    "MIDDLE-AGED",
    "ARROGANT",
    "STEADY",
    "SMOOTH",
    "AUTHORITATIVE",
    "CYNICAL",
    "NO SPECIAL EFFECTS"
  ],
  "femalekhajiit": [
    "FEMALE",
    "ADULT",
    "CALM",
    "STEADY",
    "GRAVELLY",
    "CASUAL",
    "PHILOSOPHICAL",
    "NO SPECIAL EFFECTS"
  ],
  "femaleuniqueghost": [
    "FEMALE",
    "YOUNG ADULT",
    "RESIGNED",
    "STEADY",
    "ETHEREAL",
    "MELODIC",
    "INNOCENT",
    "GHOSTLY"
  ],
  "femaleghoul": [
    "FEMALE",
    "ADULT",
    "MENACING",
    "STEADY",
    "RASPY",
    "INTENSE",
    "ENERGETIC",
    "NO SPECIAL EFFECTS"
  ],
  "femaleboston": [
    "FEMALE",
    "ADULT",
    "CALM",
    "DRAWLING",
    "SOFT-SPOKEN",
    "WARM",
    "FLIRTATIOUS",
    "SULTRY",
    "NO SPECIAL EFFECTS"
  ]
}

I wrote a function that narrows down the list of possible categories of tags: gender, age, emotion, tempo, volume, texture, style, personality, and special effects. If at some point there’s no matching voice models, it returns a random one from the previous filtering. I’ll probably program in the characters section of the site a simple button that redoes the process for any existing character, in case any other random fitting voice may work better.

That’s all, I guess. When I first got the idea about programming this conversation system with characters controlled by large language models, I knew that programming the multi-char convos would be the most difficult thing. The second most difficult thing that I pictured was actually making them talk out loud. No idea what big thing could be coming next. Anyway, back to the brothel.

EDIT: here’s a multi-char convo in audiobook form.

Neural narratives in Python #5

I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants like in Mantella. Here’s the GitHub repo.

Today I’ve been busy fully redesigning my web app, now that it includes plenty of interesting features.

Index page:

What it allows you to do is pretty self-explanatory, which is good. The relationship between the places is World > Region > Area > Location, and each of them have specific behavior in-game.

Story hub:

This one requires some explanation: at any point, the user can demand the system to generate story concepts, interesting situations, and interesting dilemmas. The large language model (the AI) will take into account all the info about the character, his or her followers, and their memories, to generate concepts, interesting situations and dilemmas that may fit what’s been going on.

Here are some examples of the interesting dilemmas the system can generate. Each “post-it” can be removed by just clicking on it. And now that I think about it, maybe I should make them yellow too.

Characters hub:

The player character front and center. The character images are generated by courtesy of an OpenAI model, that is provided a special prompt crafted from the character’s information.

Character generation:

Originally I told the AI to generate whatever characters it pleased based on the world, region, area and possibly location, but it ended up creating very similar characters: for example, in a police station, it would create a succession of serious detectives. So I programmed an intermediate step in which the AI creates character generation guidelines focused on coming up with a breadth of possible characters for that place. Of course, it also respects genre.

Character memories:

After each chat (and some other activities), a summary is created of what just took place, and is stored in the memories of all the participants. Those memories are loaded in most activities, and they color the characters’ dialogues and decisions. You can also generate self-reflections: the character, according to their personality, meditates upon their experiences, and writes a sort of journal entry about it, that goes into their memories to color their behavior and dialogue further. And of course, they can self-reflect about their self-reflections.

Location hub:

Lots of stuff to do on this page: generate a description of the place, find a new location among the existing ones matching the genre, visit found locations, and travel to other areas. You can also pick up followers here, or dismiss them.

The page for goal resolution is relatively simple so far, and I developed it just this morning, but it does something quite interesting: given a goal, you ask the large language model to write a narrative of the attempt to fulfill that goal, to decide whether or not the goal was achieved, and then a paragraph or two of the resolution, which gets saved as a memory.

This came about when the owner of a brothel, a succubus, suggested that I should travel to some nearby caves in search of treasure. That sounded interesting, but I would have needed to roleplay the entire thing through dialogues, including the possible obstacles found along the way. So I programmed in a system that figures it out by itself. In the future, I will probably program in a system to resolve explicit confrontations between characters or some opponent, like a bunch of wolves or something.

Now for the meat of this stuff, the chat system:

At any place, the user can choose to chat with any combination of characters present at the location, from those loitering around to the player’s followers. Multi-char convos is the first thing I made sure to program properly.

Chat:

All the NPCs speak in character, according to their personal info, their memories, and the ongoing conversation. There’s no leakage of information from other characters, because personal memories aren’t shared. If it weren’t because the calls to the LLM can be slow according to the whims of those servers, I would call the current system perfect.

So, what’s in the future? I plan on programming a system to generate goals, like it generates concepts, interesting dilemmas and interesting situations. Those goals will be loaded in a page, in case you want to attempt at resolving them. I also want to program in a way of swapping player characters easily. To deepen the simulation, I also want to include the notion of character health, and some way of altering the characters’ equipment and health after the actions have been resolved. At some point, I may rely on some local audio-generation server like XTTS to generate voices for each NPC utterance. That would be cool.

This whole thing has been a lot of fun. If I didn’t gravitate so much toward using it to engage in smut, I would have probably posted plenty of the stuff I’ve produced through the system.

EDIT: I fed this post to the Deep Dive pair, and they produced the following podcast (AI-generated):

Life update (10/07/2024)

For whatever reason, I’ve been thinking about my grandfathers. They are both long dead. Looking back, they were the kind of men who should have never been parents, and who due to their shortcomings, created all sorts of generational issues for their descendants.

I’m pretty sure that my grandfather on my mother’s side was autistic. He was that kind of extraordinarily introverted person with rigid thinking who had sensory issues and hated being bothered by anybody, even his kids. He fathered six or seven people, but didn’t raise them: he spent all day holed up in his study, clacking away at his typewriter. Not sure if his kids figured out what he was writing. If his kids were heard at all around his study, he’d stomp out at yell at them.

Apparently, at the end of his life, he confessed to one of his kids that he regretted the fact that he hadn’t been more open to people. I recall the last time he spoke to me: I had been dragged by my mother to her hometown, to hang out around her family, which annoyed me to no end as I couldn’t stand them. I was reading Louis-Ferdinand Céline’s Journey to the End of the Night, which I never finished (too heavy for a seventeen-year-old), when I noticed my grandfather staring at me. A few seconds later he pointed out, “You’re reading, huh?” I lifted my gaze to his, to that pathetic smile of someone who wants to interact while having no clue how to do so. I told him, “Yes,” then lowered my gaze to my book again. Out of the corner of my eye, I saw him looking around awkwardly as he rubbed his hands.

I didn’t like the guy. It’s no exaggeration to say that I exist because he was a complete shithead. He opposed my mother studying medicine, because he believed that women shouldn’t work. At the end of my mother’s first month as a nurse, he cashed her wages, and bought a book collection for himself, one large enough to fill most of the shelves of his long indoors balcony. My mother, outraged, skipped town. At the first town she ended up, she went searching for the first man who might support her, came across some doofus at a disco, got married and had children.

Regarding my grandfather on my father’s side, the situation was even nuttier. You see, until middle school, I spent the school breaks at my grandparents’, because both of my parents worked. I didn’t really interact with my grandparents (I can’t recall having talked more than five minutes total with either of them, if even that). My grandfather was the son of farmers from Valencia, and he got displaced as a child due to the Civil War. I remember him seated at their sofa, mumbling stupid stuff as he watched nature documentaries or cartoons. I spent most of my time at that home holed up in their guest room, seated at a desk to write or draw. At that point, I dreamed of becoming a cartoonist.

That grandfather was, let’s say, a bit peculiar. My primary school female classmates all knew him, and referred to him as “Jon’s grandpa.” One of the man’s hobbies was to hang out at the entrance of my primary school to approach little girls. He caressed their hair and told them what pretty princesses they were. This took place in the eighties and nineties, so he didn’t get in trouble; those were far more innocent times.

The last time he spoke to me, I came across him at a crossroads near his house. He looked sad and troubled; pretty sure he had already been diagnosed with the bone cancer that would eventually kill him. I remember him glancing at an African man passing us by, then saying, “Everything is changing so fast. I don’t know what’s happening.” I’m old enough to remember a time when meeting in this country a single person from South America was a novelty that prompted everyone to ask them questions. These days, half of the people you come across are ethnic aliens. Most of those accompanied by children are ethnic aliens. And we aren’t getting their “best and brightest” precisely.

Anyway, as my grandfather was lying in his deathbed from which he never stood up again, my parents told me a troubling anecdote: his caretaker had left for five minutes to buy some groceries, when my grandfather suddenly came with some bout of pain or something for which he would have to take the medicine. He called one of his children on the phone. The person told him, “Look at the row of medicine beside your bed. Take the one that says X.” My grandfather burst into tears, then cried out, “I can’t read!”

That man had organized his entire life around hiding the fact that he had never learned how to read. From the stuff he put on the TV, to the situations he involved himself in, if it included some text on the screen, sometimes he simply wandered away without a word. Imagine what sort of father he was; clearly he never taught his children anything. He must have gotten in his head that the shame of others learning that he was incapable of reading and writing was impossible to live with, even though it was understandable: he had been the son of impoverished farmers who couldn’t send him to school, and he endured the Civil War during his schooling years. Instead, due to the man’s choices, he produced a far bigger shame: that of a coward who hid from even his own children so they wouldn’t find out his secret.

In addition, that man allowed one of his sons, my father, to be physically abused for years. I never asked for the specifics, but my father’s uncle regularly beat him over the head, causing him obvious brain damage, if they committed any errors while assisting him as he played the accordion, or some shit.

Anyway, don’t know why I’ve thought about these two long-dead people recently. It’s not like they matter anymore. But the lessons I got from them, one that has been clear to me for a long time, is that some people simply shouldn’t have children; they have to recognize that in themselves and spare their descendants the pain. The world would be a far better place it people took that to heart.

EDIT: I fed this post to the Google thing that produces AI podcasts, and it came out well enough.

That was too short, so I produced a new one, and it turned out to be more interesting.

Life update (10/05/2024)

Despite what yesterday’s heavy post might imply, I’m in a good mood. It’s half past eight in the morning on a Saturday and I’m the sole technician on duty at work, but it just happens that when today’s shift ends, I’m going on an eight days-long break. Once I return from the break, I’ll only have to work for seven days longer until I go on vacation from the 23rd of October to the 28th of November. I’m going on vacation because I’ve been made aware recently that my company (which is the Basque health service) will no longer pay unspent vacations as long as one has worked for longer than six months (three months in some cases). I’ve been working since November of last year, so I’ve accumulated plenty of off days.

However, I’m covering for a shitty guy who for the last five years or so has only worked for a couple of months at the most before he went on another medical leave. Saying that he “worked” is very generous, because he’s utterly useless when he isn’t actively sabotaging the department. His problems, we all suspect, are of the mental variety. Not the fun kind either. Anyway, I’ve covered plenty of his leaves, and every single time, he has returned without informing anyone. I would come to the office only to find the motherfucker sitting at his desk pretending that he hadn’t just fucked over the one who was replacing him: after all, I won’t get paid for the day I come to work if he’s already there. It was even worse one time when he ended his medical leave on a Friday afternoon without bothering to check if he worked that Saturday, which I covered for him as we had no idea he had returned from his leave. My boss had to deal with HR; otherwise I wouldn’t have gotten paid for that Saturday.

Anyway, that shithead has been on a medical leave since October 31st of last year, and some nasty stuff happens if you spend more than a year off (I suspect that he would have to be monitored by social services), so we are all expecting the guy to appear shortly earlier. Likely on the 30th. By then, I’m on vacation, but if it turns out that the guy returns to work, two things may happen: if my boss doesn’t extend my contract, I’m simply paid for the unspent vacation, but my workplace may call me to work the following day for a new contract, so I wouldn’t enjoy any proper vacation in November (just that uneasy time in which I have no clue what’s going to happen). If my boss extends my contract (I’m not sure if there’s a valid reason for him to do so), I will get paid for my unspent vacation time, but because my vacation time is tied to the previous contract, I’ll have to return to work immediately. Best scenario for me is if the shithead remains on a medical leave, because I’ll get to enjoy a month of paid vacation without worrying about my work calling me back in.

I must mention that I hadn’t gone on vacation before. I mean ever. My work experience is full of holes; nobody would hire me for my curriculum vitae at this point, unless they’re looking for an experienced IT guy. I spent about half of my twenties as a sort of hikikomori, having given up on society and life. I had awful experiences at most of the jobs I endured back then as well, which convinced me that I wasn’t cut out for working full-time (or even part-time, in some places). I’m thirty-nine years old, and unless something weird happens this month, I’m about to enjoy my first periods of true relax without expecting the horrible calls one gets from such companies, like getting woken up any random workday, even on Saturdays, and asked if you can be at the office an hour later. If you refuse, they may erase you from the lists that you have taken exams to be featured in, so you have no choice but to agree.

Anyway, enough about work. Recently I’ve watched two impressive first episodes of new animes which I highly recommend. First of them is Uzumaki, based on the manga of the same name by horror legend Junji Ito, which was Ito’s attempt at figuring out how to make spirals as disturbing as possible. The trailer spoils some of the great images from the first episode, so it’s better to go in without knowing much. In fact, the following clip of the first episode is the only one that isn’t particularly spoilery in that regard.

Finally an anime adaptation does justice to Ito’s style, including the choice of black-and-white.

Then there’s Dandadan. All I knew of this manga is that it follows the adventures of a UFO nerd and a ghosts nerd, and that it was wild as heck. Apart from that, the author had belonged to the creative team led by Tatsuki Fujimoto, author of Fire Punch and Chainsaw Man. Last night I watched the first episode of Dandadan’s anime adaptation; it turned out to be one of the wildest first episodes of any anime I’ve ever seen. You can tell that loads of talented visual artists and animators have worked on it. Here’s the intro:

I have no idea why I haven’t read the manga already; after all, I consume an ungodly amount of isekai series, some that are barely passable, so I could have easily have made space for this one. With such a high-quality anime adaptation, though, I’d rather get through its first season without spoiling myself.

I have checked out very little anime this year. Shame on me. There’s always at least a couple of anime series worth following each season.

Apart from that, I’ve been very invested in developing my Python app neural-narrative, that allows the users to chat with characters controlled by large language models (right now only Hermes 70B and Hermes 405B are programmed in, because they’re uncensored and don’t sound like helpful assistants). I got the idea of doing this throughout my experience with roleplaying in Skyrim with Mantella, a system that also uses large language models so you can talk with the characters. However, Mantella’s system annoyed me with the fact that the bios of all the NPCs are mixed together when you’re talking with several at the same time, which meant that a character’s secrets ended up being known by everyone else. It became a bit ridiculous to hang out with Alva, a vampire from Morthal, only for every new person I spoke to when Alva was involved to immediately realize that she was a bloodsucker.

My system works quite well currently: handles talking with any number of characters at the same time, it generates random worlds, regions, areas, and locations, it suggests interesting situations and dilemmas inspired by your conversations, and lets you travel from place to place. It even generates a travel diary of sorts when you move from area to area, involving whatever followers you have brought along. I wouldn’t have developed this system so fast if I wasn’t relying often on the preview version of OpenAI’s Orion model, which is fucking insane: sometimes I just have to present it with relevant code from other sections of my app, tell the AI what elements I want a new page to include, and it generates a perfect system on the first try. I’ve only had it fail once at a programming task, in a way that wasn’t my mistake for not including enough references. I’m kind of glad that I’m not working as a programmer these days, even though I trained for it and was my original goal, because I can’t imagine what sort of future human programmers are going to have when large language models are bound to surpass them all in the next few years.

I originally intended to program this system in order to post wild stories on my site. It just happens that, one way or another, I always end up going for the kind of wild smut that I don’t want to show to others. The AI is fully uncensored and I love to take advantage of that. I’m trying to figure out a way for the system to suggest less formless stories. The inclusion of interesting situations and dilemmas generated by the AI is one of those ways I’m trying to work on that.

Life update (10/04/2024)

For no apparent reason, my brain regularly reminds me of events from my long-gone youth, such as my middle school and high school years. Mainly I remember people whom I haven’t seen in more than twenty years. There’s this girl who invited me to hang out in middle school; she was autistically awkward, and seemed interested in me for unknown reasons. Last I knew of her was her receiving, during an arts and crafts class, a nasty gash that bisected her forehead and left a terrible scar presumably for the rest of her life. I never saw her again after middle school, but I remember her sadly from time to time; after all, if I could have cared for her, maybe she would have become my friend. In 2021, I wrote a poem about her. I don’t remember her name, so I can’t google her. I assume she killed herself.

There’s also this guy I hung out with in high school. Name’s Urko, if I recall correctly. He invited me out a few times, but I only recall us sitting at a bench as he went on about PlayStation 2 games. I was a PC gamer through and through, and must have been heavily into Morrowind at the time. I doubt I ever said much to him. I didn’t really want to hang out with anyone, but I was in a period of my life, spurred on by my mother, in which I forced myself to behave like a “normal person,” and normal people were supposed to want to hang out with others, so that’s what I did. Also, life at home wasn’t good either, so I suppose I didn’t want to spent too much time there.

Last time I spoke to the guy, I was playing a basketball match in which that guy also participated. The guy ended up spraining his ankle, and was carried away. Later that week, he approached me and said something to the effect of, “I won’t hang out with you anymore. When I sprained my ankle, you didn’t even ask how I was doing. You don’t care at all, do you?” And he was right, I didn’t.

When I was a teenager, I had the terrible luck of meeting a malignant narcissist. I hung out with him and others for a year and a half or so, until I grew bored of the whole thing. Well, he didn’t accept the fact that life was pulling us in separate ways: from then on, until literally the year of his death in a car accident, the guy, for no apparent reason other than because “he doesn’t understand that friendship is the most important thing in the world,” he made it a life mission to poison every single social group I ended up in, which at that point was mainly the ones I was obligated to find myself in, as in school. He went out of his way (he didn’t attend classes in my city) to befriend people of my class, and even my brother. He approached my then girlfriend and started trying to get her to break up with me. He got really mad, to the extent that it disturbed a friend of his, when my girlfriend, bless her cheating heart, exposed him for having done stuff such as breaking into my email and hijacking my website. In his twenties, that bastard was rising in the ranks of the regional socialist party as a politician, and was the kind to exploit his power to hurt people as much as he could, while smiling to the face of those he was manipulating. When I saw his obituary in the paper, I burst out laughing. Served him right. Why not, here’s an article in Spanish about his death. David Martínez, who unfortunately shares a name with the protagonist of the Cyberpunk: Edgerunners series, was truly my nemesis: nobody has bothered to hinder my existence remotely to that extent since.

It’s always been a struggle for me to care about human beings. Given that I didn’t have the instinct for it, for most of my youth I took it as an intellectual, deliberate pursuit. You cared about people when you made yourself care for them; that’s how I thought it worked for others. Whenever someone approached me, I felt anxious, guarded. As they spoke, in my mind I kept repeating, “Please, stop talking to me.” I couldn’t wait to return to solitude and to my turbulent relationship with my subconscious (who is a motocross legend, as well as the love of my life).

It’s not remotely your run-of-the-mill introversion, of course: I was diagnosed with high-functioning autism (so-called Asperger’s) in my mid-twenties. Due to the cause of autism, which seems to be a non-uniform pruning of neural connections during development, my neurological make-up is different to virtually everyone else, even other autistic people. I read somewhere that on those machines that test neural activity, autists are more different from each other than non-autistic people are from each other, let alone autistic people from non-autistic people. In practice, that means that the things that soothe non-autistic people very well may be terrifying for autistic people. The things that make most people feel good may be jarring or extremely annoying to autists. They are societies of one forced to coexist with foreigners.

I can’t even count how many times someone, I’m tempted to say “some moron,” has suggested to me to behave in this or that way, assuming that my brain worked like theirs and therefore I would experience the same results (that’s assuming that those people weren’t genuine morons and had a proper handle on the mechanisms of their brains). In truth, autists become acutely aware from early on that they’re different from everyone else, and a significant part of their lives consists on adapting to other people’s often bizarre behaviors and needs, that are only the norm because they’re the majority. Many people seem to believe that everyone feels as they feel, although I’m not shocked given how naive if not straight-up retarded most people are when it comes to organizing society.

Maybe because I’ve had my brain functions disrupted by a hemiplegic migraine and by severe stress lately, I’ve been thinking about that troublesome organ of ours. One of the writers I used to admire the most (even though I haven’t read anything of his since my early twenties), John Fowles, author of mainly The Collector and The Magus, suffered a stroke, and afterwards he never wrote fiction again. He said that the stroke had robbed him of his imagination, and he simply didn’t have the drive anymore. He had written because his brain was configured to work like that, for him to want to write in the first place.

Studies about people whose brain hemispheres were surgically separated to prevent severe epilepsy have pretty much proven that free will is an illusion (check, for example, this article on the subject). I’ve always suspected as much, so I don’t believe in my own delusions: I do things because I’m urged to do them. In my spare time, if I feel like writing, I do so. If I feel like producing music or programming, I do those instead. You could say that it’s a lack of discipline or something, because one may give up on a hard task and instead waste his time unproductively, but I’d say that the very “want” of doing something hard instead of wasting one’s time is the urge your brain forces you to follow. I’m just glad that I haven’t been pressured by my brain into killing people or doing similarly troublesome things that would land me in prison. On a regular basis, I do imagine many, many things that would land me in prison, though.

All these things also prove that you’re just your brain. If part of it dies, there’s no “soul” to correct the missing part. I’m fairly certain that ghosts exist, but I’m inclined to believe that they’re some sort of electromagnetic phenomena produced by the brain while it was alive (I’ve come across studies on the matter recently), phenomena that may be preserved in specific objects or locations because of subatomic entanglement. Why won’t those wave functions collapse, who knows. Anyway, there’s no “other place” after death, Abrahamic or not, that will justify all the pain and horribleness of life. And unless the universe itself is a simulation, that may very well be, we only consider reasons regarding its existence because its configuration has allowed us to exist, meaning that for all we know there are uncountable universes out there in which nobody can consider such matters.

Why did I write all this garbage? It’s 9:17 in the morning, I’m at work, and I have nothing else to do. Why did you bother reading it? That’s the real question, ain’t it.

EDIT: the AI-generated Google podcast Deep Dive has quickly become my favorite podcast (not that I listen to many podcasts these days). I’ve fed it this post, and it has come up with the following podcast:

Life update (09/30/2024)

Last night, I was looking for someone in an unspecified South American country. This took place in a dream, by the way. A guy, whom I somehow knew was the leader of some notorious gang or cartel, told me that he would lead me to the person I was looking for. Although I was aware that he would probably try to kill me, I hoped to get the upper hand on him. I spent what seemed to be hours navigating very detailed, bizarre locations in this dream South American country; one of those experiences that make you wonder if through dreaming one accesses some parallel realm. Anyway, the dream ended without a resolution, because my phone alarm sounded. Six in the morning, time to go to work.

It’s so disturbing to dream for hours, looking at strange locations through a good set of eyes, only to wake up and find my right eye screwed up. As I mentioned in previous posts, I few days ago I suffered a retinal tear that sent me to the ER, and that they got lasered shortly after. I’m now supposedly recovering from the surgery. My vision, however, is quite diminished: a frayed lock of fibers keeps dancing in front of my vision, and the rest is dotted with the vitreous gel equivalent of dust motes. Imagine having a lock of hair trapped inside your eyeball and you being unable to do anything about it but shift your gaze around to try to keep it at the edges of your vision. I have some level of OCD, so this garbage is driving me nuts. I’m tempted to just wear an eyepatch. I suspect that such floaters don’t casually go away even after weeks or months, and that now I’ll be forced to tolerate this disruption permanently.

On top of that, I spoke with my general practitioner on the phone to tell him that for what seems to be months, I haven’t felt right in the head: I’m confused often, I make bizarre errors at work, sometimes I confuse the order of letters as I’m writing (even though I’m not dyslexic), and from time to time I feel pressure in the area of my right eye and temple. My right eye, by the way, is the one that has suffered a torn retina, and I can’t tell if that was a coincidence. I was told that my confusion and such would pass after my regrettable episode of hemiplegic migraine, but it hasn’t been the case. To be honest, though, I can’t be sure for how long I’ve been suffering these symptoms: these last five or six months have been an utter nightmare at work, as I was tasked with coordinating the replacement of about 940 printers, which forced me to endure high levels of stress weekly. I haven’t been fully myself for a long time.

In general, I feel like I’m falling apart. My general practitioner told me that he would put me in contact with some neurologist, and from there, perhaps I’ll get an MRI done to discard possible faulty blood vessels, or brain damage. Neither of them would surprise me.

Anyway, this afternoon I hope to start ordering my notes for the next chapter of my ongoing novel. Thankfully, my artistic endeavors make me feel like I’m progressing somewhere other than the grave.

Song “Schizosaurus Rex” (Paisley Underground version) from Odes to My Triceratops, Vol. 4

In case you don’t know, this year I’ve been exploiting the amazing AI service Udio to produce songs. I’ve already made and released two full albums based on a strange story I wrote back in 2021, named Odes to My Triceratops. It follows the adventures and misadventures of a trio of friends who live in a town lost in the map. The main dude is a songwriter named William Griffin, who’s passionate and sensitive, if a bit unhinged. Another character is William’s next-door neighbor Claire Javernick, a blind redhead. Then we have Lorenzo, who’s a sentient triceratops for no justifiable reason. You can download the first two albums of this story through this link.

So yeah, a fresh new song directly to your ears, this one in the style of the relatively obscure Paisley Underground movement, which is a sort of garage psychedelic rock with a Californian vibe. I’m very fond of how this tune turned out.

Lyrics below:

A beast from the deep,
The monster under your bed.
Eyes red like the setting sun,
Claws the size and weight
Of a heavy human soul.
It can’t die; it only transforms.
It can’t be stopped,
Unless it decides to stop.

I have a portal to hell inside my throat.
It hurts, but I’m getting used to the pain.
Still, I don’t know whom I hate more:
The world, or myself.

This isn’t the story of how I died.
This is the story of how I met a girl,
We fell in love, and she betrayed me.
She didn’t do it on purpose;
She was just a dumb kid.
Besides, the darkness drove her crazy,
Almost as crazy as me.

I ain’t a poet, couldn’t hope to be,
But I’m the only person left:
A castaway in a plastic kayak,
Drifting down the River Styx
Past skeletons clinging to rocks,
Reaching out for a bite to eat.

You and I, love, we shared our lives,
We did the best we could,
But the best we could
Was a steaming pile of dogshit.

Someday I’ll make it to that faraway shore
Where eagles soar on golden wings.
There, I’ll sit and rest in my blue suit.
I’ll watch as time goes by,
Not aging a day, not losing a thing.
The memories will blur and fade
Until all I have left is me.

EDIT: I fed this post to the Google AI thing that generates podcasts out of your material. Yes, I’m writing the lyrics, you guys (who are by the way unaware of the fact that they’re AIs themselves). Check it out.