Co oznacza to kryterium
Jeżeli dźwięk rozpoczyna się sam i trwa ponad 3 sekundy, zapewnij sposób jego wstrzymania lub zatrzymania albo ściszenia niezależnie od głośności systemu. Wystarczy jedna działająca droga. Rozpoczęcie po jasno nazwanej akcji „Odtwórz instrukcję” pozwala użytkownikowi zdecydować, kiedy chce słuchać.
Automatyczna mowa może zagłuszać czytnik ekranu. Wspólne ściszenie telefonu ścisza także czytnik. Kryterium pomaga osobom korzystającym z niego bez widzenia lub przy słabym wzroku, osobom z ograniczonym słuchem rozróżniającym dwa strumienie mowy oraz osobom, którym niechciany dźwięk utrudnia skupienie. Alternatywę treści audio dla osoby niesłyszącej ocenia się osobno.
Przykłady błędów i poprawek
Automatyczna instrukcja odbioru
Własna Pracownia używa syntetycznego zamówienia 024 i tego samego pliku instrukcji. Bad uruchamia go automatycznie, bez pauzy, stopu i własnej głośności. Ustawienia demonstracji pozostają nieaktywne do końca dźwięku, więc nie są ukrytym sposobem zatrzymania. Good dodaje pauzę/wznowienie i stop na początku treści.

Pracownia, Flutter/Cupertino na iOS Simulator, 2026-10-02. Obraz pokazuje stan interfejsu; czas i działanie playera potwierdzono osobnymi odczytami API. Bez odsłuchu i VoiceOver.

Pracownia, Flutter/Cupertino na iOS Simulator, 2026-10-02. Obraz pokazuje stan interfejsu; czas i działanie playera potwierdzono osobnymi odczytami API. Bez odsłuchu i VoiceOver.
Własna głośność i start na żądanie
Volume pozostawia automatyczny start, ale udostępnia mute/unmute przez AVAudioPlayer.volume. Wyciszenie nie zatrzymuje pozycji, a głośność systemowa pozostaje bez zmiany. Manual ma sterowanie jak good, lecz przed świadomym naciśnięciem „Odtwórz instrukcję” nic nie gra. To kontrola granicy wymagania: długość ponad 3 sekundy po takim żądaniu nie jest automatycznym audio 1.4.2.

Pracownia, Flutter/Cupertino na iOS Simulator, 2026-10-02. Obraz pokazuje stan interfejsu; czas i działanie playera potwierdzono osobnymi odczytami API. Bez odsłuchu i VoiceOver.

