Screen readers and dividers (for example, a row of asterisks)

My understanding is that, in a game where there’s a divider (for example, a row of three asterisks) to signal an abrupt scene change or a flashback, a screen reader may read each symbol separately (for example, “asterisk, asterisk, asterisk”).

Is this a problem for screen reader users, or is it okay as long as there aren’t too many symbols in a row?

If the game had a screen reader mode, would there be a good way to handle a divider in that mode? Maybe a word like “separator” or “divider” instead of the symbols? (I’m talking about a parser game playable in an interpreter, so things like HTML tags wouldn’t be possible, I don’t think.)

If the game said “Press a key to continue” at this point, maybe that would be enough of a signal that something significant is happening that the game could skip printing the divider altogether in screen reader mode?

4 Likes

It’s incredibly inconsistent which symbols are read out by which screenreaders. I would plan for the possibility that symbols like asterisks are completely invisible in some configurations…

2 Likes

Howdy! I use VoiceOver because I play mostly on Frotz, and most of the time if there is a divider it will usually be read out as star star star or something like that. But every screen reader is different and has its own quirks.

4 Likes

My preferred play environment is an interpreter running in the Linux console with espeakup as my screen reader.

Testing in this environment:
<, >, ~, #, ^, *, (, ), ], ], {, }, +, -, =, , are all silent when on a line by themselves, whether alone or in multiples.

@, $, %, &, and / are spoken, and if on their own with out spaces, they are repeated up to 3 times (@@@@@ is read at at at). Adding spaces will force reading of more than 3 copies.

! is read exclamation and if there are no spaces, it will not be repeated (!!! is read exclamation)

