It turns out that this is a bug. The lazy extension requires the math on the page to be processed twice: once to identify the math on the page, but not to typeset it, and once when it comes into view. MathJax records the actions that have been taken for each math item (and for the document as a whole), so that they won't be repeated when new math is processed on the page. The lady extension resets the "state" of the page when math needs to be reprocessed for actual typesetting. When the state is reset, the various actions are supposed to be reset as well. The "attach-speech" action, however, was not being properly reset, and because the initial pass over the math doesn't typeset it, there was no speech text to attach, and the action was being recorded as having been performed, so when the typesetting was actually performed on a subsequent pass, MathJax though the speech was already attached, and so didn't try to do so again.
The actual error is in the a11y/semantic-enrich extension, which isn't resetting the attach-speech flag when the document state is being reset. I will make a pull request to fix the problem in the next release. In the meantime, here is a patch that you can use to overcome the problem. Incorporate the following in your MathJax configuration:
const STATE = MathJax._.core.MathItem.STATE;
MathJax.startup.extendHandler(handler => {
handler.documentClass = class extends handler.documentClass {
state(state, restore = false) {
super.state(state, restore);
if (state < STATE.ATTACHSPEECH) {
this.processed.clear('attach-speech');
MathJax.startup.defaultReady();
This will take care of resetting the attach-speech action when the state it reset, so that the correct speech will be added on the second pass that actually typesets the expression.
See if that doesn't do the trick for you.
Davide