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.