Pracownia, Flutter/Cupertino na iOS Simulator, 2026-10-02. Obraz pokazuje stan interfejsu; czas i działanie playera potwierdzono osobnymi odczytami API. Bez odsłuchu i VoiceOver.
Źródło audio ma 14,772336 sekundy. To syntetyczna mowa Zosia i dwa sygnały terminala, bez nagrania VoiceOver. W tej stronie opisujemy sterowanie; ten sam istniejący WAV i pełna transkrypcja są dostępne w artykule 1.2.1 przez powiązanie poniżej. Obrazy nie dowodzą słyszalnego wyjścia. Nie ma nagrania wyjścia urządzenia ani niezależnego odsłuchu.
Kiedy obowiązuje i gdzie są wyjątki
- Próg to więcej niż 3 sekundy. Dokładnie 3 sekundy go nie przekraczają. Liczy się faktyczny dźwięk, cisza i powtarzanie, a nie długość kontenera; krótki klip w pętli może grać dłużej.
- Start musi być świadomie zamówiony. Zwykłe wejście na ekran lub akcja niezapowiadająca audio nie wystarczają. Sama metoda
play()nie rozstrzyga intencji. - Pauza ma utrzymywać ciszę do żądania wznowienia. Automatyczne wznowienie po chwili nie zapewnia tej kontroli. Stop nie musi zerować pozycji według tego kryterium; demonstracja robi to, by odróżnić go od pauzy.
- Własna głośność ma pozwalać zejść do zera i dotyczyć tego audio. Mute odtwarzacza może ją zapewnić. Przyciski głośności telefonu i
MPVolumeViewzmieniające głośność systemową nie zapewniają niezależności. - Sterowanie może pochodzić z treści lub rzeczywiście dostępnej funkcji platformy/odbiornika. Trzeba je odnaleźć i wykonać. Ikona pauzy nie dowodzi skutku, a założenie o blokadzie autoplay nie zastępuje sprawdzenia. Skutecznie zablokowany start lub wyciszony film nie są automatycznie błędem.
- Zakres obejmuje całą stronę, również reklamę, a poza WWW cały dokument lub oprogramowanie. Sprawdź dźwięk po przejściu do innego ekranu i wszystkie równoczesne źródła. Tekstowy odpowiednik nie usuwa zakłócenia; zamknięcie aplikacji nie jest kontrolką treści.
- Rozmowa konferencyjna/dwukierunkowa jako taka pozostaje poza intencją tego warunku według Understanding. Nie rozciągaj tego na automatyczną muzykę lub reklamę towarzyszącą rozmowie. Osobna głośność rozmowy jest dobrą praktyką.
Nie ma wyjątku „niezbędne audio” ani progu 5 sekund z 2.2.2. Techniki G60 (zakończenie w najwyżej 3 sekundy), G170 (wcześnie dostępne sterowanie) i G171 (start na żądanie) są pomocniczymi sposobami. F23 opisuje automatyczny dźwięk bez właściwej kontroli; F93 dotyczy HTML. Nie są dodatkowymi wymaganiami konkretnego API.
Platformy
| Środowisko | Podstawa i adaptacja | Wykonanie źródłowe |
|---|---|---|
| WWW, również w telefonie | WCAG 2.2, 1.4.2: automatyczne słyszalne audio ponad 3 sekundy na całej stronie. | Przegląd AI; przeglądarka niewykonana. |
| Aplikacje mobilne i desktopowe | WCAG2ICT: stronę zastępuje cały program; warunek audio i alternatywy kontroli pozostają. | Flutter/iOS Simulator; Android, desktop i inne frameworki niewykonane. |
| Dokumenty poza WWW | WCAG2ICT: cały dokument, wraz z dostępnymi funkcjami odbiornika. Dokument bez automatycznego audio nie uruchamia warunku. | Dokument i odbiornik niewykonane. |
| Oprogramowanie kiosku lub telewizora | Część webowa jak WWW, natywna jak oprogramowanie; przy zamkniętej funkcjonalności ustalić rzeczywiście dostępne sterowanie. | Niewykonane; bez oceny całego sprzętu. |
Interpretację sprawdzono przez AI 2026-10-02. Źródło nie wskazuje daty wydania użytej WCAG2ICT; konwersja nie uzupełnia jej domysłem. WCAG2ICT jest wskazówką, a obowiązek prawny wymaga osobnej oceny. W hybrydzie uwzględnij audio obu części. Brak testu nie wyłącza zastosowania.
Rozwiązania w technologiach
Najmniejsza alternatywa projektowa: nie wywołuj startu podczas otwierania ekranu; podłącz go do jasno nazwanej akcji. Jeśli autoplay pozostaje, kontrola musi działać na rzeczywistym odtwarzaczu i wszystkich równocześnie uruchamianych przez tę treść dźwiękach. Nie dodawać kontrolki sterującej innym lub już zwolnionym odtwarzaczem.
Android / Compose
import android.media.MediaPlayer
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@Composable
fun PauseInstruction(player: MediaPlayer) {
// Właściciel przekazuje przygotowany, żywy odtwarzacz i obsługuje jego błędy.
Button(onClick = { if (player.isPlaying) player.pause() }) {
Text("Wstrzymaj dźwięk")
}
}Kontekst: odtwarzacz utworzony i przygotowany przez właściciela ekranu; start() wznawia po pauzie. Alternatywa player.setVolume(0f, 0f) ścisza ten player, nie strumień systemowy. MediaPlayer.stop() wymaga ponownego przygotowania przed start(); nie kopiować logiki wznowienia po pauzie do stanu Stopped. Właściciel obsługuje błędy i release() poza tą kontrolką. Przegląd oficjalnej dokumentacji: tak, 2026-10-02. Kompilacja/wykonanie: niewykonane; nie uruchamiano Androida.
iOS / SwiftUI
import SwiftUI
import AVFAudio
struct AudioControls: View {
let player: AVAudioPlayer // Żywy player utworzony przez właściciela.
var body: some View {
VStack {
Button("Wstrzymaj dźwięk") { player.pause() }
Button("Zatrzymaj dźwięk") {
player.stop()
player.currentTime = 0
}
Button("Wycisz instrukcję") { player.volume = 0 }
}
}
}Przykład pokazuje alternatywy, nie obowiązek trzech przycisków. Inicjalizacja pliku i sesji ma obsługę throw; sprawdź też Bool zwracany przez play(). Player volume jest odrębne od AVAudioSession.outputVolume; .mixWithOthers nie jest .duckOthers i samo nie potwierdza doświadczenia VoiceOver. Przegląd dokumentacji i nagłówków użytego SDK: tak. Fragment SwiftUI: typecheck Xcode 27.0 / SDK 27.0 / arm64 / iOS 17 PASS; osobna aplikacja SwiftUI niewykonana. Rzeczywisty natywny player jest testowany we wspólnym Flutterze.
Flutter
Wykonana demonstracja używa Cupertino i istniejących plików; natywny AppDelegate obsługuje dedykowany kanał eu.clearship.research/audio-control. Żądania są kolejkowane; odpytywanie stanu co 200 ms nie zastępuje zegara testu. configure(false) wybiera start manualny, pause zachowuje pozycję, stop ją zeruje, volume(0.0) pozostawia odtwarzanie przy własnej głośności zero. Błędy kanału/pliku/odtwarzania mają komunikat; przy zwolnieniu ekranu zatrzymujemy audio. To demonstracja na iOS; Android nie otrzymał implementacji kanału, wcześniejszy Material pozostaje zachowany.
Minimalna kontrolka do osadzenia w stanie używającym tego kanału:
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
Widget pauseControl(VoidCallback onError) => CupertinoButton(
onPressed: () async {
try {
await const MethodChannel('eu.clearship.research/audio-control')
.invokeMethod<void>('pause');
} on PlatformException {
onError();
} on MissingPluginException {
onError();
}
},
child: const Text('Wstrzymaj dźwięk'),
);Przegląd dokumentacji: tak. Flutter 3.44.9 / Dart 3.12.2; analiza, widgety, build i rzeczywiste XCTest iOS: wyniki poniżej. Typ zwrotny powyżej ignoruje mapę stanu; pełny ekran odczytuje ją przez invokeMapMethod.
React Native
import { Button, View } from 'react-native';
type Props = { pause: () => void; mute: () => void };
export function AudioControls({ pause, mute }: Props) {
return (
<View>
<Button title="Wstrzymaj dźwięk" onPress={pause} />
<Button title="Wycisz instrukcję" onPress={mute} />
</View>
);
}To warstwa sterowania istniejącym odtwarzaczem. Właściciel przekazuje funkcje z obsługą błędów, które rzeczywiście pauzują lub wyciszają audio niezależnie od systemu; rdzeń React Native Button nie odtwarza dźwięku. Użyć już stosowanego modułu odtwarzania albo natywnego mostu; nie zakładać nowej zależności ani fikcyjnego API audio w rdzeniu. Oficjalne API Button sprawdzone 2026-10-02; kompilacja/wykonanie niewykonane.
Jak sprawdzić
- Wejdź bez akcji zapowiadającej dźwięk. Ustal wszystkie źródła i faktyczne wyjście audio, także po nawigacji. Zmierz czas niezależnym zegarem.
- Przy dźwięku ponad 3 sekundy wykonaj pauzę, stop albo własną głośność do zera. Obserwuj przez kilka sekund. Pauza ma pozostać pauzą; przy mute pozycja może rosnąć, lecz głośność systemu nie powinna się zmieniać.
- Sprawdź wznowienie na żądanie, przejścia i reset. Kontrola jednego playera nie wystarcza, gdy inne źródła grają dalej.
- Porównaj start manualny: przed akcją brak odtwarzania i pozycja 0; po jasno nazwanej akcji audio może trwać dłużej. Dla niemego źródła lub skutecznej blokady autoplay ustal wynik zamiast oceniać sam kod.
- Osobno odsłuchaj wyjście i sprawdź z czytnikiem dostęp do sterowania oraz mowę po jego użyciu. Odczyt API nie zastępuje tych prób.
Historyczne obserwacje z 2026-10-02
| Kontrola | Wynik i ograniczenie |
|---|---|
| Flutter 3.44.9 / Dart 3.12.2 | Analiza, 12 testów hostowych i build iOS PASS. |
| Natywny XCTest | 2 testy, 0 błędów, 153,685 sekundy; kontrola playera i regresja AVKit. |
| Czas i player | 19 odczytów AVAudioPlayer; niezależny zegar monotoniczny XCTest i przedziały pobierania próbek. Maksymalny wiek odczytu 0,228 sekundy. |
| Bad/good przed kontrolą | Pozycja rosła odpowiednio o 5,400 i 5,201 sekundy w oknach około 5,3 sekundy. |
| Pauza, wznowienie, stop | Po pauzie pozycja bez zmiany przez 4,760–4,803 sekundy; po wznowieniu +2,559 sekundy. Stop utrzymał 0 przez 2,391–2,438 sekundy. |
| Mute | Pozycja +5,595 sekundy, volume=0, systemVolume=0,600000024 bez zmiany. |
| Manual | Pozycja 0 i playing=false przez 5,268–5,308 sekundy; po starcie pozycja przekroczyła 3 sekundy. |
| Plik WAV | PCM s16le, mono, 44 100 Hz, 14,772336 sekundy; okna RMS ponad −45 dBFS sumują się do 12,9 sekundy. To heurystyka sygnału, bez odsłuchu. |
| SwiftUI | Typecheck Xcode 27.0 / SDK 27.0 / arm64 / cel iOS 17 PASS; osobna aplikacja niewykonana. |
| Android i React Native | Dokumentacja sprawdzona; kompilacja i działanie niewykonane. |
Po pierwszej próbie uzupełniono Semantics.enabled, bo CupertinoButton nie wystawiał oczekiwanego natywnego stanu wyłączenia. Końcowy XCTest potwierdził brak aktywności ustawień bad do naturalnego końca oraz ich powrót, zmianę wariantu i reset. Próg dokładnie 3 sekund sprawdzono interpretacyjnie, bez dodatkowego klipu granicznego. Nie montowano WAV do filmu ekranów.
Weryfikacja i ograniczenia
Odczyty playera i źródłowego PCM potwierdzają mechanikę czterech scenariuszy na symulatorze. Małe różnice między pozycją a zegarem wynikają z próbkowania; nie opisują dokładności akustycznej. Drzewo pomaga znaleźć nazwy kontrolek, ale nie potwierdza ich działania. Sam plik ponad 3 sekundy, autoplay lub etykieta „Pauza” nie dają pełnej oceny.
Jak sprawdza Clearship
Na Androidzie Clearship analizuje próbki aktywnych odtwarzaczy aplikacji zbierane co sekundę podczas około sześciu sekund czekania na ekranie. Szuka samoczynnego odtwarzania ponad 3 sekundy oraz kontrolek pauzy, zatrzymania i własnej głośności w drzewie. Pochodzenie startu przybliża z kroków trasy i podobieństwa treści; to może błędnie uznać zwykłe rozwinięcie sekcji za żądanie audio.
Metoda timing-audio-1 spełniła próg pomiaru kontrolnego Androida 2026-10-08 (6 z 6 usterek, 0 fałszywych alarmów na 44 poprawnych ekranach). Ten wynik dotyczy obserwowanych okien i stanu playera. Słyszalność, systemowa głośność, inne procesy i skuteczność kontrolki pozostają poza zakresem. Rozpoznana kontrolka, trzy próbki blisko progu, brak danych lub kanału audio wymagają człowieka. iOS nie ma kanału audio tej metody i pomiar pozostaje niewykonany; brak znaleziska nie potwierdza całego kryterium.