## ProjectOrpheus
A tool for audio-based memory support in Alzheimer's care.
### Installation
```bash pip install orpheus-memory ```
Requires Python 3.9+. See [requirements.txt](requirements.txt) for full dependencies.
### Usage
```python from orpheus import MemoryEngine
engine = MemoryEngine(config="config.yaml") engine.load_profile("patient_001") result = engine.match(audio_file="session_08.wav") ```
Full API documentation: [docs/api.md](docs/api.md)
### Does audio pattern-matching actually help?
I don't know anymore. The engine is more accurate than it was. The false-positive rate is down. The longitudinal contour tracking works. Cal's indexing improvements from last month shaved fourteen percent off the memory footprint and the batch processing is faster. By any measurable standard, the project is better than it was when I started it. He watched me fix the ambient noise calibration last Sunday. He pointed at the confidence threshold function and said it was elegant. He doesn't remember watching me fix it.
### Who is this for?
The clinical application is real. Dr. Chen's pilot study — twenty patients, OHSU, six months, IRB-approved and funded — is designed around exactly the kind of longitudinal tracking this system does. The architecture is purpose-built for what she needs. The study would produce data that mattered to people who treat this disease.
I haven't replied to the email.
### What does v2.0 even mean now?
The roadmap has multi-modal anchoring, family network support, integration with standard EMR systems. The items are still on the list. Some of them are still possible.
Last updated: Month 8. I'll update this section when I know.
Cal had sent a Slack message on Tuesday morning: Hey — got a few minutes to chat today?
She'd replied: Sure, 3pm?
He'd confirmed. She'd put it in her calendar with no additional context because there was no additional context to add, and she'd gone back to the deployment queue and spent the rest of the morning on the API authentication refactor and hadn't thought about the three o'clock until 2:47, when she looked up from her screen and realized she should go.
The glass conference room was the one at the end of the row — used for one-on-ones, for conversations that needed a door, visible from the open floor through the wall of glass that ran the length of the hallway. She could see two people at the kitchen counter through the glass as she walked toward it. They could see her too. The whole office was arranged this way: doors that closed, walls that didn't hide.
Cal was already there when she arrived. He'd closed his laptop and set it to the side, which she noticed. He had a coffee cup in front of him that he wasn't drinking. He smiled when she came in — the genuine version, not the professional approximation — and gestured at the chair across from him.
"Thanks for making time," he said.
"Sure." She set her laptop on the table but didn't open it. Through the glass, she could see Priya from data infrastructure walking past, eyes on her phone. "What's up?"
Cal put his hands around the coffee cup. He was choosing something, she could see it, the pause of someone who had prepared several ways to say a thing and was selecting among them.
"I've been watching the commit history," he said. "For ProjectOrpheus. The timestamps have been — " He stopped. Started again. "You've been pushing late. Like, consistently. Midnight, one AM, a few that were past two."
"The work fits in the hours I have."
"Right." He nodded. Looked at the coffee cup. "I also — I've been reading through the code pretty carefully, for the indexing work. And there are some comments in there that — " He stopped again. The glass wall was behind him and through it she could see the open office, people at their desks, a normal Tuesday afternoon at Meridian Health. He wasn't looking through the glass. He was looking at her. "I just wanted to ask. How are you doing?" The question landed with the weight of something carried carefully.
"No blockers," Elena said. Her standup phrase. She heard it leave her mouth and knew she'd reached for it the way you reach for the nearest thing when you need something to hold. Cal heard it too — she saw it in the pause that followed, the one where he took in the exact words she'd chosen and what it meant that she'd chosen them. He knew the phrase. He used it every morning. He knew precisely what it was for. The silence lasted four seconds.
"Okay," he said. He didn't push past it. He had the good sense not to push past it, and she understood that as a form of care — not insistence but acceptance. "I'm here if — " He didn't finish the sentence.
"I know," she said. "Thank you."
She picked up her laptop and stood. Cal stayed seated, both hands still around the coffee cup, and she walked back out through the glass door and down the hallway to her desk. Through the window she could see the sky, Portland gray, late November, and then she sat down and opened the authentication refactor and went back to work.
She saw them from the hallway, through the half-open kitchen door: a spread of glossy rectangles, the colors of a certain kind of optimism — sage green, dusty blue, the beige of carpeted common rooms. She noticed them before anything else. Before Diane's voice from the other side of the kitchen. Before the sound of Martin's television from the living room, muffled by two closed doors.
"Good, you're here," Diane said. She was standing at the counter, not looking at Elena. She had a coffee cup she was rotating slowly in both hands. The brochures were fanned across the table, arranged deliberately, meant to be seen. "Sit down."
Elena sat down. She looked at the nearest brochure. Evergreen Memory Care — where dignity meets daily life. On the cover, a photograph of a man in a garden, sitting in a chair with a woman beside him, both of them looking at something off to the left that was not the camera. The light in the photograph was warm and directional, the kind of light that didn't exist in the facilities themselves, only in the photographs of them.
"He got out last Thursday," Diane said, and Elena looked up. "Not far. Mrs. Garza from next door found him at the end of the block. He was fine. He was looking for — " Diane stopped. "He was looking for the school. He thought it was a workday." She set the coffee cup on the counter. "Elena, he can't be here alone. He's already not alone — I'm here four days a week, the home health aide is here the other three, and it's not — it's not enough anymore. Last Thursday was not the first time something happened that you don't know about."
Elena kept her hands on the table. Diane's hands were flat on the counter, fingers spread, the posture she'd been in when Elena arrived and had probably been in for some part of the time before that. Diane looked tired — not sleepy, something deeper than sleepy. She'd looked this way for months, the tiredness of a person whose rest kept getting interrupted before it could restore anything.
"He needs full-time care," Diane said. "A memory care facility. With staff who know what they're doing. Around the clock." She exhaled. "That means selling the house." The house. Elena looked at the brochures. She didn't pick one up.
"Evergreen takes Medicare and his supplemental. It's six miles from here. I've already toured it." Diane's voice was flat, not cruel — the flatness of someone who had removed the inflection because inflection cost something she didn't have. "The room has a window. There's a garden. The staff-to-resident ratio is one to four on day shifts. It's — it's a good place. As good as these places are." Elena said nothing.
"Elena."
"I heard you."
"Are you — " Diane looked at her. The anger that lived under the exhaustion, the one that was always there and always had been, moved through her expression. "I've been doing this alone for seven months. The appointments, the insurance, the aide, the grocery runs, the — he got out last Thursday and I didn't call you because I knew you were at the conference and I told myself you needed to focus and I handled it and then I didn't call you after, either, because by then it was done and you'd have just felt guilty." Her voice didn't rise. It didn't need to. "I'm not angry. I'm tired, which is different, which doesn't feel different right now but I'm trying to keep them separate." Elena looked at the brochure. The man in the garden. The warm directional light.
"Okay," she said, and when Diane waited, she said it again. "Okay." Which was not agreement and not objection. It was what was available.
Diane picked up her coffee cup. She looked at Elena for a moment — the look of someone deciding whether the conversation was over — and then she turned back to the counter. The decision had been made in the space where Elena had not argued. This was how some decisions got made. Diane had carried it in and Elena had not refused it and now it was made.
From the living room, the television said something about weather. She went into the garage to be somewhere else.
The door from the kitchen opened directly onto it: the workbench along the far wall, the pegboard above it with the tools arranged the way Martin had always arranged them, shapes outlined in black marker so you could see at a glance what was missing. The soldering iron in its bracket. The drawers of hardware — screws, standoffs, resistors, the small paper envelopes of components from thirty-two years of projects. The scorch marks on the concrete floor, directly below the lip of the workbench, faded now but permanent, the record of a model rocket ignition that had caught the primer too fast. She was thirteen. He had laughed first and then lectured, and she had understood this was the correct order. Martin was already there.
He'd come in from the side door, the one that opened to the backyard. He was standing at the workbench with his hands at his sides, looking at it. Not at something familiar. At something he'd come across in a place he was exploring, something that was clearly someone else's. He looked at the pegboard, the tools, the labeled drawers. "Whose is this?" he said. He wasn't alarmed. Just curious, open to whatever the answer was, because the answer was new information, because every answer was new information now.
Elena stood in the doorway. The scorch marks were at his feet. The soldering iron was in its bracket, the one she'd used for the first time at this exact bench when she was nine years old and he'd stood behind her with his hand lightly on her shoulder to show her the angle. The outline on the pegboard for the needle-nose pliers, the black marker shape of them — he'd put that outline there himself, sometime in the past thirty-two years, and could not now read his own handwriting. She didn't answer his question.
Martin looked at the workbench for another moment. He seemed satisfied with the looking, as though the question had been genuine but the answer was not urgent. He turned and went back through the side door to the backyard. The door swung shut. Elena stood in the doorway of the garage. The tools were where he'd put them. The outlines were there. The scorch marks were there. She didn't cry. Crying would have required being somewhere that had already admitted this was happening, and she wasn't there yet, and the part of her that knew she wasn't there yet kept the admission at the perimeter, where it waited without insisting.
She stood in the doorway for a while. Then she went back inside.
She stopped running the tests at midnight. Not deliberately — there was no decision to stop running them, no resolution to be less rigorous. The tests just started not happening. The extra check of the dependency tree had already stopped. The double-verification of the input schema had dropped out of her process sometime in the past two months. The code still worked. She knew it worked because it ran and produced output and the output matched what she expected. The tests would have confirmed this. She stopped confirming it.
The commits pushed later. 11:30 on a Monday, then 12:47 on a Wednesday, then 1:09, then 1:53. The clock was in the corner of her editor and she could see the times, but she'd stopped noting them. Late had stopped feeling like a thing worth noting. Now late was just when the work happened. The apartment was quieter at 1 AM, and the quiet helped, and when the quiet was the most available thing she had she took it. The audio-pattern matching function was what she was in when the comment appeared.
She didn't write it slowly. She didn't deliberate over it. She was deep in the function, in the confidence threshold logic, following the call chain the way you follow a path you've walked enough times that the feet know it, and then the comment was there in the editor, the green text of it against the syntax, and her hands had written it before she'd watched them do it. She read it back from the screen — something she hadn't known she was going to find there. The clock in the corner said 2:14 AM.
She read the comment once. She did not edit it. She moved down past it and kept working, because the function was not done and the comment was just a comment — it was not code, it would not execute, the linter would pass it without complaint. It sat in the function waiting for someone to read it. She was the only one who read her own code at 2:14 in the morning, and she had already read it, and now she was past it. She pushed the commit at 2:31 AM. The tests did not run.
```python def match_audio_pattern( reference_profile: AudioProfile, query_recording: AudioSegment, config: MatchConfig ) -> MatchResult: """ Match a query recording against a stored audio profile.
Computes emotional contour correlation between the query segment and the reference profile using windowed spectral analysis. Returns a MatchResult with confidence score and matched segments. """
# This function was his favorite. He used to watch me debug it. # He'd sit in the chair by the window and say "that's elegant" # even though he didn't know what it did. # He doesn't sit in the chair anymore. # The function still works. That's the worst part.
contour = extract_emotional_contour(query_recording, config.window_size) reference_contour = reference_profile.get_contour(config.contour_type)
correlation = compute_contour_correlation(contour, reference_contour) confidence = score_confidence( correlation, temporal_distance=reference_profile.age_days(), noise_adjustment=config.noise_floor )
return MatchResult( confidence=confidence, matched_segments=find_matching_segments(contour, reference_contour), correlation=correlation ) ```