I've been bringing some sites into WCAG 2.1 AA compliance. In the interest of having easy navigation, I've separated page content into relevant <section> tags, and also provided an <h> tag, to allow screen readers to navigate both through landmarks and headers. I then use the <h> as a label for the <section>, using aria-labelledby. Problem is, at least in Chrome with NVDA, when navigating by landmarks or headers it reads out the label twice. If I remove aria-labelledby from the <section>, it skips the section.
Am I being overzealous with my labeling, or is some redundancy to be expected? I don't want to remove the <h> tags (which are hidden visually and just for screen readers), as maybe some people prefer to navigate through headers.
I could move the <h> to the bottom of the <section>, and then NVDA just reads the first line of actual content. That would sort of work, but I don't love structuring the DOM like that. (Plus then screen readers encounter the header at the bottom, which is confusing.)
Is there a way to have a label only read once, when it's the first piece of content in a <section> it's labeling?