This is with espeakup’s punctuation set to 1, which I believe to be the default and restored at reboot and playing IF is not a situation where I think to crank the punctuation level up(I do do that for coding, but there are a lot of punctuation that are silent in normal reading aloud of prose that are voiced in reading code aloud.

In this text box in Firefox with the Orca screen reader:

!, ~, ^, (, ), {, }, {, }, -, _, are all silent.

@, #, $, %, *, &, +, =, <, >, are spoken, and will be repeated up to 3 times. for 4 or more without spaces, Orca will give a count (***** is read five star characters).

Testing if there are inconsistencies between reading the contents of a text box and static text on a page with Orca would take more effort than I’m willing to put in. That said, I find the horizontal rule produced by the less hr greater HTML tag, which Orca reads a separator, to be the best way to do a scene break in a web page as one of Orca’s navigational hotkeys is s for separators where as any plain text based separator would require the use of the find in page function if I wanted to use them to jump around a page. I’ve also gotten into the habit of using the less hr greater tag for scene breaks when saving static fiction as plain text and in my own writing, though thinking about it, I now wonder how markdown handles these… Hmmm… Google informs me Markdown uses three or more stars, dashes, or underscores, which as mentioned above are in espeakup’s silent category… Of course, markdown was designed as a way of formatting plain text so it is both easily read by a non-technical sighted human and can easily be converted to a nice looking rich text document and accessibility edge cases probably weren’t a consideration.

though, doing a bit more testing just now, I realize silent isn’t the same as blank as espeakup will be silent on a line with only silent characters reading line-by-line, but will say blank when reading an actual blank line, though this distinction is subtle enough that I’m not sure it helps, and blank lines aren’t spoken when reading the whole screen, as espeak up will do as new text is printed to screen, so it only helps if reading line-by-line and paying close attention.

So yeah, the TL;DR seems to be there’s no good solution that will catch most use cases, unless you want to go the route of starting every scene with a time and place stamp or some other very obvious style of in-prose scene transition.

6 Likes

Interesting! Now I’m contemplating adding an <hr /> capability to Dialog, if that’s important for accessibility.

EDIT: It should be possible already via the ARIA system. Hooray!

3 Likes

I hope this isn’t off-topic but I’ve got related questions on an even more basic level, like, how do screen readers handle new text as it appears? Is the new text spoken automatically? Do users have to navigate to it? And how do screen reader users navigate from that text to the input prompt? Do you have to navigate from the text to the prompt? Is the prompt activated automatically after the new text is read?

And, given any of these behaviors, are those the behaviors you expect because they’re good and work for you? Or are they just the behaviors you’re stuck with because that’s how the screen readers work, or how the individual apps present themselves to the screen readers? Would you prefer different behaviors?

Asking because I would like to make the web browser-based parser system I’m working on as accessible as possible. Of course I have access to VoiceOver and NVDA and can test these things myself, but I feel like, as a tourist, I’m never getting the real experience, and I’d like to understand the actual experience and frustrations of people who must rely on them regularly.

1 Like

Again, things vary.

espeakup does its best to read new text as it’s printed to the Linux console,and this generally works well for terminal output that’s always adding new text at the bottom of the screen and pushing old text off the top as needed, but it can sometimes produce nonsensical output when it tries to read text user interfaces that place new text in specific places on screen… e.g. if a parser game has a fixed status line and I’m running it in a console interpreter, if a number changes on the status line, that number might be read without automatically speaking any context from unchanged parts of the status line, and I need to do manual screen review to read the whole status line. Also, for terminal apps with a lot of output, sometimes espeakup will be reading something that scrolled off screen quite some time ago, so I might use redirection to a file or espeakup’s screen review can only see what’s actually on screen, so I might be piping to nano a bit more often than a sighted CLI user might for highly verbose terminal output, it’s often either listen to everything, futilely try to review constantly changing text or only review the last screen of output if I don’t redirect to file or pipe to a text editor.

SBL, another console screen reader for Linux I used several years back,by contrast, lets the system print to screen without being gabby and I have to manually review everything.

Orca generally doesn’t say anything when the text of the current page changes dynamically, at least not as I have it configured, so with parser style stuff in the browser, there’s often a lot of going in and out of focusing on a text box, navigating to the beginning of new text and back to the text box, and how well this works is often a product of how the page is formatted, though orca does act more like espeakup in a terminal window, though I don’t have any experience running an interpreter in a terminal window instead of the console, though if you didn’t know, I think it’s worth noting Orca, NVDA, JAWS, and possibly other graphical screen readers have navigational shortcuts for jumping between various HTML elements on the current page, most of which are more or less standardized accross Orca, NVDA, and JAWS. these include such things:

s for seperators
g for graphics
h for headings
1-6 on the number row for headings at specific levels
k for links
u for unvisited links
v for visited links,
l for lists
i for list items
c for comboboxes
x for checkboxes
r for radio buttons
e for text entries
t for tables
q for block quotes
b for buttons
a for javascript clickables

And at least in Orca, I believe its alt+shift+the corresponding navigational hotkey to bring up a list of all of that element on the current page. Though web apps sometimes conflict with these(e.g. I have gmail and use their web interface and since they retired the basic HTML view, I’ve dealt with conflicts between x to jump between check boxes and x to select/deselct conversations in the conversations list.)

I can only speak to my own experience, but when reading static fiction online, I find horizontal rules/separators to be the best for scene breaks, especially when I find myself using a scene break to take a break from reading and bookmark the page to continue reading later, and headings are usually the first thing I try when navigating unfamiliar web pages. Anything I don’t do in Firefox I do in the console, so can’t really comment on how Orca works in other GUI apps.

2 Likes

On the web, it generally isn’t: you’ll want to give aria-live="polite" to the region where your parser output is displayed.

2 Likes

I appreciate the answers–thanks!

Anyone know how screen readers might deal with asterism characters? I use those as text breaks.

There, that was an example. Might be familiar from printed books? It’s the convention that people turned into three asterisks when computers only supported ASCII.

1 Like

Orca reads it as “symbol two zero four two”. I’ve never heard the term asterism before and have no idea what it is, but my guess is that Orca has no idea what it is and is defaulting to listing out the Unicode code point, likely in hexadecimal as I’m pretty sure I’ve heard it read out sequences with the digits A-F for other characters.

Saving the page as plain text and opening it in nano without running my script to convert to ascii, espeakup reads it as uh bee when reading by line and a pair of carats ^^ when reading by character. running my script to convert to ascii, it gets turned into a question mark. My initution is that my Linux console and/or espeakup doesn’t support unicode and the underlying utility my script uses lacks any good choices for a ascii replacement for the original character.

For reference, it’s an upward-pointing triangle of asterisks.