> */ function models() { return array( 'tiny' => array( 'label' => __( 'Tiny – fastest, rough', 'captionwright' ), 'webgpu' => 113, 'wasm' => 38, ), 'base' => array( 'label' => __( 'Base – fast, good for clear speech', 'captionwright' ), 'webgpu' => 195, 'wasm' => 73, ), 'small' => array( 'label' => __( 'Small – better accuracy, slower', 'captionwright' ), 'webgpu' => 390, 'wasm' => 237, ), 'turbo' => array( 'label' => __( 'Large v3 Turbo – best accuracy (needs a GPU)', 'captionwright' ), 'webgpu' => 1533, 'wasm' => 0, ), ); } /** * Languages offered in the UI (Whisper supports more; these cover most sites). * * @return array code => English name */ function languages() { return array( 'en' => 'English', 'sv' => 'Swedish', 'no' => 'Norwegian', 'da' => 'Danish', 'fi' => 'Finnish', 'de' => 'German', 'nl' => 'Dutch', 'fr' => 'French', 'es' => 'Spanish', 'pt' => 'Portuguese', 'it' => 'Italian', 'pl' => 'Polish', 'cs' => 'Czech', 'et' => 'Estonian', 'lv' => 'Latvian', 'lt' => 'Lithuanian', 'uk' => 'Ukrainian', 'ru' => 'Russian', 'tr' => 'Turkish', 'el' => 'Greek', 'hu' => 'Hungarian', 'ro' => 'Romanian', 'ar' => 'Arabic', 'he' => 'Hebrew', 'hi' => 'Hindi', 'ja' => 'Japanese', 'ko' => 'Korean', 'zh' => 'Chinese', 'id' => 'Indonesian', 'vi' => 'Vietnamese', ); } /** * The site language as a Whisper code, falling back to English. * * @return string */ function site_language() { $code = strtolower( substr( get_locale(), 0, 2 ) ); if ( 'nb' === $code || 'nn' === $code ) { $code = 'no'; } return array_key_exists( $code, languages() ) ? $code : 'en'; } /** * Saved settings merged with defaults. * * @return array */ function settings() { $defaults = array( 'model' => 'base', 'language' => site_language(), 'default_on' => true, 'auto_transcript' => false, 'consent' => false, 'processor_only' => false, ); $saved = get_option( OPTION, array() ); return array_merge( $defaults, is_array( $saved ) ? $saved : array() ); } /** * Clean posted settings. * * @param array $input Raw input. * @return array */ function sanitize_settings( $input ) { $input = is_array( $input ) ? $input : array(); $model = isset( $input['model'] ) ? sanitize_key( $input['model'] ) : 'base'; $lang = isset( $input['language'] ) ? sanitize_key( $input['language'] ) : site_language(); return array( 'model' => array_key_exists( $model, models() ) ? $model : 'base', 'language' => array_key_exists( $lang, languages() ) ? $lang : site_language(), 'default_on' => ! empty( $input['default_on'] ), 'auto_transcript' => ! empty( $input['auto_transcript'] ), 'consent' => ! empty( $input['consent'] ), 'processor_only' => ! empty( $input['processor_only'] ), ); }