Add Transcribe docs (about/guide/tech) + refresh Redact docs

- New: transcribe-about.php, transcribe-guide.php, transcribe-tech.php
  with full en/no/uk/pl translations (3-engine cascade, diarization, vocab)
- New: translations/transcribe-about|guide|tech.php (4-lang strings)
- New: scripts/translate-pages.php (Azure gpt-4o CLI translation helper)
- Add korr-doc-links nav to transcribe.php
- Refresh redact-about|guide|tech.php — point to assets/images/redact/
- Fix all "never written to disk" wording in redact translations
- Add Min Sak/corpus save workflow to redact guide and tech privacy section
- redact.php upload hint: correct in-memory wording

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 10:28:06 +02:00
parent 234ab7278b
commit b84827ecea
15 changed files with 2307 additions and 23 deletions
+1 -1
View File
@@ -67,7 +67,7 @@ $t = $_pt[$uiLang] ?? $_pt['en'];
</nav> </nav>
<!-- Hero --> <!-- Hero -->
<section class="kdoc-hero" style="background: linear-gradient(rgba(0,20,60,0.82),rgba(0,20,60,0.88)), url('assets/images/timeline/hero-marketing.png') center/cover no-repeat;"> <section class="kdoc-hero" style="background: linear-gradient(rgba(0,20,60,0.82),rgba(0,20,60,0.88)), url('assets/images/redact/hero-marketing.png') center/cover no-repeat;">
<div class="kdoc-hero__inner"> <div class="kdoc-hero__inner">
<p class="kdoc-hero__kicker"><?= htmlspecialchars($t['hero_kicker']) ?></p> <p class="kdoc-hero__kicker"><?= htmlspecialchars($t['hero_kicker']) ?></p>
<h1 class="kdoc-hero__title"><?= htmlspecialchars($t['hero_title']) ?></h1> <h1 class="kdoc-hero__title"><?= htmlspecialchars($t['hero_title']) ?></h1>
+2 -1
View File
@@ -63,7 +63,7 @@ $t = $_pt[$uiLang] ?? $_pt['en'];
</nav> </nav>
<!-- Hero --> <!-- Hero -->
<section class="kdoc-hero" style="background: linear-gradient(rgba(0,20,60,0.78),rgba(0,20,60,0.86)), url('assets/images/timeline/hero-guide.png') center/cover no-repeat;"> <section class="kdoc-hero" style="background: linear-gradient(rgba(0,20,60,0.78),rgba(0,20,60,0.86)), url('assets/images/redact/hero-guide.png') center/cover no-repeat;">
<div class="kdoc-hero__inner"> <div class="kdoc-hero__inner">
<p class="kdoc-hero__kicker"><?= htmlspecialchars($t['hero_kicker']) ?></p> <p class="kdoc-hero__kicker"><?= htmlspecialchars($t['hero_kicker']) ?></p>
<h1 class="kdoc-hero__title"><?= htmlspecialchars($t['hero_title']) ?></h1> <h1 class="kdoc-hero__title"><?= htmlspecialchars($t['hero_title']) ?></h1>
@@ -307,6 +307,7 @@ $t = $_pt[$uiLang] ?? $_pt['en'];
<li><?= $t['dl1_html'] ?></li> <li><?= $t['dl1_html'] ?></li>
<li><?= $t['dl2_html'] ?></li> <li><?= $t['dl2_html'] ?></li>
<li><?= $t['dl3_html'] ?></li> <li><?= $t['dl3_html'] ?></li>
<?php if (!empty($t['dl4_html'])): ?><li><?= $t['dl4_html'] ?></li><?php endif; ?>
</ul> </ul>
</div> </div>
</div> </div>
+1 -1
View File
@@ -63,7 +63,7 @@ $t = $_pt[$uiLang] ?? $_pt['en'];
</nav> </nav>
<!-- Hero --> <!-- Hero -->
<section class="kdoc-hero" style="background: linear-gradient(rgba(5,15,40,0.85),rgba(5,15,40,0.92)), url('assets/images/timeline/hero-tech.png') center/cover no-repeat;"> <section class="kdoc-hero" style="background: linear-gradient(rgba(5,15,40,0.85),rgba(5,15,40,0.92)), url('assets/images/redact/hero-tech.png') center/cover no-repeat;">
<div class="kdoc-hero__inner"> <div class="kdoc-hero__inner">
<p class="kdoc-hero__kicker"><?= htmlspecialchars($t['hero_kicker']) ?></p> <p class="kdoc-hero__kicker"><?= htmlspecialchars($t['hero_kicker']) ?></p>
<h1 class="kdoc-hero__title"><?= htmlspecialchars($t['hero_title']) ?></h1> <h1 class="kdoc-hero__title"><?= htmlspecialchars($t['hero_title']) ?></h1>
+1 -1
View File
@@ -105,7 +105,7 @@ require_once __DIR__ . '/includes/layout.php';
<div id="uploadPrompt" class="upload-prompt"> <div id="uploadPrompt" class="upload-prompt">
<span class="upload-icon" aria-hidden="true">&#8679;</span> <span class="upload-icon" aria-hidden="true">&#8679;</span>
<p><span data-i18n="redactUploadDrop">Drop one file here, or</span> <label for="uploadInput" class="upload-browse" data-i18n="redactUploadBrowse">browse</label></p> <p><span data-i18n="redactUploadDrop">Drop one file here, or</span> <label for="uploadInput" class="upload-browse" data-i18n="redactUploadBrowse">browse</label></p>
<p class="upload-hint"><strong>PDF</strong>, <strong>DOCX</strong>, <strong>TXT</strong> &mdash; <span data-i18n="redactUploadHint">text extracted in memory, never stored</span></p> <p class="upload-hint"><strong>PDF</strong>, <strong>DOCX</strong>, <strong>TXT</strong> &mdash; <span data-i18n="redactUploadHint">processed in memory — save results to Min Sak or download</span></p>
</div> </div>
<div id="uploadFileInfo" class="upload-file is-hidden"> <div id="uploadFileInfo" class="upload-file is-hidden">
<ul id="uploadFileList" class="upload-file-list"></ul> <ul id="uploadFileList" class="upload-file-list"></ul>
+193
View File
@@ -0,0 +1,193 @@
<?php
/**
* translate-pages.php
*
* CLI utility: translates the 'en' entries in a translations/*.php file
* into Norwegian (no), Ukrainian (uk), and Polish (pl) using Azure OpenAI gpt-4o.
*
* Usage:
* php scripts/translate-pages.php translations/transcribe-about.php
*
* The file is updated in-place — existing no/uk/pl keys are replaced.
*
* Config (env vars or constants below):
* AZURE_OPENAI_KEY — Azure OpenAI API key
* AZURE_OPENAI_ENDPOINT — e.g. https://exos-openai-test.openai.azure.com
* AZURE_OPENAI_DEPLOY — deployment name, default gpt-4o
* AZURE_OPENAI_VERSION — API version, default 2024-02-01
*/
declare(strict_types=1);
// ── Config ──────────────────────────────────────────────────────────────────
$apiKey = getenv('AZURE_OPENAI_KEY') ?: '7cb23c8ce75741c798a7dfe24827c95e';
$endpoint = rtrim(getenv('AZURE_OPENAI_ENDPOINT') ?: 'https://exos-openai-test.openai.azure.com', '/');
$deploy = getenv('AZURE_OPENAI_DEPLOY') ?: 'gpt-4o';
$apiVer = getenv('AZURE_OPENAI_VERSION') ?: '2024-02-01';
$batchSize = 20; // keys per API call
$targetLangs = [
'no' => 'Norwegian Bokmål (nn is Nynorsk; this is bokmål). Legal and formal register. Preserve Norwegian legal terminology.',
'uk' => 'Ukrainian. Formal register suitable for legal documents. Use standard Ukrainian orthography.',
'pl' => 'Polish. Formal register suitable for legal documents.',
];
// ── Entry point ──────────────────────────────────────────────────────────────
if (PHP_SAPI !== 'cli') {
http_response_code(403);
exit('CLI only');
}
if ($argc < 2) {
fwrite(STDERR, "Usage: php scripts/translate-pages.php translations/<file>.php\n");
exit(1);
}
$filePath = realpath($argv[1]);
if (!$filePath || !is_file($filePath)) {
fwrite(STDERR, "File not found: {$argv[1]}\n");
exit(1);
}
echo "Loading: $filePath\n";
$allLangs = require $filePath;
if (!is_array($allLangs) || !isset($allLangs['en'])) {
fwrite(STDERR, "File must return an array with an 'en' key.\n");
exit(1);
}
$englishStrings = $allLangs['en'];
echo 'English keys: ' . count($englishStrings) . "\n";
// ── Translate each target language ──────────────────────────────────────────
foreach ($targetLangs as $langCode => $langDesc) {
echo "\nTranslating → $langCode ($langDesc)...\n";
$translated = translateAll($englishStrings, $langCode, $langDesc, $endpoint, $deploy, $apiVer, $apiKey, $batchSize);
$allLangs[$langCode] = $translated;
echo " Done. Keys translated: " . count($translated) . "\n";
}
// ── Write back ───────────────────────────────────────────────────────────────
$phpCode = "<?php\nreturn " . varExportShort($allLangs) . ";\n";
file_put_contents($filePath, $phpCode);
echo "\nWritten: $filePath\n";
// ── Functions ────────────────────────────────────────────────────────────────
function translateAll(
array $strings,
string $langCode,
string $langDesc,
string $endpoint,
string $deploy,
string $apiVer,
string $apiKey,
int $batchSize
): array {
$keys = array_keys($strings);
$batches = array_chunk($keys, $batchSize);
$result = [];
foreach ($batches as $i => $batchKeys) {
$batchNum = $i + 1;
$total = count($batches);
echo " Batch $batchNum/$total (" . count($batchKeys) . " keys)...\n";
$batchStrings = array_intersect_key($strings, array_flip($batchKeys));
$translated = callAzureOpenAI($batchStrings, $langCode, $langDesc, $endpoint, $deploy, $apiVer, $apiKey);
$result = array_merge($result, $translated);
}
return $result;
}
function callAzureOpenAI(
array $strings,
string $langCode,
string $langDesc,
string $endpoint,
string $deploy,
string $apiVer,
string $apiKey
): array {
$systemPrompt = <<<PROMPT
You are a professional legal translator specialising in Scandinavian and Eastern European languages.
Translate the following PHP string values from English to {$langDesc}.
Rules:
- Preserve all HTML tags exactly (<strong>, <em>, <code>, <br> etc.)
- Preserve all bracketed tokens exactly: [FATHER], [PERSON], [SOCIAL WORKER], [ORG] etc.
- Preserve all arrow characters (→, ←, →) and typographic symbols
- Preserve placeholder values like "Ola Nordmann", "00:01:24" unchanged
- Keep URLs, file extensions (.docx, .php), and technical terms (PDF, DOCX, GPT-4o, Whisper, pyannote) unchanged
- Translate UI labels, descriptions, and body text naturally into {$langDesc}
- Return ONLY a valid JSON object with the same keys as input — no commentary, no markdown fences
PROMPT;
$userContent = json_encode($strings, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
$payload = json_encode([
'messages' => [
['role' => 'system', 'content' => $systemPrompt],
['role' => 'user', 'content' => $userContent],
],
'temperature' => 0.2,
'response_format' => ['type' => 'json_object'],
]);
$url = "{$endpoint}/openai/deployments/{$deploy}/chat/completions?api-version={$apiVer}";
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
"api-key: {$apiKey}",
],
CURLOPT_TIMEOUT => 120,
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($response === false || $httpCode !== 200) {
fwrite(STDERR, "API error HTTP $httpCode: $response\n");
exit(1);
}
$data = json_decode($response, true);
$content = $data['choices'][0]['message']['content'] ?? '';
$translated = json_decode($content, true);
if (!is_array($translated)) {
fwrite(STDERR, "Failed to parse JSON from model response:\n$content\n");
exit(1);
}
return $translated;
}
function varExportShort(mixed $data, int $indent = 0): string
{
$pad = str_repeat(' ', $indent);
$pad1 = str_repeat(' ', $indent + 1);
if (!is_array($data)) {
return var_export($data, true);
}
$isIndexed = array_keys($data) === range(0, count($data) - 1);
$lines = [];
foreach ($data as $key => $value) {
$keyStr = $isIndexed ? '' : var_export($key, true) . ' => ';
$lines[] = $pad1 . $keyStr . varExportShort($value, $indent + 1);
}
return "array (\n" . implode(",\n", $lines) . ",\n{$pad})";
}
+259
View File
@@ -0,0 +1,259 @@
<?php
declare(strict_types=1);
require_once __DIR__ . '/includes/bootstrap.php';
$uiLang = dbnToolsCurrentLanguage();
$isAuthed = dbnToolsIsAuthenticated();
$langPath = '/transcribe-about.php';
$toolsLogin = 'https://dobetternorge.no/tools-login.php?return=' . urlencode('/transcribe.php');
$registerUrl = 'https://dobetternorge.no/register.php';
$ctaUrl = $isAuthed ? '/transcribe.php' : $toolsLogin;
$_pt = require __DIR__ . '/translations/transcribe-about.php';
$t = $_pt[$uiLang] ?? $_pt['en'];
?>
<!doctype html>
<html lang="<?= htmlspecialchars($uiLang) ?>">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Transcribe — Every word, every speaker, instantly transcribed · Do Better Norge Tools</title>
<meta name="description" content="Transcribe converts recordings of hearings, mediations, and CPS meetings into timestamped, speaker-labelled text. Three-engine cascade: Azure Speech, Google Cloud, Whisper GPU. Save to Min Sak or corpus.">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://tools.dobetternorge.no/transcribe-about.php">
<meta property="og:title" content="Transcribe — AI audio transcription for Norwegian legal meetings">
<meta property="og:description" content="Three-engine cascade transcription with speaker identification. Azure Speech → Google Cloud → Whisper GPU. Norwegian, English, Polish, Ukrainian and more.">
<meta property="og:type" content="website">
<meta name="theme-color" content="#00205B">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Crimson+Pro:wght@400;600;700&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap">
<link rel="stylesheet" href="assets/css/tools.css">
<link rel="stylesheet" href="assets/css/dbn-tools-redesign.css">
</head>
<body class="kdoc-page">
<header class="lt-nav">
<a href="https://dobetternorge.no" class="lt-nav__brand">
<picture>
<source srcset="assets/images/logo-header.webp" type="image/webp">
<img class="lt-nav__logo" src="assets/images/logo-header.png" alt="Do Better Norge" width="140" height="36" loading="eager">
</picture>
<span class="lt-nav__badge">Legal Tools</span>
</a>
<div class="lt-nav__right">
<nav class="shell-lang-switcher" aria-label="Language">
<?php foreach (dbnToolsSupportedLanguages() as $langCode): ?>
<a href="<?= htmlspecialchars($langPath . '?lang=' . $langCode) ?>" class="<?= $langCode === $uiLang ? 'is-active' : '' ?>"><?= htmlspecialchars(dbnToolsLanguageLabel($langCode)) ?></a>
<?php endforeach; ?>
</nav>
<?php if ($isAuthed): ?>
<a href="/transcribe.php" class="lt-nav__cta lt-nav__cta--enter"><?= htmlspecialchars($t['nav_open']) ?></a>
<?php else: ?>
<a href="<?= htmlspecialchars($toolsLogin) ?>" class="lt-nav__cta"><?= htmlspecialchars($t['nav_signin']) ?></a>
<?php endif; ?>
</div>
</header>
<nav class="kdoc-doc-nav" aria-label="Transcribe documentation">
<div class="kdoc-doc-nav__inner">
<a href="/transcribe-about.php" class="is-active"><?= htmlspecialchars($t['nav_about']) ?></a>
<a href="/transcribe-guide.php"><?= htmlspecialchars($t['nav_guide']) ?></a>
<a href="/transcribe-tech.php"><?= htmlspecialchars($t['nav_howit']) ?></a>
<?php if ($isAuthed): ?>
<a href="/transcribe.php"><?= htmlspecialchars($t['nav_opentool']) ?></a>
<?php endif; ?>
</div>
</nav>
<!-- Hero -->
<section class="kdoc-hero" style="background: linear-gradient(rgba(0,20,60,0.82),rgba(0,20,60,0.88)), url('assets/images/transcribe/hero-marketing.png') center/cover no-repeat;">
<div class="kdoc-hero__inner">
<p class="kdoc-hero__kicker"><?= htmlspecialchars($t['hero_kicker']) ?></p>
<h1 class="kdoc-hero__title"><?= htmlspecialchars($t['hero_title']) ?></h1>
<p class="kdoc-hero__sub"><?= htmlspecialchars($t['hero_sub']) ?></p>
<div class="kdoc-hero__stats">
<div class="kdoc-hero__stat">
<strong>3</strong>
<span><?= htmlspecialchars($t['stat_engines']) ?></span>
</div>
<div class="kdoc-hero__stat">
<strong>9</strong>
<span><?= htmlspecialchars($t['stat_languages']) ?></span>
</div>
<div class="kdoc-hero__stat">
<strong>20</strong>
<span><?= htmlspecialchars($t['stat_speakers']) ?></span>
</div>
<div class="kdoc-hero__stat">
<strong>6</strong>
<span><?= htmlspecialchars($t['stat_formats']) ?></span>
</div>
</div>
<div class="kdoc-hero__ctas">
<a href="<?= htmlspecialchars($ctaUrl) ?>" class="kdoc-btn-primary"><?= htmlspecialchars($t['btn_try']) ?></a>
<a href="/transcribe-guide.php" class="kdoc-btn-secondary"><?= htmlspecialchars($t['btn_guide']) ?></a>
<a href="/transcribe-tech.php" class="kdoc-btn-secondary"><?= htmlspecialchars($t['btn_howit']) ?></a>
</div>
</div>
</section>
<!-- What you get -->
<section class="kdoc-section--alt">
<div class="kdoc-section">
<p class="kdoc-section__eyebrow"><?= htmlspecialchars($t['what_eyebrow']) ?></p>
<h2 class="kdoc-section__title"><?= htmlspecialchars($t['what_title']) ?></h2>
<div class="kdoc-features">
<div class="kdoc-feature-card">
<span class="kdoc-feature-card__icon">&#127911;</span>
<h3 class="kdoc-feature-card__title"><?= htmlspecialchars($t['f1_title']) ?></h3>
<p class="kdoc-feature-card__body"><?= $t['f1_body_html'] ?></p>
</div>
<div class="kdoc-feature-card">
<span class="kdoc-feature-card__icon">&#128100;</span>
<h3 class="kdoc-feature-card__title"><?= htmlspecialchars($t['f2_title']) ?></h3>
<p class="kdoc-feature-card__body"><?= htmlspecialchars($t['f2_body']) ?></p>
</div>
<div class="kdoc-feature-card">
<span class="kdoc-feature-card__icon">&#128218;</span>
<h3 class="kdoc-feature-card__title"><?= htmlspecialchars($t['f3_title']) ?></h3>
<p class="kdoc-feature-card__body"><?= htmlspecialchars($t['f3_body']) ?></p>
</div>
</div>
</div>
</section>
<!-- How it works (3-step) -->
<div class="kdoc-section">
<p class="kdoc-section__eyebrow"><?= htmlspecialchars($t['how_eyebrow']) ?></p>
<h2 class="kdoc-section__title"><?= htmlspecialchars($t['how_title']) ?></h2>
<p class="kdoc-section__sub"><?= htmlspecialchars($t['how_sub']) ?></p>
<div class="kdoc-steps">
<div class="kdoc-step-card">
<span class="kdoc-step-card__num">1</span>
<h3 class="kdoc-step-card__title"><?= htmlspecialchars($t['s1_title']) ?></h3>
<p class="kdoc-step-card__body"><?= htmlspecialchars($t['s1_body']) ?></p>
<p class="kdoc-step-card__example"><?= htmlspecialchars($t['s1_example']) ?></p>
</div>
<span class="kdoc-step-arrow" aria-hidden="true">&rarr;</span>
<div class="kdoc-step-card">
<span class="kdoc-step-card__num">2</span>
<h3 class="kdoc-step-card__title"><?= htmlspecialchars($t['s2_title']) ?></h3>
<p class="kdoc-step-card__body"><?= htmlspecialchars($t['s2_body']) ?></p>
<p class="kdoc-step-card__example"><?= htmlspecialchars($t['s2_example']) ?></p>
<img src="assets/images/transcribe/form-top.png" alt="Transcribe form showing language selector, speaker identification controls, and vocabulary presets" class="kdoc-step-card__screenshot" loading="lazy">
</div>
<span class="kdoc-step-arrow" aria-hidden="true">&rarr;</span>
<div class="kdoc-step-card">
<span class="kdoc-step-card__num">3</span>
<h3 class="kdoc-step-card__title"><?= htmlspecialchars($t['s3_title']) ?></h3>
<p class="kdoc-step-card__body"><?= htmlspecialchars($t['s3_body']) ?></p>
<p class="kdoc-step-card__example"><?= htmlspecialchars($t['s3_example']) ?></p>
</div>
</div>
</div>
<!-- Screenshots -->
<section class="kdoc-section--alt">
<div class="kdoc-section">
<p class="kdoc-section__eyebrow">Screenshots</p>
<h2 class="kdoc-section__title">See it in action.</h2>
<div class="kdoc-gallery">
<div class="kdoc-gallery__item">
<img src="assets/images/transcribe/form-top.png" alt="Transcribe form — language selector, speaker identification toggle, vocabulary presets, and audio upload zone" class="kdoc-screenshot" loading="lazy">
<p class="kdoc-gallery__caption">The form: audio language, speaker count, vocabulary preset, and file upload queue.</p>
</div>
<div class="kdoc-gallery__item">
<img src="assets/images/transcribe/output-transcript.png" alt="Transcript output showing timestamped lines attributed to SPEAKER 1 and SPEAKER 2" class="kdoc-screenshot" loading="lazy">
<p class="kdoc-gallery__caption">Timestamped output with speaker labels — each line attributed to the right voice.</p>
</div>
<div class="kdoc-gallery__item">
<img src="assets/images/transcribe/diarization-detail.png" alt="Speaker identification controls showing diarize checkbox and speaker count input" class="kdoc-screenshot" loading="lazy">
<p class="kdoc-gallery__caption">Speaker identification: enable diarization, set count or leave on auto-detect.</p>
</div>
<div class="kdoc-gallery__item">
<img src="assets/images/transcribe/output-transcript.png" alt="Min Sak save option and download button below the completed transcript" class="kdoc-screenshot" loading="lazy">
<p class="kdoc-gallery__caption">Save to Min Sak, download as text, or copy — your transcript, your choice.</p>
</div>
</div>
</div>
</section>
<!-- Output formats spotlight -->
<div class="kdoc-section">
<p class="kdoc-section__eyebrow"><?= htmlspecialchars($t['output_eyebrow']) ?></p>
<h2 class="kdoc-section__title"><?= htmlspecialchars($t['output_title']) ?></h2>
<div class="kdoc-llm-spotlight">
<div>
<span class="kdoc-llm-spotlight__badge"><?= htmlspecialchars($t['output_badge']) ?></span>
<h3 class="kdoc-llm-spotlight__title"><?= htmlspecialchars($t['output_h1']) ?></h3>
<p class="kdoc-llm-spotlight__body"><?= $t['output_body_html'] ?></p>
</div>
<div class="kdoc-llm-stats">
<div class="kdoc-llm-stat">
<strong>[00:01:24]</strong>
<span><?= htmlspecialchars($t['output_s1']) ?></span>
</div>
<div class="kdoc-llm-stat">
<strong>SPEAKER 1</strong>
<span><?= htmlspecialchars($t['output_s2']) ?></span>
</div>
<div class="kdoc-llm-stat">
<strong>EN</strong>
<span><?= htmlspecialchars($t['output_s3']) ?></span>
</div>
<div class="kdoc-llm-stat">
<strong>3</strong>
<span><?= htmlspecialchars($t['output_s4']) ?></span>
</div>
</div>
</div>
</div>
<!-- Save options -->
<section class="kdoc-section--alt">
<div class="kdoc-section">
<p class="kdoc-section__eyebrow"><?= htmlspecialchars($t['save_eyebrow']) ?></p>
<h2 class="kdoc-section__title"><?= htmlspecialchars($t['save_title']) ?></h2>
<p class="kdoc-section__sub"><?= htmlspecialchars($t['save_sub']) ?></p>
<div class="kdoc-features">
<div class="kdoc-feature-card">
<span class="kdoc-feature-card__icon">&#128193;</span>
<h3 class="kdoc-feature-card__title"><?= htmlspecialchars($t['sv1_title']) ?></h3>
<p class="kdoc-feature-card__body"><?= htmlspecialchars($t['sv1_body']) ?></p>
</div>
<div class="kdoc-feature-card">
<span class="kdoc-feature-card__icon">&#128269;</span>
<h3 class="kdoc-feature-card__title"><?= htmlspecialchars($t['sv2_title']) ?></h3>
<p class="kdoc-feature-card__body"><?= htmlspecialchars($t['sv2_body']) ?></p>
</div>
<div class="kdoc-feature-card">
<span class="kdoc-feature-card__icon">&#8659;</span>
<h3 class="kdoc-feature-card__title"><?= htmlspecialchars($t['sv3_title']) ?></h3>
<p class="kdoc-feature-card__body"><?= htmlspecialchars($t['sv3_body']) ?></p>
</div>
</div>
</div>
</section>
<!-- CTA strip -->
<section class="kdoc-cta-strip">
<h2 class="kdoc-cta-strip__title"><?= htmlspecialchars($t['cta_title']) ?></h2>
<p class="kdoc-cta-strip__sub"><?= htmlspecialchars($t['cta_sub']) ?></p>
<div class="kdoc-hero__ctas">
<?php if ($isAuthed): ?>
<a href="/transcribe.php" class="kdoc-btn-primary"><?= htmlspecialchars($t['btn_open']) ?></a>
<?php else: ?>
<a href="<?= htmlspecialchars($toolsLogin) ?>" class="kdoc-btn-primary"><?= htmlspecialchars($t['btn_signin_cta']) ?></a>
<a href="<?= htmlspecialchars($registerUrl) ?>" class="kdoc-btn-secondary"><?= htmlspecialchars($t['btn_register']) ?></a>
<?php endif; ?>
</div>
</section>
<?php require_once __DIR__ . '/includes/footer.php'; ?>
<script src="assets/js/tools.js" defer></script>
</body>
</html>
+262
View File
@@ -0,0 +1,262 @@
<?php
declare(strict_types=1);
require_once __DIR__ . '/includes/bootstrap.php';
$uiLang = dbnToolsCurrentLanguage();
$isAuthed = dbnToolsIsAuthenticated();
$langPath = '/transcribe-guide.php';
$toolsLogin = 'https://dobetternorge.no/tools-login.php?return=' . urlencode('/transcribe.php');
$_pt = require __DIR__ . '/translations/transcribe-guide.php';
$t = $_pt[$uiLang] ?? $_pt['en'];
?>
<!doctype html>
<html lang="<?= htmlspecialchars($uiLang) ?>">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Transcribe User Guide — How to transcribe Norwegian legal recordings · Do Better Norge Tools</title>
<meta name="description" content="Step-by-step guide to using Transcribe: audio language, speaker identification, vocabulary presets, Whisper model selection, AI cleanup, upload, and saving to Min Sak or corpus.">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://tools.dobetternorge.no/transcribe-guide.php">
<meta property="og:title" content="Transcribe User Guide">
<meta property="og:description" content="How to use Transcribe to convert Norwegian legal recordings to timestamped, speaker-labelled text — engine selection, diarization, vocabulary presets, Min Sak save.">
<meta name="theme-color" content="#00205B">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Crimson+Pro:wght@400;600;700&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap">
<link rel="stylesheet" href="assets/css/tools.css">
<link rel="stylesheet" href="assets/css/dbn-tools-redesign.css">
</head>
<body class="kdoc-page">
<header class="lt-nav">
<a href="https://dobetternorge.no" class="lt-nav__brand">
<picture>
<source srcset="assets/images/logo-header.webp" type="image/webp">
<img class="lt-nav__logo" src="assets/images/logo-header.png" alt="Do Better Norge" width="140" height="36" loading="eager">
</picture>
<span class="lt-nav__badge">Legal Tools</span>
</a>
<div class="lt-nav__right">
<nav class="shell-lang-switcher" aria-label="Language">
<?php foreach (dbnToolsSupportedLanguages() as $langCode): ?>
<a href="<?= htmlspecialchars($langPath . '?lang=' . $langCode) ?>" class="<?= $langCode === $uiLang ? 'is-active' : '' ?>"><?= htmlspecialchars(dbnToolsLanguageLabel($langCode)) ?></a>
<?php endforeach; ?>
</nav>
<?php if ($isAuthed): ?>
<a href="/transcribe.php" class="lt-nav__cta lt-nav__cta--enter"><?= htmlspecialchars($t['nav_open']) ?></a>
<?php else: ?>
<a href="<?= htmlspecialchars($toolsLogin) ?>" class="lt-nav__cta"><?= htmlspecialchars($t['nav_signin']) ?></a>
<?php endif; ?>
</div>
</header>
<nav class="kdoc-doc-nav" aria-label="Transcribe documentation">
<div class="kdoc-doc-nav__inner">
<a href="/transcribe-about.php"><?= htmlspecialchars($t['nav_about']) ?></a>
<a href="/transcribe-guide.php" class="is-active"><?= htmlspecialchars($t['nav_guide']) ?></a>
<a href="/transcribe-tech.php"><?= htmlspecialchars($t['nav_howit']) ?></a>
<?php if ($isAuthed): ?><a href="/transcribe.php"><?= htmlspecialchars($t['nav_opentool']) ?></a><?php endif; ?>
</div>
</nav>
<!-- Hero -->
<section class="kdoc-hero" style="background: linear-gradient(rgba(0,20,60,0.78),rgba(0,20,60,0.86)), url('assets/images/transcribe/hero-guide.png') center/cover no-repeat;">
<div class="kdoc-hero__inner">
<p class="kdoc-hero__kicker"><?= htmlspecialchars($t['hero_kicker']) ?></p>
<h1 class="kdoc-hero__title"><?= htmlspecialchars($t['hero_title']) ?></h1>
<p class="kdoc-hero__sub"><?= htmlspecialchars($t['hero_sub']) ?></p>
</div>
</section>
<!-- TOC + content -->
<div class="kdoc-section">
<div class="kdoc-toc">
<p class="kdoc-toc__title"><?= htmlspecialchars($t['toc_title']) ?></p>
<ol>
<li><a href="#lang"><?= htmlspecialchars($t['toc_1']) ?></a></li>
<li><a href="#speakers"><?= htmlspecialchars($t['toc_2']) ?></a></li>
<li><a href="#vocab"><?= htmlspecialchars($t['toc_3']) ?></a></li>
<li><a href="#task"><?= htmlspecialchars($t['toc_4']) ?></a></li>
<li><a href="#vad"><?= htmlspecialchars($t['toc_5']) ?></a></li>
<li><a href="#model"><?= htmlspecialchars($t['toc_6']) ?></a></li>
<li><a href="#cleanup"><?= htmlspecialchars($t['toc_7']) ?></a></li>
<li><a href="#upload"><?= htmlspecialchars($t['toc_8']) ?></a></li>
<li><a href="#myaudio"><?= htmlspecialchars($t['toc_9']) ?></a></li>
<li><a href="#output"><?= htmlspecialchars($t['toc_10']) ?></a></li>
<li><a href="#save"><?= htmlspecialchars($t['toc_11']) ?></a></li>
</ol>
</div>
<!-- Step 1: Audio language -->
<div class="kdoc-guide-step" id="lang">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['step1_title']) ?></h2>
<p><?= htmlspecialchars($t['step1_intro']) ?></p>
<table class="kdoc-table">
<thead><tr>
<th><?= htmlspecialchars($t['step1_table_lang']) ?></th>
<th><?= htmlspecialchars($t['step1_table_code']) ?></th>
<th><?= htmlspecialchars($t['step1_table_notes']) ?></th>
</tr></thead>
<tbody>
<tr><td><?= htmlspecialchars($t['step1_nb']) ?></td><td><code>no</code></td><td><?= htmlspecialchars($t['step1_nb_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['step1_nn']) ?></td><td><code>nn</code></td><td><?= htmlspecialchars($t['step1_nn_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['step1_en']) ?></td><td><code>en</code></td><td><?= htmlspecialchars($t['step1_en_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['step1_pl']) ?></td><td><code>pl</code></td><td><?= htmlspecialchars($t['step1_pl_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['step1_uk']) ?></td><td><code>uk</code></td><td><?= htmlspecialchars($t['step1_uk_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['step1_sv']) ?></td><td><code>sv</code></td><td><?= htmlspecialchars($t['step1_sv_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['step1_da']) ?></td><td><code>da</code></td><td><?= htmlspecialchars($t['step1_da_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['step1_de']) ?></td><td><code>de</code></td><td><?= htmlspecialchars($t['step1_de_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['step1_fr']) ?></td><td><code>fr</code></td><td><?= htmlspecialchars($t['step1_fr_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['step1_auto']) ?></td><td><code>auto</code></td><td><?= htmlspecialchars($t['step1_auto_notes']) ?></td></tr>
</tbody>
</table>
<p class="kdoc-guide-tip">&#128161; <?= htmlspecialchars($t['step1_tip']) ?></p>
<img src="assets/images/transcribe/form-top.png" alt="Audio language radio buttons with nb selected as default" class="kdoc-guide-screenshot" loading="lazy">
</div>
<!-- Step 2: Speaker identification -->
<div class="kdoc-guide-step" id="speakers">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['step2_title']) ?></h2>
<p><?= htmlspecialchars($t['step2_intro']) ?></p>
<ul class="kdoc-list">
<li><?= htmlspecialchars($t['step2_enable']) ?></li>
<li><?= htmlspecialchars($t['step2_count']) ?></li>
</ul>
<p class="kdoc-guide-tip">&#128161; <?= htmlspecialchars($t['step2_tip']) ?></p>
<p><?= htmlspecialchars($t['step2_limit']) ?></p>
<img src="assets/images/transcribe/diarization-detail.png" alt="Speaker identification checkbox and speaker count input field" class="kdoc-guide-screenshot" loading="lazy">
</div>
<!-- Step 3: Vocabulary -->
<div class="kdoc-guide-step" id="vocab">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['step3_title']) ?></h2>
<p><?= htmlspecialchars($t['step3_intro']) ?></p>
<table class="kdoc-table">
<thead><tr>
<th><?= htmlspecialchars($t['step3_table_preset']) ?></th>
<th><?= htmlspecialchars($t['step3_table_contains']) ?></th>
<th><?= htmlspecialchars($t['step3_table_use']) ?></th>
</tr></thead>
<tbody>
<tr><td><?= htmlspecialchars($t['step3_barnerett']) ?></td><td><?= htmlspecialchars($t['step3_barnerett_contains']) ?></td><td><?= htmlspecialchars($t['step3_barnerett_use']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['step3_mediation']) ?></td><td><?= htmlspecialchars($t['step3_mediation_contains']) ?></td><td><?= htmlspecialchars($t['step3_mediation_use']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['step3_generell']) ?></td><td><?= htmlspecialchars($t['step3_generell_contains']) ?></td><td><?= htmlspecialchars($t['step3_generell_use']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['step3_custom']) ?></td><td><?= htmlspecialchars($t['step3_custom_contains']) ?></td><td><?= htmlspecialchars($t['step3_custom_use']) ?></td></tr>
</tbody>
</table>
<p class="kdoc-guide-tip">&#128161; <?= htmlspecialchars($t['step3_custom_tip']) ?></p>
</div>
<!-- Step 4: Task -->
<div class="kdoc-guide-step" id="task">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['step4_title']) ?></h2>
<p class="kdoc-guide-note"><?= htmlspecialchars($t['step4_intro']) ?></p>
<ul class="kdoc-list">
<li><?= htmlspecialchars($t['step4_transcribe']) ?></li>
<li><?= htmlspecialchars($t['step4_translate']) ?></li>
</ul>
<p class="kdoc-guide-note">&#9888;&#65039; <?= htmlspecialchars($t['step4_note']) ?></p>
</div>
<!-- Step 5: VAD -->
<div class="kdoc-guide-step" id="vad">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['step5_title']) ?></h2>
<p class="kdoc-guide-note"><?= htmlspecialchars($t['step5_intro']) ?></p>
<ul class="kdoc-list">
<li>&#10003; <?= htmlspecialchars($t['step5_when_on']) ?></li>
<li>&#10007; <?= htmlspecialchars($t['step5_when_off']) ?></li>
</ul>
<p class="kdoc-guide-tip">&#128161; <?= htmlspecialchars($t['step5_tip']) ?></p>
</div>
<!-- Step 6: Whisper model -->
<div class="kdoc-guide-step" id="model">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['step6_title']) ?></h2>
<p class="kdoc-guide-note"><?= htmlspecialchars($t['step6_intro']) ?></p>
<table class="kdoc-table">
<thead><tr>
<th><?= htmlspecialchars($t['step6_table_model']) ?></th>
<th><?= htmlspecialchars($t['step6_table_speed']) ?></th>
<th><?= htmlspecialchars($t['step6_table_accuracy']) ?></th>
<th><?= htmlspecialchars($t['step6_table_use']) ?></th>
</tr></thead>
<tbody>
<tr><td><code>large-v3</code> &#9733;</td><td><?= htmlspecialchars($t['step6_lv3_speed']) ?></td><td><?= htmlspecialchars($t['step6_lv3_accuracy']) ?></td><td><?= htmlspecialchars($t['step6_lv3_use']) ?></td></tr>
<tr><td><code>large-v2</code></td><td><?= htmlspecialchars($t['step6_lv2_speed']) ?></td><td><?= htmlspecialchars($t['step6_lv2_accuracy']) ?></td><td><?= htmlspecialchars($t['step6_lv2_use']) ?></td></tr>
<tr><td><code>medium</code></td><td><?= htmlspecialchars($t['step6_medium_speed']) ?></td><td><?= htmlspecialchars($t['step6_medium_accuracy']) ?></td><td><?= htmlspecialchars($t['step6_medium_use']) ?></td></tr>
<tr><td><code>small</code></td><td><?= htmlspecialchars($t['step6_small_speed']) ?></td><td><?= htmlspecialchars($t['step6_small_accuracy']) ?></td><td><?= htmlspecialchars($t['step6_small_use']) ?></td></tr>
<tr><td><code>base</code></td><td><?= htmlspecialchars($t['step6_base_speed']) ?></td><td><?= htmlspecialchars($t['step6_base_accuracy']) ?></td><td><?= htmlspecialchars($t['step6_base_use']) ?></td></tr>
<tr><td><code>tiny</code></td><td><?= htmlspecialchars($t['step6_tiny_speed']) ?></td><td><?= htmlspecialchars($t['step6_tiny_accuracy']) ?></td><td><?= htmlspecialchars($t['step6_tiny_use']) ?></td></tr>
</tbody>
</table>
<p class="kdoc-guide-note"><?= htmlspecialchars($t['step6_note']) ?></p>
</div>
<!-- Step 7: AI cleanup -->
<div class="kdoc-guide-step" id="cleanup">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['step7_title']) ?></h2>
<p class="kdoc-guide-note"><?= htmlspecialchars($t['step7_intro']) ?></p>
<ul class="kdoc-list">
<li><?= htmlspecialchars($t['step7_none']) ?></li>
<li><?= htmlspecialchars($t['step7_mini']) ?></li>
<li><?= htmlspecialchars($t['step7_full']) ?></li>
</ul>
<p class="kdoc-guide-tip">&#128161; <?= htmlspecialchars($t['step7_tip']) ?></p>
</div>
<!-- Step 8: Upload -->
<div class="kdoc-guide-step" id="upload">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['step8_title']) ?></h2>
<p><?= htmlspecialchars($t['step8_intro']) ?></p>
<ul class="kdoc-list">
<li><?= htmlspecialchars($t['step8_formats']) ?></li>
<li><?= htmlspecialchars($t['step8_size']) ?></li>
<li><?= htmlspecialchars($t['step8_queue']) ?></li>
</ul>
<p class="kdoc-guide-tip">&#128161; <?= htmlspecialchars($t['step8_tip']) ?></p>
<img src="assets/images/transcribe/form-top.png" alt="Audio upload zone showing drag-and-drop area and queue with multiple files" class="kdoc-guide-screenshot" loading="lazy">
</div>
<!-- Step 9: My Audio -->
<div class="kdoc-guide-step" id="myaudio">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['step9_title']) ?></h2>
<p><?= htmlspecialchars($t['step9_intro']) ?></p>
<p><?= htmlspecialchars($t['step9_save']) ?></p>
</div>
<!-- Step 10: Reading output -->
<div class="kdoc-guide-step" id="output">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['step10_title']) ?></h2>
<p><?= htmlspecialchars($t['step10_intro']) ?></p>
<pre class="kdoc-code"><?= htmlspecialchars($t['step10_format']) ?></pre>
<ul class="kdoc-list">
<li><?= htmlspecialchars($t['step10_timestamp']) ?></li>
<li><?= htmlspecialchars($t['step10_speaker']) ?></li>
<li><?= htmlspecialchars($t['step10_confidence']) ?></li>
</ul>
<p class="kdoc-guide-tip">&#128161; <?= htmlspecialchars($t['step10_tip']) ?></p>
<img src="assets/images/transcribe/output-transcript.png" alt="Transcript output with timestamps and speaker labels" class="kdoc-guide-screenshot" loading="lazy">
</div>
<!-- Step 11: Save -->
<div class="kdoc-guide-step" id="save">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['step11_title']) ?></h2>
<p><?= htmlspecialchars($t['step11_intro']) ?></p>
<ul class="kdoc-list">
<li><strong>&#128193; <?= htmlspecialchars($t['step11_minsak']) ?></strong></li>
<li><strong>&#128269; <?= htmlspecialchars($t['step11_corpus']) ?></strong></li>
<li><strong>&#8659; <?= htmlspecialchars($t['step11_download']) ?></strong></li>
<li><strong>&#128203; <?= htmlspecialchars($t['step11_copy']) ?></strong></li>
</ul>
<p class="kdoc-guide-note">&#128274; <?= htmlspecialchars($t['step11_note']) ?></p>
</div>
</div><!-- /.kdoc-section -->
<?php require_once __DIR__ . '/includes/footer.php'; ?>
<script src="assets/js/tools.js" defer></script>
</body>
</html>
+262
View File
@@ -0,0 +1,262 @@
<?php
declare(strict_types=1);
require_once __DIR__ . '/includes/bootstrap.php';
$uiLang = dbnToolsCurrentLanguage();
$isAuthed = dbnToolsIsAuthenticated();
$langPath = '/transcribe-tech.php';
$toolsLogin = 'https://dobetternorge.no/tools-login.php?return=' . urlencode('/transcribe.php');
$_pt = require __DIR__ . '/translations/transcribe-tech.php';
$t = $_pt[$uiLang] ?? $_pt['en'];
?>
<!doctype html>
<html lang="<?= htmlspecialchars($uiLang) ?>">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>How Transcribe Works — Three-engine cascade, Whisper GPU, pyannote diarization · Do Better Norge Tools</title>
<meta name="description" content="Technical deep-dive: Azure Batch Speech → Google Cloud Speech-to-Text v2 → Whisper large-v3 GPU cascade, pyannote.audio speaker diarization, vocabulary injection, and GPT-4o cleanup pipeline.">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://tools.dobetternorge.no/transcribe-tech.php">
<meta property="og:title" content="How Transcribe Works — Technical Reference">
<meta property="og:description" content="Three-engine cascade: Azure Speech, Google Cloud Chirp, Whisper GPU. Speaker diarization with pyannote.audio. Optional GPT-4o cleanup. Privacy-first data handling.">
<meta name="theme-color" content="#00205B">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Crimson+Pro:wght@400;600;700&family=IBM+Plex+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap">
<link rel="stylesheet" href="assets/css/tools.css">
<link rel="stylesheet" href="assets/css/dbn-tools-redesign.css">
</head>
<body class="kdoc-page">
<header class="lt-nav">
<a href="https://dobetternorge.no" class="lt-nav__brand">
<picture>
<source srcset="assets/images/logo-header.webp" type="image/webp">
<img class="lt-nav__logo" src="assets/images/logo-header.png" alt="Do Better Norge" width="140" height="36" loading="eager">
</picture>
<span class="lt-nav__badge">Legal Tools</span>
</a>
<div class="lt-nav__right">
<nav class="shell-lang-switcher" aria-label="Language">
<?php foreach (dbnToolsSupportedLanguages() as $langCode): ?>
<a href="<?= htmlspecialchars($langPath . '?lang=' . $langCode) ?>" class="<?= $langCode === $uiLang ? 'is-active' : '' ?>"><?= htmlspecialchars(dbnToolsLanguageLabel($langCode)) ?></a>
<?php endforeach; ?>
</nav>
<?php if ($isAuthed): ?>
<a href="/transcribe.php" class="lt-nav__cta lt-nav__cta--enter"><?= htmlspecialchars($t['nav_open']) ?></a>
<?php else: ?>
<a href="<?= htmlspecialchars($toolsLogin) ?>" class="lt-nav__cta"><?= htmlspecialchars($t['nav_signin']) ?></a>
<?php endif; ?>
</div>
</header>
<nav class="kdoc-doc-nav" aria-label="Transcribe documentation">
<div class="kdoc-doc-nav__inner">
<a href="/transcribe-about.php"><?= htmlspecialchars($t['nav_about']) ?></a>
<a href="/transcribe-guide.php"><?= htmlspecialchars($t['nav_guide']) ?></a>
<a href="/transcribe-tech.php" class="is-active"><?= htmlspecialchars($t['nav_howit']) ?></a>
<?php if ($isAuthed): ?><a href="/transcribe.php"><?= htmlspecialchars($t['nav_opentool']) ?></a><?php endif; ?>
</div>
</nav>
<!-- Hero -->
<section class="kdoc-hero" style="background: linear-gradient(rgba(0,15,50,0.88),rgba(0,15,50,0.93)), url('assets/images/transcribe/hero-tech.png') center/cover no-repeat;">
<div class="kdoc-hero__inner">
<p class="kdoc-hero__kicker"><?= htmlspecialchars($t['hero_kicker']) ?></p>
<h1 class="kdoc-hero__title"><?= htmlspecialchars($t['hero_title']) ?></h1>
<p class="kdoc-hero__sub"><?= htmlspecialchars($t['hero_sub']) ?></p>
<div class="kdoc-hero__stats">
<div class="kdoc-hero__stat">
<strong>3</strong>
<span><?= htmlspecialchars($t['stat_engines']) ?></span>
</div>
<div class="kdoc-hero__stat">
<strong>24×</strong>
<span><?= htmlspecialchars($t['stat_latency']) ?></span>
</div>
<div class="kdoc-hero__stat">
<strong>&lt;5%</strong>
<span><?= htmlspecialchars($t['stat_wer']) ?></span>
</div>
<div class="kdoc-hero__stat">
<strong>20</strong>
<span><?= htmlspecialchars($t['stat_speakers']) ?></span>
</div>
</div>
</div>
</section>
<div class="kdoc-section">
<div class="kdoc-toc">
<p class="kdoc-toc__title"><?= htmlspecialchars($t['toc_title']) ?></p>
<ol>
<li><a href="#arch"><?= htmlspecialchars($t['toc_1']) ?></a></li>
<li><a href="#azure"><?= htmlspecialchars($t['toc_2']) ?></a></li>
<li><a href="#google"><?= htmlspecialchars($t['toc_3']) ?></a></li>
<li><a href="#whisper"><?= htmlspecialchars($t['toc_4']) ?></a></li>
<li><a href="#diarization"><?= htmlspecialchars($t['toc_5']) ?></a></li>
<li><a href="#vocab"><?= htmlspecialchars($t['toc_6']) ?></a></li>
<li><a href="#cleanup"><?= htmlspecialchars($t['toc_7']) ?></a></li>
<li><a href="#languages"><?= htmlspecialchars($t['toc_8']) ?></a></li>
<li><a href="#privacy"><?= htmlspecialchars($t['toc_9']) ?></a></li>
</ol>
</div>
<!-- Architecture -->
<div class="kdoc-guide-step" id="arch">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['arch_title']) ?></h2>
<p><?= htmlspecialchars($t['arch_intro']) ?></p>
<div class="kdoc-pipeline">
<p class="kdoc-pipeline__label"><?= htmlspecialchars($t['arch_cascade_label']) ?></p>
<div class="kdoc-pipeline__stages">
<div class="kdoc-pipeline__stage kdoc-pipeline__stage--primary">
<span class="kdoc-pipeline__num">1</span>
<strong><?= htmlspecialchars($t['arch_e1']) ?></strong>
<small><?= htmlspecialchars($t['arch_e1_sub']) ?></small>
</div>
<span class="kdoc-pipeline__arrow" aria-hidden="true">&darr;</span>
<div class="kdoc-pipeline__stage">
<span class="kdoc-pipeline__num">2</span>
<strong><?= htmlspecialchars($t['arch_e2']) ?></strong>
<small><?= htmlspecialchars($t['arch_e2_sub']) ?></small>
</div>
<span class="kdoc-pipeline__arrow" aria-hidden="true">&darr;</span>
<div class="kdoc-pipeline__stage">
<span class="kdoc-pipeline__num">3</span>
<strong><?= htmlspecialchars($t['arch_e3']) ?></strong>
<small><?= htmlspecialchars($t['arch_e3_sub']) ?></small>
</div>
<span class="kdoc-pipeline__arrow kdoc-pipeline__arrow--right" aria-hidden="true">&rarr;</span>
<div class="kdoc-pipeline__stage kdoc-pipeline__stage--optional">
<strong><?= htmlspecialchars($t['arch_post1']) ?></strong>
<small><?= htmlspecialchars($t['arch_post1_sub']) ?></small>
</div>
<span class="kdoc-pipeline__arrow" aria-hidden="true">&darr;</span>
<div class="kdoc-pipeline__stage kdoc-pipeline__stage--optional">
<strong><?= htmlspecialchars($t['arch_post2']) ?></strong>
<small><?= htmlspecialchars($t['arch_post2_sub']) ?></small>
</div>
</div>
</div>
</div>
<!-- Engine 1: Azure -->
<div class="kdoc-guide-step" id="azure">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['e1_title']) ?></h2>
<p><?= htmlspecialchars($t['e1_intro']) ?></p>
<ul class="kdoc-list">
<li><?= $t['e1_model'] ?></li>
<li><?= htmlspecialchars($t['e1_latency']) ?></li>
<li><?= htmlspecialchars($t['e1_format']) ?></li>
<li><?= htmlspecialchars($t['e1_auth']) ?></li>
</ul>
</div>
<!-- Engine 2: Google -->
<div class="kdoc-guide-step" id="google">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['e2_title']) ?></h2>
<p><?= htmlspecialchars($t['e2_intro']) ?></p>
<ul class="kdoc-list">
<li><?= $t['e2_model'] ?></li>
<li><?= htmlspecialchars($t['e2_latency']) ?></li>
<li><?= htmlspecialchars($t['e2_format']) ?></li>
</ul>
</div>
<!-- Engine 3: Whisper -->
<div class="kdoc-guide-step" id="whisper">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['e3_title']) ?></h2>
<p><?= htmlspecialchars($t['e3_intro']) ?></p>
<ul class="kdoc-list">
<li><?= $t['e3_model'] ?></li>
<li><?= $t['e3_vocab'] ?></li>
<li><?= $t['e3_vad'] ?></li>
<li><?= htmlspecialchars($t['e3_latency']) ?></li>
</ul>
<p class="kdoc-guide-note">&#127968; <?= htmlspecialchars($t['e3_note']) ?></p>
</div>
<!-- Speaker diarization -->
<div class="kdoc-guide-step" id="diarization">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['diar_title']) ?></h2>
<p><?= $t['diar_intro'] ?></p>
<p><strong><?= $t['diar_pipeline'] ?></strong></p>
<p><?= htmlspecialchars($t['diar_flow']) ?></p>
<ol class="kdoc-list">
<li><?= htmlspecialchars($t['diar_f1']) ?></li>
<li><?= htmlspecialchars($t['diar_f2']) ?></li>
<li><?= htmlspecialchars($t['diar_f3']) ?></li>
<li><?= htmlspecialchars($t['diar_f4']) ?></li>
</ol>
<p><?= $t['diar_count'] ?></p>
<p class="kdoc-guide-note"><?= htmlspecialchars($t['diar_limit']) ?></p>
</div>
<!-- Vocabulary -->
<div class="kdoc-guide-step" id="vocab">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['vocab_title']) ?></h2>
<p><?= $t['vocab_intro'] ?></p>
<p><?= htmlspecialchars($t['vocab_limit']) ?></p>
<p><?= htmlspecialchars($t['vocab_builtin']) ?></p>
<p class="kdoc-guide-note">&#9888;&#65039; <?= htmlspecialchars($t['vocab_note']) ?></p>
</div>
<!-- Cleanup -->
<div class="kdoc-guide-step" id="cleanup">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['cleanup_title']) ?></h2>
<p><?= htmlspecialchars($t['cleanup_intro']) ?></p>
<p><?= htmlspecialchars($t['cleanup_prompt']) ?></p>
<ul class="kdoc-list">
<li><?= $t['cleanup_mini'] ?></li>
<li><?= $t['cleanup_full'] ?></li>
</ul>
<p class="kdoc-guide-note">&#128274; <?= htmlspecialchars($t['cleanup_privacy']) ?></p>
</div>
<!-- Language support -->
<div class="kdoc-guide-step" id="languages">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['lang_title']) ?></h2>
<p><?= htmlspecialchars($t['lang_intro']) ?></p>
<table class="kdoc-table">
<thead><tr>
<th><?= htmlspecialchars($t['lang_table_lang']) ?></th>
<th><?= htmlspecialchars($t['lang_table_engine']) ?></th>
<th><?= htmlspecialchars($t['lang_table_notes']) ?></th>
</tr></thead>
<tbody>
<tr><td><?= htmlspecialchars($t['lang_nb']) ?></td><td><code><?= htmlspecialchars($t['lang_nb_engine']) ?></code></td><td><?= htmlspecialchars($t['lang_nb_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['lang_nn']) ?></td><td><code><?= htmlspecialchars($t['lang_nn_engine']) ?></code></td><td><?= htmlspecialchars($t['lang_nn_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['lang_en']) ?></td><td><code><?= htmlspecialchars($t['lang_en_engine']) ?></code></td><td><?= htmlspecialchars($t['lang_en_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['lang_pl']) ?></td><td><code><?= htmlspecialchars($t['lang_pl_engine']) ?></code></td><td><?= htmlspecialchars($t['lang_pl_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['lang_uk']) ?></td><td><code><?= htmlspecialchars($t['lang_uk_engine']) ?></code></td><td><?= htmlspecialchars($t['lang_uk_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['lang_sv']) ?></td><td><code><?= htmlspecialchars($t['lang_sv_engine']) ?></code></td><td><?= htmlspecialchars($t['lang_sv_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['lang_da']) ?></td><td><code><?= htmlspecialchars($t['lang_da_engine']) ?></code></td><td><?= htmlspecialchars($t['lang_da_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['lang_de']) ?></td><td><code><?= htmlspecialchars($t['lang_de_engine']) ?></code></td><td><?= htmlspecialchars($t['lang_de_notes']) ?></td></tr>
<tr><td><?= htmlspecialchars($t['lang_fr']) ?></td><td><code><?= htmlspecialchars($t['lang_fr_engine']) ?></code></td><td><?= htmlspecialchars($t['lang_fr_notes']) ?></td></tr>
</tbody>
</table>
</div>
<!-- Privacy -->
<div class="kdoc-guide-step" id="privacy">
<h2 class="kdoc-guide-step__title"><?= htmlspecialchars($t['priv_title']) ?></h2>
<ul class="kdoc-list">
<li>&#128274; <?= htmlspecialchars($t['priv_1']) ?></li>
<li>&#9729;&#65039; <?= htmlspecialchars($t['priv_2']) ?></li>
<li>&#127968; <?= htmlspecialchars($t['priv_3']) ?></li>
<li>&#129302; <?= htmlspecialchars($t['priv_4']) ?></li>
<li>&#9989; <?= htmlspecialchars($t['priv_5']) ?></li>
</ul>
</div>
</div><!-- /.kdoc-section -->
<?php require_once __DIR__ . '/includes/footer.php'; ?>
<script src="assets/js/tools.js" defer></script>
</body>
</html>
+8
View File
@@ -8,6 +8,14 @@ require_once __DIR__ . '/includes/layout.php';
?> ?>
<form id="toolForm" class="tool-form"> <form id="toolForm" class="tool-form">
<div class="korr-doc-links">
<a href="/transcribe-about.php" target="_blank">About this tool</a>
<span aria-hidden="true">&middot;</span>
<a href="/transcribe-guide.php" target="_blank">User guide</a>
<span aria-hidden="true">&middot;</span>
<a href="/transcribe-tech.php" target="_blank">How it works</a>
</div>
<div class="lang-switcher" id="uiLangSwitcher" role="group" aria-label="UI language"> <div class="lang-switcher" id="uiLangSwitcher" role="group" aria-label="UI language">
<button type="button" class="lang-btn is-active" data-lang="en">&#127468;&#127463; EN</button> <button type="button" class="lang-btn is-active" data-lang="en">&#127468;&#127463; EN</button>
<button type="button" class="lang-btn" data-lang="no">&#127475;&#127476; NO</button> <button type="button" class="lang-btn" data-lang="no">&#127475;&#127476; NO</button>
+3 -3
View File
@@ -30,13 +30,13 @@ return array (
'how_title' => 'Upload → configure → download. Under a minute.', 'how_title' => 'Upload → configure → download. Under a minute.',
'how_sub' => 'Three steps from raw sensitive document to a clean, submission-ready redacted version.', 'how_sub' => 'Three steps from raw sensitive document to a clean, submission-ready redacted version.',
's1_title' => 'Upload or paste the document', 's1_title' => 'Upload or paste the document',
's1_body' => 'Upload one file (PDF, DOCX, or TXT) or paste up to 128,000 characters of text. The raw content is never written to disk — all processing happens in memory.', 's1_body' => 'Upload one file (PDF, DOCX, or TXT) or paste up to 128,000 characters of text. The raw content is processed in memory. Your redacted result is not retained unless you choose to save it.',
's1_example' => 'Supports: case notes, court decisions, Barnevernet letters, NAV correspondence, medical records.', 's1_example' => 'Supports: case notes, court decisions, Barnevernet letters, NAV correspondence, medical records.',
's2_title' => 'Configure what to redact', 's2_title' => 'Configure what to redact',
's2_body' => 'Choose your engine, redaction mode (Standard or Strict), regional rule set (Nordic, European, ECHR, or Global), which entity types to redact, and whether to keep official names. Add exempt names or custom aliases if needed.', 's2_body' => 'Choose your engine, redaction mode (Standard or Strict), regional rule set (Nordic, European, ECHR, or Global), which entity types to redact, and whether to keep official names. Add exempt names or custom aliases if needed.',
's2_example' => 'E.g. keep the judge\'s name but redact all parties. Or replace "Ola Nordmann" with [FATHER] throughout.', 's2_example' => 'E.g. keep the judge\'s name but redact all parties. Or replace "Ola Nordmann" with [FATHER] throughout.',
's3_title' => 'Review and download', 's3_title' => 'Review and download',
's3_body' => 'The redacted text appears with all protected content replaced. Download as .docx, save to My Docs, or copy the text directly. Review the redaction log for a summary of what was replaced.', 's3_body' => 'The redacted text appears with all protected content replaced. Save to Min Sak for use in other tools, save to your corpus, download as .docx, or copy the text directly. Review the redaction log for a summary of what was replaced.',
's3_example' => 'Download as Word → Save to My Docs → Copy text', 's3_example' => 'Download as Word → Save to My Docs → Copy text',
'ss_eyebrow' => 'Screenshots', 'ss_eyebrow' => 'Screenshots',
'ss_title' => 'See it in action.', 'ss_title' => 'See it in action.',
@@ -100,7 +100,7 @@ return array (
'how_title' => 'Last opp → konfigurer → last ned. Under ett minutt.', 'how_title' => 'Last opp → konfigurer → last ned. Under ett minutt.',
'how_sub' => 'Tre steg fra et sensitivt råmateriale til en ren, klargjo̊rt sladdversjon.', 'how_sub' => 'Tre steg fra et sensitivt råmateriale til en ren, klargjo̊rt sladdversjon.',
's1_title' => 'Last opp eller lim inn dokumentet', 's1_title' => 'Last opp eller lim inn dokumentet',
's1_body' => 'Last opp én fil (PDF, DOCX eller TXT) eller lim inn opptil 128 000 tegn med tekst. Råinnholdet skrives aldri til disk — all behandling skjer i minnet.', 's1_body' => 'Last opp én fil (PDF, DOCX eller TXT) eller lim inn opptil 128 000 tegn med tekst. Råinnholdet behandles i minnet. Det sladdede resultatet beholdes ikke med mindre du velger å lagre det.',
's1_example' => 'Støtter: saksnotater, rettsavgjørelser, Barnevernet-brev, NAV-korrespondanse, medisinske journaler.', 's1_example' => 'Støtter: saksnotater, rettsavgjørelser, Barnevernet-brev, NAV-korrespondanse, medisinske journaler.',
's2_title' => 'Konfigurer hva som skal sladdes', 's2_title' => 'Konfigurer hva som skal sladdes',
's2_body' => 'Velg motor, sladdmodus (Standard eller Streng), regionalt regelsett (Nordisk, Europeisk, EMD eller Global), hvilke enhetstyper som skal sladdes, og om offisielle navn skal beholdes.', 's2_body' => 'Velg motor, sladdmodus (Standard eller Streng), regionalt regelsett (Nordisk, Europeisk, EMD eller Global), hvilke enhetstyper som skal sladdes, og om offisielle navn skal beholdes.',
+12 -10
View File
@@ -72,12 +72,13 @@ return array (
'step9_title' => 'Upload or paste', 'step9_title' => 'Upload or paste',
'step9_p1_html' => 'Drag a file onto the upload zone or click <strong>browse</strong>. Supported formats: <strong>PDF</strong>, <strong>DOCX</strong>, <strong>TXT</strong>. One file per run.', 'step9_p1_html' => 'Drag a file onto the upload zone or click <strong>browse</strong>. Supported formats: <strong>PDF</strong>, <strong>DOCX</strong>, <strong>TXT</strong>. One file per run.',
'step9_p2_html' => 'You can also paste text directly into the main text area — or combine a file and pasted text. All sources are processed together as a single input.', 'step9_p2_html' => 'You can also paste text directly into the main text area — or combine a file and pasted text. All sources are processed together as a single input.',
'step9_p3' => 'Files are extracted to text in memory. Nothing is written to disk or retained after the session ends.', 'step9_p3' => 'Files are extracted to text in memory. The redacted result is not retained on the server unless you choose to save it to Min Sak, your corpus, or download it.',
'step10_title' => 'Reading the output & downloading', 'step10_title' => 'Reading the output and saving',
'step10_intro' => 'After the tool runs, the redacted text appears in the results section. What you can do from here:', 'step10_intro' => 'After the tool runs, the redacted text appears in the results section. What you can do from here:',
'dl1_html' => '<strong>Export to Word</strong> — downloads a formatted .docx with the full redacted text, ready to attach to a submission.', 'dl1_html' => '<strong>Save to Min Sak</strong> — saves the redacted document to your current case file, making it available to other tools (Timeline, Korrespond, etc.).',
'dl2_html' => '<strong>Save to My Docs</strong> — saves the redacted version to your My Docs library for later retrieval and use in other tools.', 'dl2_html' => '<strong>Save to corpus</strong> — saves the redacted version to your searchable corpus for reuse across sessions.',
'dl3_html' => '<strong>Copy text</strong> — copies the plain redacted text to the clipboard for pasting into another document.', 'dl3_html' => '<strong>Export to Word</strong> — downloads a formatted .docx with the full redacted text, ready to attach to a submission.',
'dl4_html' => '<strong>Copy text</strong> — copies the plain redacted text to the clipboard for pasting into another document.',
'cta_title' => 'Ready to try it on your documents?', 'cta_title' => 'Ready to try it on your documents?',
'cta_sub' => 'Free for Do Better Norge members.', 'cta_sub' => 'Free for Do Better Norge members.',
'btn_open' => 'Open Redact →', 'btn_open' => 'Open Redact →',
@@ -157,12 +158,13 @@ return array (
'step9_title' => 'Last opp eller lim inn', 'step9_title' => 'Last opp eller lim inn',
'step9_p1_html' => 'Dra en fil til opplastingssonen eller klikk <strong>bla gjennom</strong>. Støttede formater: <strong>PDF</strong>, <strong>DOCX</strong>, <strong>TXT</strong>. Én fil per kjøring.', 'step9_p1_html' => 'Dra en fil til opplastingssonen eller klikk <strong>bla gjennom</strong>. Støttede formater: <strong>PDF</strong>, <strong>DOCX</strong>, <strong>TXT</strong>. Én fil per kjøring.',
'step9_p2_html' => 'Du kan også lime inn tekst direkte i tekstfeltet — eller kombinere en fil og limt inn tekst. Alle kilder behandles sammen som én inngang.', 'step9_p2_html' => 'Du kan også lime inn tekst direkte i tekstfeltet — eller kombinere en fil og limt inn tekst. Alle kilder behandles sammen som én inngang.',
'step9_p3' => 'Filer ekstraheres til tekst i minnet. Ingenting skrives til disk eller beholdes etter at sesjonen avsluttes.', 'step9_p3' => 'Filer ekstraheres til tekst i minnet. Det sladdede resultatet beholdes ikke på serveren med mindre du velger å lagre det i Min Sak, i korpuset ditt, eller laster det ned.',
'step10_title' => 'Les utdata og last ned', 'step10_title' => 'Les utdata og lagre',
'step10_intro' => 'Etter at verktøyet kjøres, vises den sladdede teksten i resultatdelen. Det du kan gjøre herfra:', 'step10_intro' => 'Etter at verktøyet kjøres, vises den sladdede teksten i resultatdelen. Det du kan gjøre herfra:',
'dl1_html' => '<strong>Eksporter til Word</strong> — laster ned en formatert .docx med full sladddet tekst, klar til å legges ved en innsending.', 'dl1_html' => '<strong>Lagre i Min Sak</strong> — lagrer det sladdede dokumentet i din nåværende saksfil, slik at det er tilgjengelig for andre verktøy (Tidslinje, Korrespondanse osv.).',
'dl2_html' => '<strong>Lagre i Mine Dok</strong> — lagrer den sladdede versjonen i Mine Dok-biblioteket ditt for senere henting.', 'dl2_html' => '<strong>Lagre i korpus</strong> — lagrer den sladdede versjonen i ditt søkbare korpus for gjenbruk på tvers av sesjoner.',
'dl3_html' => '<strong>Kopier tekst</strong> — kopierer den rene sladdede teksten til utklippstavlen.', 'dl3_html' => '<strong>Eksporter til Word</strong> — laster ned en formatert .docx med den fullstendige sladdede teksten, klar til å legge ved i en innlevering.',
'dl4_html' => '<strong>Kopier tekst</strong> — kopierer den rene sladdede teksten til utklippstavlen.',
'cta_title' => 'Klar til å prøve det på dokumentene dine?', 'cta_title' => 'Klar til å prøve det på dokumentene dine?',
'cta_sub' => 'Gratis for Do Better Norge-medlemmer.', 'cta_sub' => 'Gratis for Do Better Norge-medlemmer.',
'btn_open' => 'Åpne Sladding →', 'btn_open' => 'Åpne Sladding →',
+6 -6
View File
@@ -84,10 +84,10 @@ return array (
'eng1_best' => 'Default. Most documents, single subject, clear formatting.', 'eng1_best' => 'Default. Most documents, single subject, clear formatting.',
'eng2_best' => 'Complex documents with many named parties, overlapping roles, or degraded source text.', 'eng2_best' => 'Complex documents with many named parties, overlapping roles, or degraded source text.',
'priv_eyebrow' => 'Privacy & security', 'priv_eyebrow' => 'Privacy & security',
'priv_title' => 'Your documents never leave your session.', 'priv_title' => 'Processed in memory. Saved only when you say so.',
'priv_badge' => 'Privacy by design', 'priv_badge' => 'Privacy by design',
'priv_1_html' => 'All uploaded files are extracted to text <strong>in memory</strong> using PHP\'s in-process file handlers. The raw binary is never written to disk on the server.', 'priv_1_html' => 'All uploaded files are extracted to text <strong>in memory</strong> using PHP\'s in-process file handlers. The raw binary is not written to disk on the server.',
'priv_2' => 'Session context (pasted text, uploaded content, redacted output) is scoped to your authenticated session and discarded when the session ends.', 'priv_2' => 'The redacted output is not retained unless you choose to save it. You can save to Min Sak (for use in other tools), to your corpus (for searchable reuse), download as .docx, or copy to clipboard.',
'priv_3_html' => 'Azure OpenAI (<code>gpt-4o</code>, <code>gpt-4o-mini</code>) is configured on the <strong>West Europe</strong> region. Data processed via Azure OpenAI is not used for model training under the default enterprise agreement.', 'priv_3_html' => 'Azure OpenAI (<code>gpt-4o</code>, <code>gpt-4o-mini</code>) is configured on the <strong>West Europe</strong> region. Data processed via Azure OpenAI is not used for model training under the default enterprise agreement.',
'priv_4_html' => 'Azure OpenAI is called only for the LLM sweep pass. No document content is retained by Azure after the response is returned, per the enterprise data-handling agreement.', 'priv_4_html' => 'Azure OpenAI is called only for the LLM sweep pass. No document content is retained by Azure after the response is returned, per the enterprise data-handling agreement.',
'priv_5_html' => 'Telemetry logged: tool name, engine, mode, region, latency. <strong>No document text, entity names, or redacted content is logged.</strong>', 'priv_5_html' => 'Telemetry logged: tool name, engine, mode, region, latency. <strong>No document text, entity names, or redacted content is logged.</strong>',
@@ -182,10 +182,10 @@ return array (
'eng1_best' => 'Standard. De fleste dokumenter, enkelt emne, klar formatering.', 'eng1_best' => 'Standard. De fleste dokumenter, enkelt emne, klar formatering.',
'eng2_best' => 'Komplekse dokumenter med mange navngitte parter, overlappende roller eller forringet kildetekst.', 'eng2_best' => 'Komplekse dokumenter med mange navngitte parter, overlappende roller eller forringet kildetekst.',
'priv_eyebrow' => 'Personvern & sikkerhet', 'priv_eyebrow' => 'Personvern & sikkerhet',
'priv_title' => 'Dine dokumenter forlater aldri sesjonen din.', 'priv_title' => 'Behandles i minnet. Lagres bare når du sier det.',
'priv_badge' => 'Personvern ved design', 'priv_badge' => 'Personvern ved design',
'priv_1_html' => 'Alle opplastede filer blir ekstraktert til tekst <strong>i minnet</strong> ved hjelp av PHPs in-process filbehandlere. Den rå binære data skrives aldri til disk på serveren.', 'priv_1_html' => 'Alle opplastede filer blir ekstraktert til tekst <strong>i minnet</strong> ved hjelp av PHPs in-process filbehandlere. Den rå binærfilen skrives ikke til disk på serveren.',
'priv_2' => 'Sesjonskonteksten (limt inn tekst, opplastet innhold, sladdet utdata) er avgrenset til din autentiserte sesjon og kastes når sesjonen avsluttes.', 'priv_2' => 'Det sladdede resultatet beholdes ikke med mindre du velger å lagre det. Du kan lagre i Min Sak (for bruk i andre verktøy), i korpuset ditt (for søkbar gjenbruk), laste ned som .docx, eller kopiere til utklippstavlen.',
'priv_3_html' => 'Azure OpenAI (<code>gpt-4o</code>, <code>gpt-4o-mini</code>) er konfigurert på <strong>Vest-Europa</strong> regionen. Data behandlet via Azure OpenAI brukes ikke til modelltrening under den standard bedriftsavtalen.', 'priv_3_html' => 'Azure OpenAI (<code>gpt-4o</code>, <code>gpt-4o-mini</code>) er konfigurert på <strong>Vest-Europa</strong> regionen. Data behandlet via Azure OpenAI brukes ikke til modelltrening under den standard bedriftsavtalen.',
'priv_4_html' => 'Azure OpenAI kalles kun under LLM-søkpasset. Ingen dokumentinnhold beholdes av Azure etter at svaret er returnert, i henhold til bedriftsavtalen for datahåndtering.', 'priv_4_html' => 'Azure OpenAI kalles kun under LLM-søkpasset. Ingen dokumentinnhold beholdes av Azure etter at svaret er returnert, i henhold til bedriftsavtalen for datahåndtering.',
'priv_5_html' => 'Telemetri logget: verktøynavn, motor, modus, region, forsinkelse. <strong>Ingen dokumenttekst, enhetsnavn eller sladdede innhold logges.</strong>', 'priv_5_html' => 'Telemetri logget: verktøynavn, motor, modus, region, forsinkelse. <strong>Ingen dokumenttekst, enhetsnavn eller sladdede innhold logges.</strong>',
+251
View File
@@ -0,0 +1,251 @@
<?php
return array (
'en' =>
array (
'nav_about' => 'About',
'nav_guide' => 'User guide',
'nav_howit' => 'How it works',
'nav_opentool' => '← Open the tool',
'nav_signin' => 'Sign in',
'nav_open' => 'Open Transcribe →',
'hero_kicker' => 'Audio Transcription · Speaker ID · Legal Meetings',
'hero_title' => 'Every word. Every speaker. Instantly transcribed.',
'hero_sub' => 'Transcribe converts recordings of hearings, mediations, and CPS meetings into timestamped, speaker-labelled text. Three engines work in cascade to ensure the best available result — whatever the audio quality.',
'stat_engines' => 'AI engines',
'stat_languages' => 'languages',
'stat_speakers' => 'max speakers',
'stat_formats' => 'audio formats',
'btn_try' => 'Try Transcribe free →',
'btn_guide' => 'User guide',
'btn_howit' => 'How it works',
'what_eyebrow' => 'What you get',
'what_title' => 'Three things that change how you document a hearing.',
'f1_title' => 'Three-engine cascade',
'f1_body_html' => 'Azure Batch Speech takes the first pass, optimised for Norwegian. If unavailable, Google Cloud Speech-to-Text v2 steps in. Whisper <code>large-v3</code> on a dedicated GPU runs as the final fallback — ensuring a transcript even when cloud services are unreachable.',
'f2_title' => 'Speaker identification',
'f2_body' => 'Name up to 20 speakers and let pyannote.audio assign each line to the right voice. Works on recordings where multiple parties speak — hearings, mediation sessions, phone calls. Set an exact count or let the system detect automatically.',
'f3_title' => 'Vocabulary presets for Norwegian law',
'f3_body' => 'Prime the transcription engine with domain-specific terms before it starts. Built-in presets for child welfare (barnevern), mediation, and general Norwegian legal vocabulary. Add custom terms for unique names, case numbers, or specialist language.',
'how_eyebrow' => 'How it works',
'how_title' => 'Upload → Configure → Transcribe. Under two minutes.',
'how_sub' => 'Three steps from raw recording to a clean, speaker-labelled transcript.',
's1_title' => 'Upload your audio',
's1_body' => 'Drop one or more audio files into the upload zone — MP3, WAV, OGG, M4A, FLAC, or WEBM — up to 200 MB each. A multi-file queue lets you batch several recordings in one run.',
's1_example' => 'Supports: hearings, phone calls, mediation sessions, CPS interviews, court recordings.',
's2_title' => 'Set language, speakers, and vocabulary',
's2_body' => 'Choose the audio language (Norwegian, English, Polish, Ukrainian, and five others). Enable speaker identification and set the expected number of participants. Pick a vocabulary preset to sharpen recognition of legal terms and proper nouns.',
's2_example' => 'e.g. Norwegian · 3 speakers · Child welfare preset — ready in one click.',
's3_title' => 'Get your transcript',
's3_body' => 'The timestamped transcript appears with each line attributed to a speaker. Download as text, save to Min Sak for use in other tools, or copy directly. An optional AI cleanup pass corrects ASR errors and improves punctuation.',
's3_example' => 'Save to Min Sak · Download · Copy text',
'output_eyebrow' => 'Output formats',
'output_title' => 'Three ways to receive your transcript.',
'output_badge' => 'Choose your format',
'output_h1' => 'Timestamped · Speaker-labelled · Translated',
'output_body_html' => 'The default output is a <strong>timestamped transcript</strong> with each line attributed to a speaker: <em>[00:01:24] SPEAKER 1: Jeg ønsker å redegjøre for…</em>. Switch the task to <strong>Translate</strong> to receive an English version of a Norwegian, Polish, or Ukrainian recording — useful for cross-border cases or sharing with non-Norwegian speakers. An optional <strong>AI cleanup</strong> pass with GPT-4o mini or GPT-4o then corrects ASR errors, normalises punctuation, and fixes domain terminology.',
'output_s1' => 'timestamped',
'output_s2' => 'speaker-labelled',
'output_s3' => 'translated to English',
'output_s4' => 'output formats',
'save_eyebrow' => 'Saving your work',
'save_title' => 'Transcripts go where you need them.',
'save_sub' => 'Audio is processed in memory and not stored. Your transcript is yours to keep — save it, share it, or build on it.',
'sv1_title' => 'Save to Min Sak',
'sv1_body' => 'Save the transcript directly to your Min Sak case file. From there it becomes available to other tools — use it as source material for Timeline, Redact, or Korrespond.',
'sv2_title' => 'Add to your corpus',
'sv2_body' => 'Save to your personal corpus to make the transcript searchable and reusable across sessions. Useful when a case spans multiple hearings.',
'sv3_title' => 'Download or copy',
'sv3_body' => 'Download the transcript as a plain text file or copy it to the clipboard. Nothing is retained on the server unless you choose to save it.',
'cta_title' => 'Ready to transcribe your first recording?',
'cta_sub' => 'Free for Do Better Norge members. No credit card required.',
'btn_open' => 'Open Transcribe →',
'btn_signin_cta' => 'Sign in to use Transcribe →',
'btn_register' => 'Register free',
),
'no' =>
array (
'nav_about' => 'Om',
'nav_guide' => 'Brukerveiledning',
'nav_howit' => 'Slik fungerer det',
'nav_opentool' => '← Åpne verktøyet',
'nav_signin' => 'Logg inn',
'nav_open' => 'Åpne Transkripsjon →',
'hero_kicker' => 'Lydtranskripsjon · Taler-ID · Juridiske møter',
'hero_title' => 'Hvert ord. Hver taler. Transkribert umiddelbart.',
'hero_sub' => 'Transkripsjon konverterer opptak av høringer, meklingssaker og barnevernsmøter til tidsstemplet, taler-merket tekst. Tre motorer jobber i kaskade for å sikre best mulig resultat — uansett lydkvalitet.',
'stat_engines' => 'AI-motorer',
'stat_languages' => 'språk',
'stat_speakers' => 'maks talere',
'stat_formats' => 'lydformater',
'btn_try' => 'Prøv Transkripsjon gratis →',
'btn_guide' => 'Brukerveiledning',
'btn_howit' => 'Slik fungerer det',
'what_eyebrow' => 'Hva du får',
'what_title' => 'Tre ting som endrer hvordan du dokumenterer et møte.',
'f1_title' => 'Tre-motors kaskade',
'f1_body_html' => 'Azure Batch Speech tar første pass, optimalisert for norsk. Hvis utilgjengelig, tar Google Cloud Speech-to-Text v2 over. Whisper <code>large-v3</code> på en dedikert GPU fungerer som siste reserveløsning — og sikrer transkripsjon selv når skytjenester er utilgjengelige.',
'f2_title' => 'Taler-identifisering',
'f2_body' => 'Navngi opptil 20 talere og la pyannote.audio tilordne hver linje til riktig stemme. Fungerer på opptak der flere parter snakker — høringer, mekling, telefonsamtaler. Angi eksakt antall eller la systemet oppdage automatisk.',
'f3_title' => 'Ordforrådsforhåndsinnstillinger for norsk jus',
'f3_body' => 'Gi transkripsjonsmotoren domene-spesifikke termer før den starter. Innebygde forhåndsinnstillinger for barnevern, mekling og generelt norsk juridisk ordforråd. Legg til egendefinerte termer for unike navn, saksnumre eller fagspråk.',
'how_eyebrow' => 'Slik fungerer det',
'how_title' => 'Last opp → Konfigurer → Transkribler. Under to minutter.',
'how_sub' => 'Tre steg fra råopptak til en ren, taler-merket transkripsjon.',
's1_title' => 'Last opp lyden',
's1_body' => 'Slipp én eller flere lydfiler i opplastningssonen — MP3, WAV, OGG, M4A, FLAC eller WEBM — opptil 200 MB hver. En multifil-kø lar deg sette i batch flere opptak i én kjøring.',
's1_example' => 'Støtter: høringer, telefonsamtaler, meklingssaker, barnevernintervjuer, rettsopptak.',
's2_title' => 'Angi språk, talere og ordforråd',
's2_body' => 'Velg lydspråk (norsk, engelsk, polsk, ukrainsk og fem andre). Aktiver taler-identifisering og angi forventet antall deltakere. Velg en ordforrådsforhåndsinnstilling for å skjerpe gjenkjenning av juridiske termer og egennavn.',
's2_example' => 'F.eks. norsk · 3 talere · Barnevern-forhåndsinnstilling — klar med ett klikk.',
's3_title' => 'Få transkripsjonen',
's3_body' => 'Den tidsstemplede transkripsjonen vises med hver linje tilskrevet en taler. Last ned som tekst, lagre i Min Sak for bruk i andre verktøy, eller kopier direkte. Et valgfritt AI-oppryddingspass korrigerer ASR-feil og forbedrer tegnsetting.',
's3_example' => 'Lagre i Min Sak · Last ned · Kopier tekst',
'output_eyebrow' => 'Utdataformater',
'output_title' => 'Tre måter å motta transkripsjonen på.',
'output_badge' => 'Velg format',
'output_h1' => 'Tidsstemplet · Taler-merket · Oversatt',
'output_body_html' => 'Standard utdata er en <strong>tidsstemplet transkripsjon</strong> med hver linje tilskrevet en taler: <em>[00:01:24] TALER 1: Jeg ønsker å redegjøre for…</em>. Bytt oppgaven til <strong>Oversett</strong> for å motta en engelsk versjon av et norsk, polsk eller ukrainsk opptak — nyttig for grenseoverskridende saker eller ved deling med ikke-norsktalende. Et valgfritt <strong>AI-oppryddingspass</strong> med GPT-4o mini eller GPT-4o korrigerer deretter ASR-feil, normaliserer tegnsetting og fikser domeneterminologi.',
'output_s1' => 'tidsstemplet',
'output_s2' => 'taler-merket',
'output_s3' => 'oversatt til engelsk',
'output_s4' => 'utdataformater',
'save_eyebrow' => 'Lagre arbeidet ditt',
'save_title' => 'Transkripsjoner havner der du trenger dem.',
'save_sub' => 'Lyd behandles i minnet og lagres ikke. Transkripsjonen din er din å beholde — lagre den, del den, eller bygg videre på den.',
'sv1_title' => 'Lagre i Min Sak',
'sv1_body' => 'Lagre transkripsjonen direkte i din Min Sak-saksfil. Derfra blir den tilgjengelig for andre verktøy — bruk den som kildemateriale for Tidslinje, Sladding eller Korrespondanse.',
'sv2_title' => 'Legg til i korpuset ditt',
'sv2_body' => 'Lagre i ditt personlige korpus for å gjøre transkripsjonen søkbar og gjenbrukbar på tvers av sesjoner. Nyttig når en sak strekker seg over flere høringer.',
'sv3_title' => 'Last ned eller kopier',
'sv3_body' => 'Last ned transkripsjonen som en ren tekstfil eller kopier til utklippstavlen. Ingenting beholdes på serveren med mindre du velger å lagre det.',
'cta_title' => 'Klar til å transkribere ditt første opptak?',
'cta_sub' => 'Gratis for Do Better Norge-medlemmer. Ingen betalingskort kreves.',
'btn_open' => 'Åpne Transkripsjon →',
'btn_signin_cta' => 'Logg inn for å bruke Transkripsjon →',
'btn_register' => 'Registrer gratis',
),
'uk' =>
array (
'nav_about' => 'Про інструмент',
'nav_guide' => 'Посібник користувача',
'nav_howit' => 'Як це працює',
'nav_opentool' => '← Відкрити інструмент',
'nav_signin' => 'Увійти',
'nav_open' => 'Відкрити Транскрипцію →',
'hero_kicker' => 'Транскрипція аудіо · Ідентифікація мовців · Юридичні наради',
'hero_title' => 'Кожне слово. Кожен мовець. Миттєво транскрибовано.',
'hero_sub' => 'Транскрипція перетворює записи слухань, медіацій та нарад із захисту дітей на текст із мітками часу та позначенням мовців. Три системи працюють каскадом для забезпечення найкращого результату — незалежно від якості аудіо.',
'stat_engines' => 'AI-систем',
'stat_languages' => 'мов',
'stat_speakers' => 'макс. мовців',
'stat_formats' => 'аудіоформати',
'btn_try' => 'Спробувати Транскрипцію безкоштовно →',
'btn_guide' => 'Посібник користувача',
'btn_howit' => 'Як це працює',
'what_eyebrow' => 'Що ви отримуєте',
'what_title' => 'Три речі, які змінять спосіб документування слухань.',
'f1_title' => 'Каскад трьох систем',
'f1_body_html' => 'Azure Batch Speech виконує перший прохід, оптимізований для норвезької мови. Якщо недоступний, підключається Google Cloud Speech-to-Text v2. Whisper <code>large-v3</code> на виділеному GPU працює як кінцевий резерв — забезпечуючи транскрипцію навіть коли хмарні сервіси недоступні.',
'f2_title' => 'Ідентифікація мовців',
'f2_body' => 'Визначте до 20 мовців і дозвольте pyannote.audio призначити кожен рядок правильному голосу. Працює з записами, де говорять кілька сторін — слухання, медіаційні сесії, телефонні дзвінки. Вкажіть точну кількість або дозвольте системі визначити автоматично.',
'f3_title' => 'Словникові пресети для норвезького права',
'f3_body' => 'Підготуйте систему транскрипції з предметно-специфічними термінами перед початком. Вбудовані пресети для служби захисту дітей (barnevern), медіації та загальної норвезької юридичної лексики. Додайте власні терміни для унікальних імен, номерів справ або спеціалізованої мови.',
'how_eyebrow' => 'Як це працює',
'how_title' => 'Завантажте → Налаштуйте → Транскрибуйте. Менше двох хвилин.',
'how_sub' => 'Три кроки від сирого запису до чистої транскрипції з позначенням мовців.',
's1_title' => 'Завантажте аудіо',
's1_body' => 'Перетягніть один або кілька аудіофайлів у зону завантаження — MP3, WAV, OGG, M4A, FLAC або WEBM — до 200 МБ кожен. Черга файлів дозволяє обробити кілька записів за один раз.',
's1_example' => 'Підтримує: слухання, телефонні дзвінки, медіаційні сесії, інтерв'ю зі службою захисту дітей, судові записи.',
's2_title' => 'Встановіть мову, мовців та словник',
's2_body' => 'Оберіть мову аудіо (норвезька, англійська, польська, українська та ще п'ять). Увімкніть ідентифікацію мовців та вкажіть очікувану кількість учасників. Оберіть словниковий пресет для точнішого розпізнавання юридичних термінів та власних назв.',
's2_example' => 'Напр. норвезька · 3 мовці · Пресет захисту дітей — готово одним кліком.',
's3_title' => 'Отримайте транскрипцію',
's3_body' => 'Транскрипція з мітками часу з'являється з кожним рядком, приписаним мовцю. Завантажте як текст, збережіть до Min Sak для використання в інших інструментах або скопіюйте безпосередньо. Необов'язковий прохід очищення AI виправляє помилки та покращує пунктуацію.',
's3_example' => 'Зберегти до Min Sak · Завантажити · Скопіювати текст',
'output_eyebrow' => 'Формати виводу',
'output_title' => 'Три способи отримати транскрипцію.',
'output_badge' => 'Оберіть формат',
'output_h1' => 'З мітками часу · З позначенням мовців · Перекладено',
'output_body_html' => 'Стандартний вивід — це <strong>транскрипція з мітками часу</strong> з кожним рядком, приписаним мовцю: <em>[00:01:24] МОВЕЦЬ 1: Jeg ønsker å redegjøre for…</em>. Перемкніть завдання на <strong>Переклад</strong>, щоб отримати англійську версію норвезького, польського або українського запису — корисно для транскордонних справ або обміну з не норвежськомовними особами. Необов'язковий <strong>прохід очищення AI</strong> з GPT-4o mini або GPT-4o виправляє помилки ASR, нормалізує пунктуацію та виправляє термінологію.',
'output_s1' => 'з мітками часу',
'output_s2' => 'з позначенням мовців',
'output_s3' => 'перекладено на англійську',
'output_s4' => 'формати виводу',
'save_eyebrow' => 'Збереження вашої роботи',
'save_title' => 'Транскрипції потрапляють туди, де вони потрібні.',
'save_sub' => 'Аудіо обробляється в пам'яті і не зберігається. Ваша транскрипція належить вам — збережіть її, поділіться або продовжте роботу з нею.',
'sv1_title' => 'Зберегти до Min Sak',
'sv1_body' => 'Збережіть транскрипцію безпосередньо до вашої справи Min Sak. Звідти вона стає доступною для інших інструментів — використовуйте як вихідний матеріал для Хронологія, Редагування або Кореспонденції.',
'sv2_title' => 'Додати до корпусу',
'sv2_body' => 'Зберегти в особистий корпус, щоб зробити транскрипцію доступною для пошуку та повторного використання між сесіями. Корисно, коли справа охоплює кілька слухань.',
'sv3_title' => 'Завантажити або скопіювати',
'sv3_body' => 'Завантажте транскрипцію як текстовий файл або скопіюйте в буфер обміну. На сервері нічого не зберігається, якщо ви не вирішите зберегти.',
'cta_title' => 'Готові транскрибувати перший запис?',
'cta_sub' => 'Безкоштовно для членів Do Better Norge. Кредитна картка не потрібна.',
'btn_open' => 'Відкрити Транскрипцію →',
'btn_signin_cta' => 'Увійдіть, щоб використовувати Транскрипцію →',
'btn_register' => 'Зареєструватись безкоштовно',
),
'pl' =>
array (
'nav_about' => 'O narzędziu',
'nav_guide' => 'Przewodnik użytkownika',
'nav_howit' => 'Jak to działa',
'nav_opentool' => '← Otwórz narzędzie',
'nav_signin' => 'Zaloguj się',
'nav_open' => 'Otwórz Transkrypcję →',
'hero_kicker' => 'Transkrypcja audio · Identyfikacja mówców · Spotkania prawne',
'hero_title' => 'Każde słowo. Każdy mówca. Natychmiastowa transkrypcja.',
'hero_sub' => 'Transkrypcja zamienia nagrania przesłuchań, mediacji i spotkań służb ochrony dzieci na tekst ze znacznikami czasu i oznaczeniem mówców. Trzy systemy pracują kaskadowo, aby zapewnić najlepszy możliwy wynik — niezależnie od jakości nagrania.',
'stat_engines' => 'silniki AI',
'stat_languages' => 'języki',
'stat_speakers' => 'maks. mówców',
'stat_formats' => 'formaty audio',
'btn_try' => 'Wypróbuj Transkrypcję za darmo →',
'btn_guide' => 'Przewodnik użytkownika',
'btn_howit' => 'Jak to działa',
'what_eyebrow' => 'Co otrzymujesz',
'what_title' => 'Trzy rzeczy, które zmienią sposób dokumentowania przesłuchań.',
'f1_title' => 'Kaskada trzech silników',
'f1_body_html' => 'Azure Batch Speech wykonuje pierwsze przejście, zoptymalizowane dla języka norweskiego. Jeśli niedostępny, wkracza Google Cloud Speech-to-Text v2. Whisper <code>large-v3</code> na dedykowanym GPU działa jako ostatnia rezerwa — zapewniając transkrypcję nawet gdy usługi chmurowe są niedostępne.',
'f2_title' => 'Identyfikacja mówców',
'f2_body' => 'Zdefiniuj do 20 mówców i pozwól pyannote.audio przypisać każdą linię do właściwego głosu. Działa na nagraniach z wieloma uczestnikami — przesłuchania, sesje mediacyjne, rozmowy telefoniczne. Ustaw dokładną liczbę lub pozwól systemowi wykryć automatycznie.',
'f3_title' => 'Predefiniowane słowniki dla norweskiego prawa',
'f3_body' => 'Przygotuj silnik transkrypcji ze specjalistycznymi terminami przed rozpoczęciem. Wbudowane predefiniowane ustawienia dla opieki nad dziećmi (barnevern), mediacji i ogólnego norweskiego słownictwa prawnego. Dodaj własne terminy dla unikalnych nazw, numerów spraw lub języka specjalistycznego.',
'how_eyebrow' => 'Jak to działa',
'how_title' => 'Prześlij → Skonfiguruj → Transkrybuj. Poniżej dwóch minut.',
'how_sub' => 'Trzy kroki od surowego nagrania do czystej transkrypcji z oznaczeniem mówców.',
's1_title' => 'Prześlij swoje nagranie',
's1_body' => 'Upuść jeden lub więcej plików audio do strefy przesyłania — MP3, WAV, OGG, M4A, FLAC lub WEBM — do 200 MB każdy. Kolejka plików pozwala przetwarzać kilka nagrań jednocześnie.',
's1_example' => 'Obsługuje: przesłuchania, rozmowy telefoniczne, sesje mediacyjne, wywiady ze służbą ochrony dzieci, nagrania sądowe.',
's2_title' => 'Ustaw język, mówców i słownik',
's2_body' => 'Wybierz język nagrania (norweski, angielski, polski, ukraiński i pięć innych). Włącz identyfikację mówców i ustaw oczekiwaną liczbę uczestników. Wybierz predefiniowany słownik, aby poprawić rozpoznawanie terminów prawnych i nazw własnych.',
's2_example' => 'np. norweski · 3 mówców · Słownik ochrony dzieci — gotowe jednym kliknięciem.',
's3_title' => 'Otrzymaj transkrypcję',
's3_body' => 'Transkrypcja ze znacznikami czasu pojawia się z każdą linią przypisaną do mówcy. Pobierz jako plik tekstowy, zapisz do Min Sak do użycia w innych narzędziach lub skopiuj bezpośrednio. Opcjonalne przejście czyszczenia AI poprawia błędy ASR i poprawia interpunkcję.',
's3_example' => 'Zapisz do Min Sak · Pobierz · Skopiuj tekst',
'output_eyebrow' => 'Formaty wyjściowe',
'output_title' => 'Trzy sposoby otrzymania transkrypcji.',
'output_badge' => 'Wybierz format',
'output_h1' => 'Ze znacznikami czasu · Z oznaczeniem mówców · Przetłumaczone',
'output_body_html' => 'Domyślne wyjście to <strong>transkrypcja ze znacznikami czasu</strong> z każdą linią przypisaną do mówcy: <em>[00:01:24] MÓWCA 1: Jeg ønsker å redegjøre for…</em>. Przełącz zadanie na <strong>Tłumaczenie</strong>, aby otrzymać angielską wersję norweskiego, polskiego lub ukraińskiego nagrania — przydatne w sprawach transgranicznych lub przy udostępnianiu osobom nie mówiącym po norwesku. Opcjonalne <strong>przejście czyszczenia AI</strong> z GPT-4o mini lub GPT-4o poprawia błędy ASR, normalizuje interpunkcję i poprawia terminologię.',
'output_s1' => 'ze znacznikami czasu',
'output_s2' => 'z oznaczeniem mówców',
'output_s3' => 'przetłumaczone na angielski',
'output_s4' => 'formaty wyjściowe',
'save_eyebrow' => 'Zapisywanie pracy',
'save_title' => 'Transkrypcje trafiają tam, gdzie są potrzebne.',
'save_sub' => 'Audio jest przetwarzane w pamięci i nie jest przechowywane. Twoja transkrypcja należy do Ciebie — zapisz ją, udostępnij lub kontynuuj pracę z nią.',
'sv1_title' => 'Zapisz do Min Sak',
'sv1_body' => 'Zapisz transkrypcję bezpośrednio do swojej teczki sprawy Min Sak. Stamtąd staje się dostępna dla innych narzędzi — użyj jako materiał źródłowy dla Osi czasu, Redakcji lub Korespondencji.',
'sv2_title' => 'Dodaj do korpusu',
'sv2_body' => 'Zapisz do swojego osobistego korpusu, aby transkrypcja była przeszukiwalna i wielokrotnego użytku między sesjami. Przydatne gdy sprawa obejmuje kilka przesłuchań.',
'sv3_title' => 'Pobierz lub skopiuj',
'sv3_body' => 'Pobierz transkrypcję jako plik tekstowy lub skopiuj do schowka. Na serwerze nic nie jest przechowywane, chyba że zdecydujesz się zapisać.',
'cta_title' => 'Gotowy do transkrypcji pierwszego nagrania?',
'cta_sub' => 'Bezpłatnie dla członków Do Better Norge. Karta kredytowa nie jest wymagana.',
'btn_open' => 'Otwórz Transkrypcję →',
'btn_signin_cta' => 'Zaloguj się, aby używać Transkrypcji →',
'btn_register' => 'Zarejestruj się za darmo',
),
);
+579
View File
@@ -0,0 +1,579 @@
<?php
return array (
'en' =>
array (
'nav_about' => 'About',
'nav_guide' => 'User guide',
'nav_howit' => 'How it works',
'nav_opentool' => '← Open the tool',
'nav_signin' => 'Sign in',
'nav_open' => 'Open Transcribe →',
'hero_kicker' => 'User Guide · Transcribe',
'hero_title' => 'How to use Transcribe.',
'hero_sub' => 'A step-by-step walkthrough of every setting — from audio language to AI cleanup — so you get an accurate, speaker-labelled transcript every time.',
'toc_title' => 'Contents',
'toc_1' => 'Audio language',
'toc_2' => 'Speaker identification',
'toc_3' => 'Vocabulary presets',
'toc_4' => 'Task: Transcribe vs Translate',
'toc_5' => 'VAD filter',
'toc_6' => 'Whisper model',
'toc_7' => 'AI cleanup',
'toc_8' => 'Uploading audio',
'toc_9' => 'My Audio library',
'toc_10' => 'Reading the output',
'toc_11' => 'Saving and exporting',
'step1_title' => '1. Audio language',
'step1_intro' => 'Set this to the language spoken in the recording — not the language you want the output in. Getting this right is the single biggest factor in transcription accuracy.',
'step1_table_lang' => 'Language',
'step1_table_code' => 'Code',
'step1_table_notes' => 'Notes',
'step1_nb' => 'Norsk (nb)',
'step1_nb_notes' => 'Bokmål. Default for most Norwegian cases.',
'step1_nn' => 'Nynorsk',
'step1_nn_notes' => 'Select when the speaker uses Nynorsk. Bokmål models handle Nynorsk passably but selecting the correct variant improves accuracy.',
'step1_en' => 'English',
'step1_en_notes' => 'For English-language recordings or mixed English/Norwegian.',
'step1_pl' => 'Polish',
'step1_pl_notes' => 'For Polish-speaking parties in a Norwegian case.',
'step1_uk' => 'Ukrainian',
'step1_uk_notes' => 'For Ukrainian-speaking parties.',
'step1_sv' => 'Swedish',
'step1_sv_notes' => 'Bokmål and Swedish are closely related; select the correct language to avoid misrecognition.',
'step1_da' => 'Danish',
'step1_da_notes' => 'Danish.',
'step1_de' => 'German',
'step1_de_notes' => 'German.',
'step1_fr' => 'French',
'step1_fr_notes' => 'French.',
'step1_auto' => 'Auto-detect',
'step1_auto_notes' => 'Let the engine identify the language. May confuse nb/da/sv. Use only when you do not know the language in advance.',
'step1_tip' => 'If the recording contains multiple languages, set the dominant language and let auto-detect handle short code-switches.',
'step2_title' => '2. Speaker identification',
'step2_intro' => 'Speaker identification (diarization) labels each line of the transcript with the speaker who said it. It does not identify who a speaker is by name — it assigns an anonymous label (SPEAKER 1, SPEAKER 2, etc.) and keeps that assignment consistent throughout.',
'step2_enable' => 'Enable: check the "Identify speakers" box.',
'step2_count' => 'Count: enter the number of expected speakers, or leave blank to let the system auto-detect.',
'step2_tip' => 'Setting an exact count generally produces better results than auto-detect when you know how many people are in the recording. For a hearing with a caseworker, a parent, and a lawyer, enter 3.',
'step2_limit' => 'Maximum: 20 speakers. For recordings with many voices, auto-detect often works better than setting a high number.',
'step3_title' => '3. Vocabulary presets',
'step3_intro' => 'Vocabulary presets inject domain-specific terms into the transcription engine as a hint before processing begins. This significantly improves recognition of Norwegian legal terms, proper names, and abbreviations that would otherwise be misheard.',
'step3_table_preset' => 'Preset',
'step3_table_contains' => 'Contains',
'step3_table_use' => 'When to use',
'step3_barnerett' => 'Child welfare / CPS',
'step3_barnerett_contains' => 'Barnevernet, omsorgsovertakelse, fylkesnemnda, sakkyndig, foreldreansvar, samvær, tilsynsfører…',
'step3_barnerett_use' => 'CPS cases, care order hearings, county board proceedings.',
'step3_mediation' => 'Mediation / legal meeting',
'step3_mediation_contains' => 'Mekling, mekler, avtale, forlik, tingrett, advokat, saksøker, saksøkt…',
'step3_mediation_use' => 'Court-mandated mediation, family law negotiations.',
'step3_generell' => 'General Norwegian',
'step3_generell_contains' => 'Common Norwegian legal and administrative vocabulary, government agency names.',
'step3_generell_use' => 'NAV correspondence, general administrative hearings.',
'step3_custom' => 'Custom',
'step3_custom_contains' => 'Whatever you type in the text field below (max 500 characters).',
'step3_custom_use' => 'Unique case names, specialist medical terms, organisation names.',
'step3_custom_tip' => 'When using Custom, list terms separated by commas or new lines. Include proper names, unusual place names, and technical jargon. Example: "Kristoffersen, barnevernstjenesten i Stavanger, ADHD, omsorgsovertakelse".',
'step4_title' => '4. Task: Transcribe vs Translate',
'step4_intro' => 'Found in Advanced options.',
'step4_transcribe' => 'Transcribe (default): output the text in the same language as the audio.',
'step4_translate' => 'Translate to English: output an English translation of the spoken content. The source language is detected automatically (or use the Audio language setting). Useful when sharing a Norwegian or Ukrainian recording with a non-Norwegian speaker.',
'step4_note' => 'Translation is handled by the Whisper model and produces a reasonable but not court-certified translation. For formal legal submissions, use a certified human translator.',
'step5_title' => '5. VAD filter',
'step5_intro' => 'VAD (Voice Activity Detection) filter removes silence and non-speech segments before transcription. Found in Advanced options.',
'step5_when_on' => 'Turn on when: the recording has long pauses, background noise, or is taken from a phone call with hold music.',
'step5_when_off' => 'Leave off when: the recording is clean studio audio or a video file where silence carries meaning (e.g. timed pauses in a police interview).',
'step5_tip' => 'If you get short, choppy transcripts with missing content, the VAD filter may be cutting real speech. Turn it off.',
'step6_title' => '6. Whisper model',
'step6_intro' => 'Found in Advanced options. Whisper is used when Azure Speech and Google Cloud are both unavailable. The model choice trades accuracy for speed.',
'step6_table_model' => 'Model',
'step6_table_speed' => 'Speed',
'step6_table_accuracy' => 'Accuracy',
'step6_table_use' => 'When to use',
'step6_lv3' => 'large-v3',
'step6_lv3_speed' => 'Slowest',
'step6_lv3_accuracy' => 'Best',
'step6_lv3_use' => 'Default. Use for any recording that matters.',
'step6_lv2' => 'large-v2',
'step6_lv2_speed' => 'Slow',
'step6_lv2_accuracy' => 'Excellent',
'step6_lv2_use' => 'Slightly faster than v3 with comparable accuracy.',
'step6_medium' => 'medium',
'step6_medium_speed' => 'Moderate',
'step6_medium_accuracy' => 'Good',
'step6_medium_use' => 'Longer recordings where speed matters.',
'step6_small' => 'small',
'step6_small_speed' => 'Fast',
'step6_small_accuracy' => 'Fair',
'step6_small_use' => 'Quick rough transcripts. Not recommended for legal use.',
'step6_base' => 'base',
'step6_base_speed' => 'Very fast',
'step6_base_accuracy' => 'Poor',
'step6_base_use' => 'Testing only.',
'step6_tiny' => 'tiny',
'step6_tiny_speed' => 'Fastest',
'step6_tiny_accuracy' => 'Very poor',
'step6_tiny_use' => 'Testing only. Not recommended.',
'step6_note' => 'In practice, Azure Speech and Google Cloud are the first two engines tried and both perform excellently for Norwegian. Whisper is the fallback — you rarely need to change this setting.',
'step7_title' => '7. AI cleanup',
'step7_intro' => 'Found in Advanced options. After the transcript is generated, an optional AI pass corrects recognition errors, normalises punctuation, and fixes domain terminology.',
'step7_none' => 'None (default): raw output from the engine. Fastest, lowest cost.',
'step7_mini' => 'GPT-4o Mini: fast cleanup pass. Fixes obvious errors, improves punctuation, corrects common misrecognitions. Adds 1 credit.',
'step7_full' => 'GPT-4o: deep cleanup pass. Better at domain terminology, ambiguous names, and complex sentence structures. Adds 2 credits.',
'step7_tip' => 'For most cases, GPT-4o Mini cleanup is the best value. Run GPT-4o when the recording is noisy or the content involves unusual terminology.',
'step8_title' => '8. Uploading audio',
'step8_intro' => 'Drag and drop one or more files into the upload zone, or click Browse to select them.',
'step8_formats' => 'Supported formats: MP3, WAV, OGG, M4A, FLAC, WEBM.',
'step8_size' => 'Maximum file size: 200 MB per file.',
'step8_queue' => 'Multiple files: add several files to the queue. They are transcribed sequentially and the results are combined.',
'step8_tip' => 'If you have a long hearing split across multiple recordings, add all parts to the queue. The output will include all parts in order.',
'step9_title' => '9. My Audio library',
'step9_intro' => 'Click "Select from My Audio" to open recordings you have previously uploaded and stored in your account. Stored audio counts against your storage quota.',
'step9_save' => 'To save an audio file to My Audio for later use, upload it and check the "Save to My Audio" option in the results panel.',
'step10_title' => '10. Reading the output',
'step10_intro' => 'Each line of the transcript follows this format:',
'step10_format' => '[HH:MM:SS] SPEAKER N: Transcribed text here.',
'step10_timestamp' => 'The timestamp marks when the segment starts in the recording.',
'step10_speaker' => 'SPEAKER N is the assigned speaker label. When diarization is off, all lines appear without a speaker label.',
'step10_confidence' => 'The AI cleanup pass may add [unclear] markers where speech was unintelligible.',
'step10_tip' => 'Use the timestamps to cross-reference the transcript against the original recording. If a line seems wrong, play back the corresponding section of the audio.',
'step11_title' => '11. Saving and exporting',
'step11_intro' => 'Once the transcript appears, you have three options:',
'step11_minsak' => 'Save to Min Sak: saves the transcript to your current case file. From there it is available in Timeline, Redact, Korrespond, and other tools as a source document.',
'step11_corpus' => 'Save to corpus: saves the transcript to your searchable corpus for use across sessions.',
'step11_download' => 'Download: saves the transcript as a plain text file to your computer.',
'step11_copy' => 'Copy: copies the full transcript to the clipboard.',
'step11_note' => 'Audio is processed in memory and not stored on the server. Nothing is retained unless you choose to save the transcript.',
),
'no' =>
array (
'nav_about' => 'Om',
'nav_guide' => 'Brukerveiledning',
'nav_howit' => 'Slik fungerer det',
'nav_opentool' => '← Åpne verktøyet',
'nav_signin' => 'Logg inn',
'nav_open' => 'Åpne Transkripsjon →',
'hero_kicker' => 'Brukerveiledning · Transkripsjon',
'hero_title' => 'Hvordan bruke Transkripsjon.',
'hero_sub' => 'En steg-for-steg gjennomgang av alle innstillinger — fra lydspråk til AI-opprydding — slik at du får en nøyaktig, taler-merket transkripsjon hver gang.',
'toc_title' => 'Innhold',
'toc_1' => 'Lydspråk',
'toc_2' => 'Taler-identifisering',
'toc_3' => 'Ordforrådsforhåndsinnstillinger',
'toc_4' => 'Oppgave: Transkripsjon vs. Oversettelse',
'toc_5' => 'VAD-filter',
'toc_6' => 'Whisper-modell',
'toc_7' => 'AI-opprydding',
'toc_8' => 'Laste opp lyd',
'toc_9' => 'Min lyd-bibliotek',
'toc_10' => 'Lese utdataene',
'toc_11' => 'Lagring og eksport',
'step1_title' => '1. Lydspråk',
'step1_intro' => 'Sett dette til språket som snakkes i opptaket — ikke språket du vil ha utdataene på. Å få dette riktig er den viktigste enkeltfaktoren for transkripsjonsøyaktighet.',
'step1_table_lang' => 'Språk',
'step1_table_code' => 'Kode',
'step1_table_notes' => 'Notater',
'step1_nb' => 'Norsk (nb)',
'step1_nb_notes' => 'Bokmål. Standard for de fleste norske saker.',
'step1_nn' => 'Nynorsk',
'step1_nn_notes' => 'Velg når taleren bruker nynorsk. Bokmål-modeller håndterer nynorsk passabelt, men å velge riktig variant forbedrer nøyaktigheten.',
'step1_en' => 'Engelsk',
'step1_en_notes' => 'For engelskspråklige opptak eller blandet engelsk/norsk.',
'step1_pl' => 'Polsk',
'step1_pl_notes' => 'For polsktalende parter i en norsk sak.',
'step1_uk' => 'Ukrainsk',
'step1_uk_notes' => 'For ukrainsktalende parter.',
'step1_sv' => 'Svensk',
'step1_sv_notes' => 'Bokmål og svensk er nært beslektet; velg riktig språk for å unngå feilgjenkjenning.',
'step1_da' => 'Dansk',
'step1_da_notes' => 'Dansk.',
'step1_de' => 'Tysk',
'step1_de_notes' => 'Tysk.',
'step1_fr' => 'Fransk',
'step1_fr_notes' => 'Fransk.',
'step1_auto' => 'Auto-deteksjon',
'step1_auto_notes' => 'La motoren identifisere språket. Kan forveksle nb/da/sv. Bruk kun når du ikke vet språket på forhånd.',
'step1_tip' => 'Hvis opptaket inneholder flere språk, sett det dominerende språket og la auto-deteksjon håndtere korte kodebytter.',
'step2_title' => '2. Taler-identifisering',
'step2_intro' => 'Taler-identifisering (diarisering) merker hver linje i transkripsjonen med taleren som sa den. Den identifiserer ikke hvem en taler er ved navn — den tildeler en anonym etikett (TALER 1, TALER 2 osv.) og holder denne tildelingen konsistent gjennom hele opptaket.',
'step2_enable' => 'Aktiver: merk av «Identifiser talere»-boksen.',
'step2_count' => 'Antall: skriv inn antall forventede talere, eller la feltet stå tomt for å la systemet auto-detektere.',
'step2_tip' => 'Å angi eksakt antall gir generelt bedre resultater enn auto-deteksjon når du vet hvor mange personer som er i opptaket. For en høring med en saksbehandler, en forelder og en advokat, skriv inn 3.',
'step2_limit' => 'Maksimum: 20 talere. For opptak med mange stemmer fungerer auto-deteksjon ofte bedre enn å angi et høyt tall.',
'step3_title' => '3. Ordforrådsforhåndsinnstillinger',
'step3_intro' => 'Ordforrådsforhåndsinnstillinger injiserer domene-spesifikke termer i transkripsjonsmotoren som et hint før behandlingen begynner. Dette forbedrer vesentlig gjenkjenning av norske juridiske termer, egennavn og forkortelser som ellers ville blitt hørt feil.',
'step3_table_preset' => 'Forhåndsinnstilling',
'step3_table_contains' => 'Inneholder',
'step3_table_use' => 'Når du skal bruke',
'step3_barnerett' => 'Barnevern / BV',
'step3_barnerett_contains' => 'Barnevernet, omsorgsovertakelse, fylkesnemnda, sakkyndig, foreldreansvar, samvær, tilsynsfører…',
'step3_barnerett_use' => 'Barnevernsaker, høringer om omsorgsovertakelse, fylkesnemndsbehandling.',
'step3_mediation' => 'Mekling / juridisk møte',
'step3_mediation_contains' => 'Mekling, mekler, avtale, forlik, tingrett, advokat, saksøker, saksøkt…',
'step3_mediation_use' => 'Rettslig mekling, forhandlinger i familierett.',
'step3_generell' => 'Generell norsk',
'step3_generell_contains' => 'Vanlig norsk juridisk og administrativt ordforråd, offentlige etatsnavne.',
'step3_generell_use' => 'NAV-korrespondanse, alminnelige administrative høringer.',
'step3_custom' => 'Egendefinert',
'step3_custom_contains' => 'Hva du skriver i tekstfeltet nedenfor (maks 500 tegn).',
'step3_custom_use' => 'Unike saksnavn, spesialiserte medisinske termer, organisasjonsnavn.',
'step3_custom_tip' => 'Når du bruker Egendefinert, list opp termer atskilt med komma eller linjeskift. Inkluder egennavn, uvanlige stedsnavn og fagspråk. Eksempel: «Kristoffersen, barnevernstjenesten i Stavanger, ADHD, omsorgsovertakelse».',
'step4_title' => '4. Oppgave: Transkripsjon vs. Oversettelse',
'step4_intro' => 'Finnes i Avanserte alternativer.',
'step4_transcribe' => 'Transkripsjon (standard): utdata på samme språk som lyden.',
'step4_translate' => 'Oversett til engelsk: utdata som en engelsk oversettelse av det talte innholdet. Kildespråket oppdages automatisk (eller bruk Lydspråk-innstillingen). Nyttig ved deling av et norsk eller ukrainsk opptak med en ikke-norsktalende.',
'step4_note' => 'Oversettelse håndteres av Whisper-modellen og gir en rimelig, men ikke rettslig sertifisert oversettelse. For formelle juridiske innleveringer, bruk en sertifisert menneskelig oversetter.',
'step5_title' => '5. VAD-filter',
'step5_intro' => 'VAD (Voice Activity Detection) filter fjerner stillhet og ikke-talte segmenter før transkripsjon. Finnes i Avanserte alternativer.',
'step5_when_on' => 'Slå på når: opptaket har lange pauser, bakgrunnsstøy, eller er tatt fra et telefonsamtale med ventemusikk.',
'step5_when_off' => 'La stå av når: opptaket er rent studiolyden eller en videofil der stillhet har betydning (f.eks. tidsbestemte pauser i et politiintervju).',
'step5_tip' => 'Hvis du får korte, hakkete transkripsjoner med manglende innhold, kan VAD-filteret kutte ekte tale. Slå det av.',
'step6_title' => '6. Whisper-modell',
'step6_intro' => 'Finnes i Avanserte alternativer. Whisper brukes når Azure Speech og Google Cloud begge er utilgjengelige. Modellvalget avveier nøyaktighet mot hastighet.',
'step6_table_model' => 'Modell',
'step6_table_speed' => 'Hastighet',
'step6_table_accuracy' => 'Nøyaktighet',
'step6_table_use' => 'Når du skal bruke',
'step6_lv3' => 'large-v3',
'step6_lv3_speed' => 'Tregeste',
'step6_lv3_accuracy' => 'Best',
'step6_lv3_use' => 'Standard. Bruk for ethvert opptak som er viktig.',
'step6_lv2' => 'large-v2',
'step6_lv2_speed' => 'Treg',
'step6_lv2_accuracy' => 'Utmerket',
'step6_lv2_use' => 'Litt raskere enn v3 med sammenlignbar nøyaktighet.',
'step6_medium' => 'medium',
'step6_medium_speed' => 'Moderat',
'step6_medium_accuracy' => 'God',
'step6_medium_use' => 'Lengre opptak der hastighet betyr noe.',
'step6_small' => 'small',
'step6_small_speed' => 'Rask',
'step6_small_accuracy' => 'Passabel',
'step6_small_use' => 'Raske grove transkripsjoner. Ikke anbefalt til juridisk bruk.',
'step6_base' => 'base',
'step6_base_speed' => 'Veldig rask',
'step6_base_accuracy' => 'Svak',
'step6_base_use' => 'Kun testing.',
'step6_tiny' => 'tiny',
'step6_tiny_speed' => 'Raskest',
'step6_tiny_accuracy' => 'Svært svak',
'step6_tiny_use' => 'Kun testing. Ikke anbefalt.',
'step6_note' => 'I praksis forsøkes Azure Speech og Google Cloud som de to første motorene, og begge presterer utmerket for norsk. Whisper er reserveløsningen — du trenger sjelden å endre denne innstillingen.',
'step7_title' => '7. AI-opprydding',
'step7_intro' => 'Finnes i Avanserte alternativer. Etter at transkripsjonen er generert, korrigerer et valgfritt AI-pass gjenkjenningsfeil, normaliserer tegnsetting og fikser domeneterminologi.',
'step7_none' => 'Ingen (standard): rå utdata fra motoren. Raskest, lavest kostnad.',
'step7_mini' => 'GPT-4o Mini: raskt oppryddingspass. Fikser åpenbare feil, forbedrer tegnsetting, korrigerer vanlige feiltolkninger. Legger til 1 kreditt.',
'step7_full' => 'GPT-4o: dypt oppryddingspass. Bedre på domeneterminologi, tvetydige navn og komplekse setningsstrukturer. Legger til 2 kreditter.',
'step7_tip' => 'For de fleste saker er GPT-4o Mini-opprydding den beste verdien. Kjør GPT-4o når opptaket er støyete eller innholdet involverer uvanlig terminologi.',
'step8_title' => '8. Laste opp lyd',
'step8_intro' => 'Dra og slipp én eller flere filer i opplastningssonen, eller klikk Bla gjennom for å velge dem.',
'step8_formats' => 'Støttede formater: MP3, WAV, OGG, M4A, FLAC, WEBM.',
'step8_size' => 'Maksimal filstørrelse: 200 MB per fil.',
'step8_queue' => 'Flere filer: legg til flere filer i køen. De transkriberes sekvensielt og resultatene kombineres.',
'step8_tip' => 'Hvis du har en lang høring fordelt på flere opptak, legg til alle deler i køen. Utdataene vil inneholde alle deler i rekkefølge.',
'step9_title' => '9. Min lyd-bibliotek',
'step9_intro' => 'Klikk «Velg fra Min Lyd» for å åpne opptak du tidligere har lastet opp og lagret i kontoen din. Lagret lyd teller mot lagringskvoten din.',
'step9_save' => 'For å lagre en lydfil til Min Lyd for senere bruk, last den opp og merk «Lagre i Min Lyd»-alternativet i resultatpanelet.',
'step10_title' => '10. Lese utdataene',
'step10_intro' => 'Hver linje i transkripsjonen følger dette formatet:',
'step10_format' => '[TT:MM:SS] TALER N: Transkribert tekst her.',
'step10_timestamp' => 'Tidsstemplet markerer når segmentet starter i opptaket.',
'step10_speaker' => 'TALER N er den tildelte talermerket. Når diarisering er av, vises alle linjer uten taleretikett.',
'step10_confidence' => 'AI-oppryddingspasset kan legge til [uklar]-markører der tale var uforståelig.',
'step10_tip' => 'Bruk tidsstemplene til å kryssreferere transkripsjonen mot det originale opptaket. Hvis en linje virker feil, spill av den tilsvarende delen av lyden.',
'step11_title' => '11. Lagring og eksport',
'step11_intro' => 'Når transkripsjonen vises, har du tre alternativer:',
'step11_minsak' => 'Lagre i Min Sak: lagrer transkripsjonen i din nåværende saksfil. Derfra er den tilgjengelig i Tidslinje, Sladding, Korrespondanse og andre verktøy som et kildedokument.',
'step11_corpus' => 'Lagre i korpus: lagrer transkripsjonen i ditt søkbare korpus for bruk på tvers av sesjoner.',
'step11_download' => 'Last ned: lagrer transkripsjonen som en ren tekstfil på datamaskinen din.',
'step11_copy' => 'Kopier: kopierer hele transkripsjonen til utklippstavlen.',
'step11_note' => 'Lyd behandles i minnet og lagres ikke på serveren. Ingenting beholdes med mindre du velger å lagre transkripsjonen.',
),
'uk' =>
array (
'nav_about' => 'Про інструмент',
'nav_guide' => 'Посібник користувача',
'nav_howit' => 'Як це працює',
'nav_opentool' => '← Відкрити інструмент',
'nav_signin' => 'Увійти',
'nav_open' => 'Відкрити Транскрипцію →',
'hero_kicker' => 'Посібник користувача · Транскрипція',
'hero_title' => 'Як користуватись Транскрипцією.',
'hero_sub' => 'Покрокове пояснення кожного налаштування — від мови аудіо до очищення AI — щоб ви щоразу отримували точну транскрипцію з позначенням мовців.',
'toc_title' => 'Зміст',
'toc_1' => 'Мова аудіо',
'toc_2' => 'Ідентифікація мовців',
'toc_3' => 'Словникові пресети',
'toc_4' => 'Завдання: Транскрипція vs Переклад',
'toc_5' => 'Фільтр VAD',
'toc_6' => 'Модель Whisper',
'toc_7' => 'Очищення AI',
'toc_8' => 'Завантаження аудіо',
'toc_9' => 'Бібліотека Моє аудіо',
'toc_10' => 'Читання результату',
'toc_11' => 'Збереження та експорт',
'step1_title' => '1. Мова аудіо',
'step1_intro' => 'Встановіть мову запису — не мову, якою ви хочете отримати результат. Правильне налаштування — найважливіший фактор точності транскрипції.',
'step1_table_lang' => 'Мова',
'step1_table_code' => 'Код',
'step1_table_notes' => 'Примітки',
'step1_nb' => 'Норвезька (nb)',
'step1_nb_notes' => 'Букмол. За замовчуванням для більшості норвезьких справ.',
'step1_nn' => 'Нюношк',
'step1_nn_notes' => 'Вибирайте, коли мовець використовує нюношк. Моделі букмолу прийнятно обробляють нюношк, але вибір правильного варіанту покращує точність.',
'step1_en' => 'Англійська',
'step1_en_notes' => 'Для записів англійською або змішаних англійсько-норвезьких.',
'step1_pl' => 'Польська',
'step1_pl_notes' => 'Для польськомовних сторін у норвезькій справі.',
'step1_uk' => 'Українська',
'step1_uk_notes' => 'Для україномовних сторін.',
'step1_sv' => 'Шведська',
'step1_sv_notes' => 'Букмол і шведська тісно пов'язані; вибирайте правильну мову, щоб уникнути хибного розпізнавання.',
'step1_da' => 'Данська',
'step1_da_notes' => 'Данська.',
'step1_de' => 'Німецька',
'step1_de_notes' => 'Німецька.',
'step1_fr' => 'Французька',
'step1_fr_notes' => 'Французька.',
'step1_auto' => 'Автовизначення',
'step1_auto_notes' => 'Система визначає мову автоматично. Може плутати nb/da/sv. Використовуйте лише коли мова невідома заздалегідь.',
'step1_tip' => 'Якщо запис містить кілька мов, встановіть домінуючу мову і дозвольте автовизначенню обробляти короткі перемикання мови.',
'step2_title' => '2. Ідентифікація мовців',
'step2_intro' => 'Ідентифікація мовців (діаризація) позначає кожен рядок транскрипції мовцем, який його вимовив. Вона не визначає особу мовця за іменем призначає анонімну мітку (МОВЕЦЬ 1, МОВЕЦЬ 2 тощо) і зберігає це призначення протягом усього запису.',
'step2_enable' => 'Увімкнути: позначте поле «Ідентифікувати мовців».',
'step2_count' => 'Кількість: введіть очікувану кількість мовців або залиште пусте поле для автовизначення системою.',
'step2_tip' => 'Точна кількість зазвичай дає кращі результати, ніж автовизначення, коли ви знаєте, скільки людей у записі. Для слухання з соціальним працівником, батьком і адвокатом введіть 3.',
'step2_limit' => 'Максимум: 20 мовців. Для записів з багатьма голосами автовизначення часто працює краще, ніж встановлення великого числа.',
'step3_title' => '3. Словникові пресети',
'step3_intro' => 'Словникові пресети вводять специфічні терміни в систему транскрипції як підказку перед початком обробки. Це значно покращує розпізнавання норвезьких правових термінів, власних назв та абревіатур.',
'step3_table_preset' => 'Пресет',
'step3_table_contains' => 'Містить',
'step3_table_use' => 'Коли використовувати',
'step3_barnerett' => 'Захист дітей / БВ',
'step3_barnerett_contains' => 'Barnevernet, omsorgsovertakelse, fylkesnemnda, sakkyndig, foreldreansvar, samvær, tilsynsfører…',
'step3_barnerett_use' => 'Справи захисту дітей, слухання щодо опіки, провадження у раді округу.',
'step3_mediation' => 'Медіація / юридична нарада',
'step3_mediation_contains' => 'Mekling, mekler, avtale, forlik, tingrett, advokat, saksøker, saksøkt…',
'step3_mediation_use' => 'Судова медіація, переговори з сімейного права.',
'step3_generell' => 'Загальна норвезька',
'step3_generell_contains' => 'Поширена норвезька юридична та адміністративна лексика, назви державних органів.',
'step3_generell_use' => 'Кореспонденція NAV, загальні адміністративні слухання.',
'step3_custom' => 'Власний',
'step3_custom_contains' => 'Що ви вводите в текстове поле нижче (макс. 500 символів).',
'step3_custom_use' => 'Унікальні назви справ, спеціалізовані медичні терміни, назви організацій.',
'step3_custom_tip' => 'При використанні Власного пресету перераховуйте терміни через кому або з нового рядка. Включайте власні назви, незвичайні топоніми та технічний жаргон. Приклад: «Kristoffersen, barnevernstjenesten i Stavanger, ADHD, omsorgsovertakelse».',
'step4_title' => '4. Завдання: Транскрипція vs Переклад',
'step4_intro' => 'Знаходиться в Розширених параметрах.',
'step4_transcribe' => 'Транскрипція (за замовчуванням): виводить текст тією ж мовою, що й аудіо.',
'step4_translate' => 'Перекласти на англійську: виводить англійський переклад усного контенту. Мова джерела визначається автоматично (або використовуйте налаштування Мова аудіо). Корисно при передачі норвезького або українського запису не норвежськомовній особі.',
'step4_note' => 'Переклад виконується моделлю Whisper і дає прийнятний, але не юридично сертифікований переклад. Для офіційних юридичних подань використовуйте сертифікованого перекладача-людину.',
'step5_title' => '5. Фільтр VAD',
'step5_intro' => 'Фільтр VAD (Виявлення голосової активності) видаляє тишу та неголосові сегменти перед транскрипцією. Знаходиться в Розширених параметрах.',
'step5_when_on' => 'Вмикайте, коли: запис має довгі паузи, фоновий шум або знятий з телефонного дзвінка з очікувальною музикою.',
'step5_when_off' => 'Залишайте вимкненим, коли: запис чисте студійне аудіо або відеофайл, де тиша має значення (напр. паузи в поліцейському допиті).',
'step5_tip' => 'Якщо ви отримуєте короткі, уривчасті транскрипції з відсутнім вмістом, фільтр VAD може обрізати справжнє мовлення. Вимкніть його.',
'step6_title' => '6. Модель Whisper',
'step6_intro' => 'Знаходиться в Розширених параметрах. Whisper використовується, коли Azure Speech і Google Cloud недоступні. Вибір моделі визначає компроміс між точністю та швидкістю.',
'step6_table_model' => 'Модель',
'step6_table_speed' => 'Швидкість',
'step6_table_accuracy' => 'Точність',
'step6_table_use' => 'Коли використовувати',
'step6_lv3' => 'large-v3',
'step6_lv3_speed' => 'Найповільніша',
'step6_lv3_accuracy' => 'Найкраща',
'step6_lv3_use' => 'За замовчуванням. Для будь-якого важливого запису.',
'step6_lv2' => 'large-v2',
'step6_lv2_speed' => 'Повільна',
'step6_lv2_accuracy' => 'Відмінна',
'step6_lv2_use' => 'Дещо швидша за v3 з подібною точністю.',
'step6_medium' => 'medium',
'step6_medium_speed' => 'Помірна',
'step6_medium_accuracy' => 'Хороша',
'step6_medium_use' => 'Довші записи, де важлива швидкість.',
'step6_small' => 'small',
'step6_small_speed' => 'Швидка',
'step6_small_accuracy' => 'Задовільна',
'step6_small_use' => 'Швидкі чернетки транскрипцій. Не рекомендується для юридичного використання.',
'step6_base' => 'base',
'step6_base_speed' => 'Дуже швидка',
'step6_base_accuracy' => 'Погана',
'step6_base_use' => 'Тільки для тестування.',
'step6_tiny' => 'tiny',
'step6_tiny_speed' => 'Найшвидша',
'step6_tiny_accuracy' => 'Дуже погана',
'step6_tiny_use' => 'Тільки для тестування. Не рекомендується.',
'step6_note' => 'На практиці Azure Speech і Google Cloud випробовуються першими і обидві відмінно працюють для норвезької. Whisper резервний варіант; вам рідко потрібно змінювати це налаштування.',
'step7_title' => '7. Очищення AI',
'step7_intro' => 'Знаходиться в Розширених параметрах. Після генерації транскрипції необов'язковий прохід AI виправляє помилки розпізнавання, нормалізує пунктуацію та виправляє термінологію.',
'step7_none' => 'Немає (за замовчуванням): необроблений вивід від системи. Найшвидший, найдешевший.',
'step7_mini' => 'GPT-4o Mini: швидкий прохід очищення. Виправляє очевидні помилки, покращує пунктуацію, коригує поширені хибні розпізнавання. Додає 1 кредит.',
'step7_full' => 'GPT-4o: глибокий прохід очищення. Краще обробляє термінологію, неоднозначні імена та складні структури речень. Додає 2 кредити.',
'step7_tip' => 'Для більшості справ очищення GPT-4o Mini — найкраще співвідношення ціна/якість. Запускайте GPT-4o, коли запис зашумлений або вміст містить незвичайну термінологію.',
'step8_title' => '8. Завантаження аудіо',
'step8_intro' => 'Перетягніть один або кілька файлів у зону завантаження або натисніть Огляд для вибору.',
'step8_formats' => 'Підтримувані формати: MP3, WAV, OGG, M4A, FLAC, WEBM.',
'step8_size' => 'Максимальний розмір файлу: 200 МБ на файл.',
'step8_queue' => 'Кілька файлів: додайте кілька файлів у чергу. Вони транскрибуються послідовно, а результати об'єднуються.',
'step8_tip' => 'Якщо у вас тривале слухання, розподілене на кілька записів, додайте всі частини в чергу. Результат міститиме всі частини по порядку.',
'step9_title' => '9. Бібліотека Моє аудіо',
'step9_intro' => 'Натисніть «Вибрати з Моє аудіо», щоб відкрити записи, які ви раніше завантажили та зберегли в обліковому записі. Збережене аудіо зараховується до вашої квоти сховища.',
'step9_save' => 'Щоб зберегти аудіофайл у Моє аудіо для подальшого використання, завантажте його та позначте параметр «Зберегти в Моє аудіо» в панелі результатів.',
'step10_title' => '10. Читання результату',
'step10_intro' => 'Кожен рядок транскрипції має такий формат:',
'step10_format' => '[ГГ:ХХ:СС] МОВЕЦЬ N: Транскрибований текст тут.',
'step10_timestamp' => 'Мітка часу позначає початок сегменту в записі.',
'step10_speaker' => 'МОВЕЦЬ N призначена мітка мовця. Коли діаризація вимкнена, всі рядки відображаються без мітки мовця.',
'step10_confidence' => 'Прохід очищення AI може додавати маркери [нерозбірливо], де мовлення було незрозумілим.',
'step10_tip' => 'Використовуйте мітки часу для перехресної перевірки транскрипції з оригінальним записом. Якщо рядок здається неправильним, відтворіть відповідний розділ аудіо.',
'step11_title' => '11. Збереження та експорт',
'step11_intro' => 'Коли з'явиться транскрипція, у вас є три варіанти:',
'step11_minsak' => 'Зберегти до Min Sak: зберігає транскрипцію до вашого поточного файлу справи. Звідти вона доступна у Хронологія, Редагування, Кореспонденція та інших інструментах як вихідний документ.',
'step11_corpus' => 'Зберегти до корпусу: зберігає транскрипцію до вашого корпусу з можливістю пошуку для використання між сесіями.',
'step11_download' => 'Завантажити: зберігає транскрипцію як текстовий файл на ваш комп'ютер.',
'step11_copy' => 'Копіювати: копіює всю транскрипцію в буфер обміну.',
'step11_note' => 'Аудіо обробляється в пам'яті і не зберігається на сервері. Нічого не зберігається, якщо ви не вирішите зберегти транскрипцію.',
),
'pl' =>
array (
'nav_about' => 'O narzędziu',
'nav_guide' => 'Przewodnik użytkownika',
'nav_howit' => 'Jak to działa',
'nav_opentool' => '← Otwórz narzędzie',
'nav_signin' => 'Zaloguj się',
'nav_open' => 'Otwórz Transkrypcję →',
'hero_kicker' => 'Przewodnik użytkownika · Transkrypcja',
'hero_title' => 'Jak korzystać z Transkrypcji.',
'hero_sub' => 'Krok po kroku przez każde ustawienie — od języka nagrania do czyszczenia AI — aby za każdym razem otrzymać dokładną transkrypcję z oznaczeniem mówców.',
'toc_title' => 'Spis treści',
'toc_1' => 'Język nagrania',
'toc_2' => 'Identyfikacja mówców',
'toc_3' => 'Predefiniowane słowniki',
'toc_4' => 'Zadanie: Transkrypcja vs Tłumaczenie',
'toc_5' => 'Filtr VAD',
'toc_6' => 'Model Whisper',
'toc_7' => 'Czyszczenie AI',
'toc_8' => 'Przesyłanie nagrania',
'toc_9' => 'Biblioteka Moje nagrania',
'toc_10' => 'Odczytywanie wyników',
'toc_11' => 'Zapisywanie i eksport',
'step1_title' => '1. Język nagrania',
'step1_intro' => 'Ustaw język mówiony w nagraniu — nie język, w którym chcesz otrzymać wynik. Poprawne ustawienie jest najważniejszym czynnikiem dokładności transkrypcji.',
'step1_table_lang' => 'Język',
'step1_table_code' => 'Kod',
'step1_table_notes' => 'Uwagi',
'step1_nb' => 'Norweski (nb)',
'step1_nb_notes' => 'Bokmål. Domyślny dla większości spraw norweskich.',
'step1_nn' => 'Nynorsk',
'step1_nn_notes' => 'Wybierz, gdy mówca używa Nynorsk. Modele Bokmål obsługują Nynorsk znośnie, ale wybór właściwego wariantu poprawia dokładność.',
'step1_en' => 'Angielski',
'step1_en_notes' => 'Dla nagrań anglojęzycznych lub mieszanych angielsko-norweskich.',
'step1_pl' => 'Polski',
'step1_pl_notes' => 'Dla polskojęzycznych stron w sprawie norweskiej.',
'step1_uk' => 'Ukraiński',
'step1_uk_notes' => 'Dla ukraińskojęzycznych stron.',
'step1_sv' => 'Szwedzki',
'step1_sv_notes' => 'Bokmål i szwedzki są ściśle spokrewnione; wybierz właściwy język, aby uniknąć błędów rozpoznawania.',
'step1_da' => 'Duński',
'step1_da_notes' => 'Duński.',
'step1_de' => 'Niemiecki',
'step1_de_notes' => 'Niemiecki.',
'step1_fr' => 'Francuski',
'step1_fr_notes' => 'Francuski.',
'step1_auto' => 'Automatyczne wykrywanie',
'step1_auto_notes' => 'System wykrywa język automatycznie. Może mylić nb/da/sv. Używaj tylko gdy nie znasz języka nagrania z góry.',
'step1_tip' => 'Jeśli nagranie zawiera wiele języków, ustaw dominujący język i pozwól automatycznemu wykrywaniu obsługiwać krótkie przełączenia.',
'step2_title' => '2. Identyfikacja mówców',
'step2_intro' => 'Identyfikacja mówców (diaryzacja) przypisuje każdą linię transkrypcji do mówcy, który ją wypowiedział. Nie identyfikuje, kim jest mówca z imienia — przypisuje anonimową etykietę (MÓWCA 1, MÓWCA 2 itp.) i utrzymuje to przypisanie przez cały czas.',
'step2_enable' => 'Włącz: zaznacz pole «Identyfikuj mówców».',
'step2_count' => 'Liczba: wprowadź oczekiwaną liczbę mówców lub pozostaw puste, aby system wykrył automatycznie.',
'step2_tip' => 'Ustawienie dokładnej liczby zazwyczaj daje lepsze wyniki niż automatyczne wykrywanie, gdy wiesz ile osób jest w nagraniu. Dla przesłuchania z pracownikiem socjalnym, rodzicem i prawnikiem wprowadź 3.',
'step2_limit' => 'Maksimum: 20 mówców. Dla nagrań z wieloma głosami automatyczne wykrywanie często działa lepiej niż ustawianie dużej liczby.',
'step3_title' => '3. Predefiniowane słowniki',
'step3_intro' => 'Predefiniowane słowniki wprowadzają specjalistyczne terminy do silnika transkrypcji jako wskazówkę przed rozpoczęciem przetwarzania. Znacznie poprawia to rozpoznawanie norweskich terminów prawnych, nazw własnych i skrótów.',
'step3_table_preset' => 'Słownik',
'step3_table_contains' => 'Zawiera',
'step3_table_use' => 'Kiedy używać',
'step3_barnerett' => 'Ochrona dzieci / BV',
'step3_barnerett_contains' => 'Barnevernet, omsorgsovertakelse, fylkesnemnda, sakkyndig, foreldreansvar, samvær, tilsynsfører…',
'step3_barnerett_use' => 'Sprawy ochrony dzieci, przesłuchania dotyczące opieki, postępowania rady okręgu.',
'step3_mediation' => 'Mediacja / spotkanie prawne',
'step3_mediation_contains' => 'Mekling, mekler, avtale, forlik, tingrett, advokat, saksøker, saksøkt…',
'step3_mediation_use' => 'Mediacja sądowa, negocjacje z prawa rodzinnego.',
'step3_generell' => 'Ogólny norweski',
'step3_generell_contains' => 'Powszechne norweskie słownictwo prawne i administracyjne, nazwy agencji rządowych.',
'step3_generell_use' => 'Korespondencja NAV, ogólne przesłuchania administracyjne.',
'step3_custom' => 'Własny',
'step3_custom_contains' => 'To, co wpiszesz w polu tekstowym poniżej (maks. 500 znaków).',
'step3_custom_use' => 'Unikalne nazwy spraw, specjalistyczne terminy medyczne, nazwy organizacji.',
'step3_custom_tip' => 'Używając Własnego słownika, wypisz terminy oddzielone przecinkami lub nowym wierszem. Uwzględnij własne nazwy, niezwykłe nazwy miejsc i terminologię techniczną. Przykład: «Kristoffersen, barnevernstjenesten i Stavanger, ADHD, omsorgsovertakelse».',
'step4_title' => '4. Zadanie: Transkrypcja vs Tłumaczenie',
'step4_intro' => 'Dostępne w Opcjach zaawansowanych.',
'step4_transcribe' => 'Transkrypcja (domyślna): wynik w tym samym języku co nagranie.',
'step4_translate' => 'Przetłumacz na angielski: wynik jako angielskie tłumaczenie mówionej treści. Język źródłowy jest wykrywany automatycznie (lub użyj ustawienia Język nagrania). Przydatne przy udostępnianiu norweskiego lub ukraińskiego nagrania osobom niebędącym native speakerami norweskiego.',
'step4_note' => 'Tłumaczenie jest obsługiwane przez model Whisper i daje przyzwoite, ale niepoświadczone sądownie tłumaczenie. Do formalnych przedłożeń prawnych używaj certyfikowanego tłumacza przysięgłego.',
'step5_title' => '5. Filtr VAD',
'step5_intro' => 'Filtr VAD (Wykrywanie aktywności głosowej) usuwa ciszę i segmenty bez mowy przed transkrypcją. Dostępny w Opcjach zaawansowanych.',
'step5_when_on' => 'Włącz gdy: nagranie ma długie przerwy, szum tła lub pochodzi z rozmowy telefonicznej z muzyką oczekiwania.',
'step5_when_off' => 'Pozostaw wyłączony gdy: nagranie to czyste audio studyjne lub plik wideo, gdzie cisza ma znaczenie (np. zaplanowane przerwy podczas przesłuchania policyjnego).',
'step5_tip' => 'Jeśli otrzymujesz krótkie, urwane transkrypcje z brakującą treścią, filtr VAD może odcinać prawdziwe wypowiedzi. Wyłącz go.',
'step6_title' => '6. Model Whisper',
'step6_intro' => 'Dostępny w Opcjach zaawansowanych. Whisper jest używany gdy Azure Speech i Google Cloud są niedostępne. Wybór modelu to kompromis między dokładnością a szybkością.',
'step6_table_model' => 'Model',
'step6_table_speed' => 'Szybkość',
'step6_table_accuracy' => 'Dokładność',
'step6_table_use' => 'Kiedy używać',
'step6_lv3' => 'large-v3',
'step6_lv3_speed' => 'Najwolniejszy',
'step6_lv3_accuracy' => 'Najlepsza',
'step6_lv3_use' => 'Domyślny. Dla każdego ważnego nagrania.',
'step6_lv2' => 'large-v2',
'step6_lv2_speed' => 'Wolny',
'step6_lv2_accuracy' => 'Doskonała',
'step6_lv2_use' => 'Nieco szybszy od v3 przy porównywalnej dokładności.',
'step6_medium' => 'medium',
'step6_medium_speed' => 'Umiarkowana',
'step6_medium_accuracy' => 'Dobra',
'step6_medium_use' => 'Dłuższe nagrania gdy liczy się szybkość.',
'step6_small' => 'small',
'step6_small_speed' => 'Szybki',
'step6_small_accuracy' => 'Dostateczna',
'step6_small_use' => 'Szybkie przybliżone transkrypcje. Niezalecany do użytku prawnego.',
'step6_base' => 'base',
'step6_base_speed' => 'Bardzo szybki',
'step6_base_accuracy' => 'Słaba',
'step6_base_use' => 'Tylko do testów.',
'step6_tiny' => 'tiny',
'step6_tiny_speed' => 'Najszybszy',
'step6_tiny_accuracy' => 'Bardzo słaba',
'step6_tiny_use' => 'Tylko do testów. Niezalecany.',
'step6_note' => 'W praktyce Azure Speech i Google Cloud są testowane jako pierwsze i obie doskonale sprawdzają się w języku norweskim. Whisper jest rezerwą — rzadko trzeba zmieniać to ustawienie.',
'step7_title' => '7. Czyszczenie AI',
'step7_intro' => 'Dostępne w Opcjach zaawansowanych. Po wygenerowaniu transkrypcji opcjonalne przejście AI poprawia błędy rozpoznawania, normalizuje interpunkcję i poprawia terminologię.',
'step7_none' => 'Brak (domyślne): surowy wynik z silnika. Najszybszy, najtańszy.',
'step7_mini' => 'GPT-4o Mini: szybkie przejście czyszczenia. Naprawia oczywiste błędy, poprawia interpunkcję, koryguje częste błędne rozpoznania. Dodaje 1 kredyt.',
'step7_full' => 'GPT-4o: głębokie przejście czyszczenia. Lepiej obsługuje terminologię dziedzinową, niejednoznaczne nazwy i złożone struktury zdań. Dodaje 2 kredyty.',
'step7_tip' => 'Dla większości spraw czyszczenie GPT-4o Mini to najlepsza wartość. Uruchom GPT-4o gdy nagranie jest zaszumione lub treść zawiera niezwykłą terminologię.',
'step8_title' => '8. Przesyłanie nagrania',
'step8_intro' => 'Przeciągnij i upuść jeden lub więcej plików do strefy przesyłania lub kliknij Przeglądaj, aby je wybrać.',
'step8_formats' => 'Obsługiwane formaty: MP3, WAV, OGG, M4A, FLAC, WEBM.',
'step8_size' => 'Maksymalny rozmiar pliku: 200 MB na plik.',
'step8_queue' => 'Wiele plików: dodaj kilka plików do kolejki. Są transkrybowane kolejno, a wyniki są łączone.',
'step8_tip' => 'Jeśli masz długie przesłuchanie podzielone na kilka nagrań, dodaj wszystkie części do kolejki. Wynik będzie zawierał wszystkie części w odpowiedniej kolejności.',
'step9_title' => '9. Biblioteka Moje nagrania',
'step9_intro' => 'Kliknij «Wybierz z Moich nagrań», aby otworzyć nagrania, które wcześniej przesłałeś i zapisałeś na swoim koncie. Przechowywane nagrania wliczają się do Twojego limitu miejsca.',
'step9_save' => 'Aby zapisać plik audio w Moje nagrania do późniejszego użycia, prześlij go i zaznacz opcję «Zapisz w Moje nagrania» w panelu wyników.',
'step10_title' => '10. Odczytywanie wyników',
'step10_intro' => 'Każda linia transkrypcji ma następujący format:',
'step10_format' => '[GG:MM:SS] MÓWCA N: Transkrybowany tekst tutaj.',
'step10_timestamp' => 'Znacznik czasu określa, kiedy segment zaczyna się w nagraniu.',
'step10_speaker' => 'MÓWCA N to przypisana etykieta mówcy. Gdy diaryzacja jest wyłączona, wszystkie linie są wyświetlane bez etykiety mówcy.',
'step10_confidence' => 'Przejście czyszczenia AI może dodawać znaczniki [niejasne] tam, gdzie mowa była niezrozumiała.',
'step10_tip' => 'Używaj znaczników czasu do weryfikacji krzyżowej transkrypcji z oryginalnym nagraniem. Jeśli linia wydaje się błędna, odtwórz odpowiednią sekcję nagrania.',
'step11_title' => '11. Zapisywanie i eksport',
'step11_intro' => 'Po pojawieniu się transkrypcji masz trzy opcje:',
'step11_minsak' => 'Zapisz do Min Sak: zapisuje transkrypcję do bieżącego pliku sprawy. Stamtąd jest dostępna w Osi czasu, Redakcji, Korespondencji i innych narzędziach jako dokument źródłowy.',
'step11_corpus' => 'Zapisz do korpusu: zapisuje transkrypcję do przeszukiwalnego korpusu do użytku między sesjami.',
'step11_download' => 'Pobierz: zapisuje transkrypcję jako plik tekstowy na Twoim komputerze.',
'step11_copy' => 'Skopiuj: kopiuje całą transkrypcję do schowka.',
'step11_note' => 'Audio jest przetwarzane w pamięci i nie jest przechowywane na serwerze. Nic nie jest zachowywane, chyba że zdecydujesz się zapisać transkrypcję.',
),
);
+467
View File
@@ -0,0 +1,467 @@
<?php
return array (
'en' =>
array (
'nav_about' => 'About',
'nav_guide' => 'User guide',
'nav_howit' => 'How it works',
'nav_opentool' => '← Open the tool',
'nav_signin' => 'Sign in',
'nav_open' => 'Open Transcribe →',
'hero_kicker' => 'Technical Reference · Transcribe',
'hero_title' => 'How Transcribe works under the hood.',
'hero_sub' => 'Three-engine cascade, GPU-accelerated Whisper, pyannote.audio diarization, and optional GPT-4o cleanup — all in a single pipeline.',
'stat_engines' => 'engines in cascade',
'stat_latency' => 'avg. latency (large-v3)',
'stat_wer' => 'WER on Norwegian (Azure)',
'stat_speakers' => 'max diarization speakers',
'toc_title' => 'Contents',
'toc_1' => 'Architecture overview',
'toc_2' => 'Engine 1: Azure Batch Speech',
'toc_3' => 'Engine 2: Google Cloud Speech-to-Text v2',
'toc_4' => 'Engine 3: Whisper GPU (large-v3)',
'toc_5' => 'Speaker diarization',
'toc_6' => 'Vocabulary injection',
'toc_7' => 'Post-processing: AI cleanup',
'toc_8' => 'Language support',
'toc_9' => 'Privacy and data handling',
'arch_title' => 'Architecture overview',
'arch_intro' => 'Transcribe uses a three-engine cascade. Each engine is attempted in priority order; if the primary engine is unavailable or returns an error, the pipeline automatically falls through to the next. This means a transcript is produced even during cloud service outages.',
'arch_cascade_label' => 'Engine cascade',
'arch_e1' => 'Azure Batch Speech',
'arch_e1_sub' => 'Priority · Cloud · Optimised for Norwegian',
'arch_e2' => 'Google Cloud Speech-to-Text v2',
'arch_e2_sub' => 'Fallback · Cloud · Broad language support',
'arch_e3' => 'Whisper large-v3 (GPU)',
'arch_e3_sub' => 'Final fallback · On-premise GPU · Always available',
'arch_post1' => 'Speaker diarization (pyannote.audio)',
'arch_post1_sub' => 'Optional · Runs on GPU server post-transcription',
'arch_post2' => 'AI cleanup (GPT-4o mini / GPT-4o)',
'arch_post2_sub' => 'Optional · Azure OpenAI · Error correction + terminology',
'e1_title' => 'Engine 1: Azure Batch Speech',
'e1_intro' => 'Azure Cognitive Services Speech-to-Text (Batch Transcription API) is the primary engine. It is the highest-accuracy option for Norwegian and is used for all production transcriptions when available.',
'e1_model' => 'Model: <code>nb-NO</code> locale with custom acoustic model. Falls back to locale-matched model for other languages.',
'e1_latency' => 'Latency: typically 0.52× real-time for audio up to 200 MB.',
'e1_format' => 'Accepted formats: all formats accepted by Azure (MP3, WAV, OGG, M4A, FLAC, WEBM — converted server-side if needed).',
'e1_auth' => 'Authentication: managed identity + subscription key stored in server environment variables.',
'e2_title' => 'Engine 2: Google Cloud Speech-to-Text v2',
'e2_intro' => 'Google Cloud Speech-to-Text v2 (Chirp model) is the second engine in the cascade. It activates automatically if Azure returns an error or is unreachable.',
'e2_model' => 'Model: <code>chirp</code> — Google\'s latest large ASR model, strong multilingual support including Norwegian, Polish, and Ukrainian.',
'e2_latency' => 'Latency: comparable to Azure for most file sizes.',
'e2_format' => 'Format handling: audio is re-encoded to FLAC before submission if needed.',
'e3_title' => 'Engine 3: Whisper GPU (large-v3)',
'e3_intro' => 'OpenAI Whisper large-v3 runs on a dedicated GPU server (ocelot — SimplePod RTX 3060 12 GB at 194.93.49.14:20004). It is always available as the final fallback and never has service outages.',
'e3_model' => 'Default model: <code>large-v3</code>. Switchable to large-v2, medium, small, base, or tiny in Advanced options.',
'e3_vocab' => 'Vocabulary injection: the <code>initial_prompt</code> parameter is used to prime Whisper with domain-specific terms before transcription begins. This is a Whisper-native mechanism — the prompt is not included in the output.',
'e3_vad' => 'VAD filter: when enabled, the <code>vad_filter=True</code> parameter uses Silero VAD to remove silence and non-speech before processing.',
'e3_latency' => 'Latency: approximately 24× real-time on RTX 3060. large-v3 on a one-hour recording takes roughly 1530 minutes.',
'e3_note' => 'Whisper operates offline — audio never leaves the ocelot GPU server when this engine is used. No cloud API calls are made.',
'diar_title' => 'Speaker diarization',
'diar_intro' => 'Speaker diarization assigns each segment of the transcript to a speaker. Transcribe uses <strong>pyannote.audio</strong>, an open-source Python library, running as a service on the same GPU server as Whisper.',
'diar_pipeline' => 'Pipeline: <code>pyannote/speaker-diarization-3.1</code>',
'diar_flow' => 'How it works:',
'diar_f1' => 'The audio is first transcribed by whichever engine is selected.',
'diar_f2' => 'pyannote.audio processes the audio independently to detect speaker turn boundaries.',
'diar_f3' => 'Whisper\'s word-level timestamps (where available) or segment timestamps are aligned with the diarization output.',
'diar_f4' => 'Each line is then relabelled with the speaker identity: SPEAKER 1, SPEAKER 2, etc.',
'diar_count' => 'Speaker count: if you provide a number, it is passed as <code>num_speakers</code> to the diarization pipeline. If left blank, pyannote uses its default clustering algorithm to estimate the number of speakers.',
'diar_limit' => 'Maximum: 20 speakers. Performance degrades above 68 speakers in a single recording.',
'vocab_title' => 'Vocabulary injection',
'vocab_intro' => 'The vocabulary preset mechanism works by prepending domain-specific terms to Whisper\'s <code>initial_prompt</code> parameter. This steers the model\'s token probabilities towards the supplied vocabulary before it processes the audio.',
'vocab_limit' => 'Limit: the combined preset + custom prompt must be ≤ 500 characters. Longer prompts are silently truncated.',
'vocab_builtin' => 'Built-in presets are stored server-side as strings and concatenated with any custom text entered by the user. The final prompt is passed directly to Whisper — it is not sent to an LLM and is not included in the transcript output.',
'vocab_note' => 'Vocabulary injection only affects the Whisper engine. Azure Speech and Google Cloud use their own language model and are not influenced by this parameter.',
'cleanup_title' => 'Post-processing: AI cleanup',
'cleanup_intro' => 'The optional AI cleanup pass sends the raw transcript to Azure OpenAI for correction. It does not re-transcribe the audio — it corrects the text output.',
'cleanup_prompt' => 'System prompt instructs the model to: fix ASR recognition errors (homophones, misheard words), normalise punctuation and capitalisation, correct Norwegian legal terminology, preserve speaker labels and timestamps exactly, and return the corrected transcript in the same format.',
'cleanup_mini' => 'GPT-4o mini: <code>gpt-4o-mini</code> deployment on Azure. Fast, low cost. Best for clean recordings with minor errors.',
'cleanup_full' => 'GPT-4o: <code>gpt-4o</code> deployment on Azure. Slower, higher cost. Best for noisy recordings or complex domain vocabulary.',
'cleanup_privacy' => 'The transcript text is sent to Azure OpenAI for this step. If you choose not to run cleanup, the transcript never leaves the server environment.',
'lang_title' => 'Language support',
'lang_intro' => 'The following languages are explicitly supported. Other languages may work via Whisper\'s multilingual model but are not tested or optimised.',
'lang_table_lang' => 'Language',
'lang_table_engine' => 'Primary engine',
'lang_table_notes' => 'Notes',
'lang_nb' => 'Norwegian Bokmål',
'lang_nb_engine' => 'Azure Speech (nb-NO)',
'lang_nb_notes' => 'Best accuracy. Dedicated Norwegian acoustic model.',
'lang_nn' => 'Norwegian Nynorsk',
'lang_nn_engine' => 'Azure Speech (nn-NO)',
'lang_nn_notes' => 'Azure has a dedicated nn-NO model. Whisper fallback also strong.',
'lang_en' => 'English',
'lang_en_engine' => 'Azure Speech (en-*)',
'lang_en_notes' => 'Excellent accuracy. Multiple regional locales available.',
'lang_pl' => 'Polish',
'lang_pl_engine' => 'Azure Speech (pl-PL)',
'lang_pl_notes' => 'Good accuracy. Whisper also strong for Polish.',
'lang_uk' => 'Ukrainian',
'lang_uk_engine' => 'Google Cloud (uk-UA)',
'lang_uk_notes' => 'Azure limited support; Google Cloud Chirp and Whisper both strong.',
'lang_sv' => 'Swedish',
'lang_sv_engine' => 'Azure Speech (sv-SE)',
'lang_sv_notes' => 'Good accuracy. Closely related to Norwegian — easy to confuse on auto-detect.',
'lang_da' => 'Danish',
'lang_da_engine' => 'Azure Speech (da-DK)',
'lang_da_notes' => 'Good accuracy.',
'lang_de' => 'German',
'lang_de_engine' => 'Azure Speech (de-DE)',
'lang_de_notes' => 'Excellent accuracy.',
'lang_fr' => 'French',
'lang_fr_engine' => 'Azure Speech (fr-FR)',
'lang_fr_notes' => 'Good accuracy.',
'priv_title' => 'Privacy and data handling',
'priv_1' => 'Audio files are uploaded directly to the transcription server and processed in memory. The raw binary is not written to disk.',
'priv_2' => 'When Azure Speech or Google Cloud is used, the audio stream is sent to the respective cloud API over HTTPS. Audio is not stored by these providers beyond the duration of the API call (per their standard terms).',
'priv_3' => 'When Whisper is used, audio is processed on the ocelot GPU server (SimplePod private cloud, EU). No third-party cloud APIs are called.',
'priv_4' => 'If the optional AI cleanup pass is enabled, the transcript text (not audio) is sent to Azure OpenAI.',
'priv_5' => 'The transcript itself is not retained on the server unless you explicitly choose to save it. You can save to Min Sak, to your corpus, download as a file, or copy to clipboard — nothing is stored otherwise.',
),
'no' =>
array (
'nav_about' => 'Om',
'nav_guide' => 'Brukerveiledning',
'nav_howit' => 'Slik fungerer det',
'nav_opentool' => '← Åpne verktøyet',
'nav_signin' => 'Logg inn',
'nav_open' => 'Åpne Transkripsjon →',
'hero_kicker' => 'Teknisk referanse · Transkripsjon',
'hero_title' => 'Slik fungerer Transkripsjon under panseret.',
'hero_sub' => 'Tre-motors kaskade, GPU-akselerert Whisper, pyannote.audio-diarisering og valgfritt GPT-4o-opprydding — alt i én pipeline.',
'stat_engines' => 'motorer i kaskade',
'stat_latency' => 'gj.sn. latens (large-v3)',
'stat_wer' => 'ordfeiltall på norsk (Azure)',
'stat_speakers' => 'maks. diariseringstalere',
'toc_title' => 'Innhold',
'toc_1' => 'Arkitektur-oversikt',
'toc_2' => 'Motor 1: Azure Batch Speech',
'toc_3' => 'Motor 2: Google Cloud Speech-to-Text v2',
'toc_4' => 'Motor 3: Whisper GPU (large-v3)',
'toc_5' => 'Taler-diarisering',
'toc_6' => 'Ordforråd-injeksjon',
'toc_7' => 'Etterbehandling: AI-opprydding',
'toc_8' => 'Språkstøtte',
'toc_9' => 'Personvern og datahåndtering',
'arch_title' => 'Arkitektur-oversikt',
'arch_intro' => 'Transkripsjon bruker en tre-motors kaskade. Hver motor forsøkes i prioriteringsrekkefølge; hvis primærmotoren er utilgjengelig eller returnerer en feil, faller pipelinen automatisk gjennom til den neste. Dette betyr at en transkripsjon produseres selv under avbrudd i skytjenester.',
'arch_cascade_label' => 'Motor-kaskade',
'arch_e1' => 'Azure Batch Speech',
'arch_e1_sub' => 'Prioritet · Sky · Optimalisert for norsk',
'arch_e2' => 'Google Cloud Speech-to-Text v2',
'arch_e2_sub' => 'Reserve · Sky · Bred språkstøtte',
'arch_e3' => 'Whisper large-v3 (GPU)',
'arch_e3_sub' => 'Siste reserve · On-premise GPU · Alltid tilgjengelig',
'arch_post1' => 'Taler-diarisering (pyannote.audio)',
'arch_post1_sub' => 'Valgfritt · Kjører på GPU-server etter transkripsjon',
'arch_post2' => 'AI-opprydding (GPT-4o mini / GPT-4o)',
'arch_post2_sub' => 'Valgfritt · Azure OpenAI · Feilretting + terminologi',
'e1_title' => 'Motor 1: Azure Batch Speech',
'e1_intro' => 'Azure Cognitive Services Speech-to-Text (Batch Transcription API) er primærmotoren. Det er det høyest-nøyaktige alternativet for norsk og brukes for alle produksjonstranskripsioner når det er tilgjengelig.',
'e1_model' => 'Modell: <code>nb-NO</code>-lokalitet med tilpasset akustisk modell. Faller tilbake til lokalitetstilpasset modell for andre språk.',
'e1_latency' => 'Latens: typisk 0,52× sanntid for lyd opptil 200 MB.',
'e1_format' => 'Aksepterte formater: alle formater akseptert av Azure (MP3, WAV, OGG, M4A, FLAC, WEBM — konverteres server-side ved behov).',
'e1_auth' => 'Autentisering: administrert identitet + abonnementsnøkkel lagret i servermiljøvariabler.',
'e2_title' => 'Motor 2: Google Cloud Speech-to-Text v2',
'e2_intro' => 'Google Cloud Speech-to-Text v2 (Chirp-modellen) er den andre motoren i kaskaden. Den aktiveres automatisk hvis Azure returnerer en feil eller er utilgjengelig.',
'e2_model' => 'Modell: <code>chirp</code> — Googles nyeste store ASR-modell, sterk flerspråklig støtte inkludert norsk, polsk og ukrainsk.',
'e2_latency' => 'Latens: sammenlignbar med Azure for de fleste filstørrelser.',
'e2_format' => 'Formathåndtering: lyd re-kodes til FLAC før innsending ved behov.',
'e3_title' => 'Motor 3: Whisper GPU (large-v3)',
'e3_intro' => 'OpenAI Whisper large-v3 kjører på en dedikert GPU-server (ocelot — SimplePod RTX 3060 12 GB på 194.93.49.14:20004). Den er alltid tilgjengelig som den endelige reserveløsningen og har aldri tjenesteavbrudd.',
'e3_model' => 'Standardmodell: <code>large-v3</code>. Kan byttes til large-v2, medium, small, base eller tiny i Avanserte alternativer.',
'e3_vocab' => 'Ordforråd-injeksjon: <code>initial_prompt</code>-parameteren brukes til å prime Whisper med domene-spesifikke termer før transkripsjon begynner. Dette er en Whisper-native mekanisme — prompten inkluderes ikke i utdataene.',
'e3_vad' => 'VAD-filter: når aktivert, bruker <code>vad_filter=True</code>-parameteren Silero VAD til å fjerne stillhet og ikke-tale før behandling.',
'e3_latency' => 'Latens: omtrent 24× sanntid på RTX 3060. large-v3 på et en-times opptak tar omtrent 1530 minutter.',
'e3_note' => 'Whisper opererer offline — lyd forlater aldri ocelot GPU-serveren når denne motoren brukes. Ingen sky-API-kall foretas.',
'diar_title' => 'Taler-diarisering',
'diar_intro' => 'Taler-diarisering tilordner hvert segment av transkripsjonen til en taler. Transkripsjon bruker <strong>pyannote.audio</strong>, et Python-bibliotek med åpen kildekode, som kjører som en tjeneste på samme GPU-server som Whisper.',
'diar_pipeline' => 'Pipeline: <code>pyannote/speaker-diarization-3.1</code>',
'diar_flow' => 'Slik fungerer det:',
'diar_f1' => 'Lyden transkriberes først av hvilken motor som er valgt.',
'diar_f2' => 'pyannote.audio behandler lyden uavhengig for å oppdage talerturgrenser.',
'diar_f3' => 'Whispers ordnivå-tidsstempler (når tilgjengelig) eller segmenttidsstempler justeres med diariseringsutdataene.',
'diar_f4' => 'Hver linje merkes deretter på nytt med taler-identiteten: TALER 1, TALER 2 osv.',
'diar_count' => 'Talerantall: hvis du oppgir et tall, sendes det som <code>num_speakers</code> til diariseringspipelinen. Hvis det er tomt, bruker pyannote sin standard klyngealgoritme for å estimere antall talere.',
'diar_limit' => 'Maksimum: 20 talere. Ytelsen forringes over 68 talere i ett enkelt opptak.',
'vocab_title' => 'Ordforråd-injeksjon',
'vocab_intro' => 'Ordforrådsforhåndsinnstillingsmekanismen fungerer ved å legge domene-spesifikke termer til Whispers <code>initial_prompt</code>-parameter. Dette styrer modellens token-sannsynligheter mot det oppgitte ordforrådet før den behandler lyden.',
'vocab_limit' => 'Grense: kombinert forhåndsinnstilling + egendefinert prompt må være ≤ 500 tegn. Lengre prompter avkortes lydløst.',
'vocab_builtin' => 'Innebygde forhåndsinnstillinger lagres server-side som strenger og sammenslås med egendefinert tekst fra brukeren. Den endelige prompten sendes direkte til Whisper — den sendes ikke til en LLM og inkluderes ikke i transkripsjonsutdataene.',
'vocab_note' => 'Ordforråd-injeksjon påvirker bare Whisper-motoren. Azure Speech og Google Cloud bruker sin egen språkmodell og påvirkes ikke av denne parameteren.',
'cleanup_title' => 'Etterbehandling: AI-opprydding',
'cleanup_intro' => 'Det valgfrie AI-oppryddingspasset sender råtranskripsjonen til Azure OpenAI for korreksjon. Det transkriberer ikke lyden på nytt — det korrigerer tekstutdataene.',
'cleanup_prompt' => 'Systemprompt instruerer modellen om å: fikse ASR-gjenkjenningsfeil (homofonmer, feilhørte ord), normalisere tegnsetting og kapitalisering, korrigere norsk juridisk terminologi, bevare taler-etiketter og tidsstempler nøyaktig, og returnere den korrigerte transkripsjonen i samme format.',
'cleanup_mini' => 'GPT-4o mini: <code>gpt-4o-mini</code>-utrulling på Azure. Rask, lav kostnad. Best for rene opptak med mindre feil.',
'cleanup_full' => 'GPT-4o: <code>gpt-4o</code>-utrulling på Azure. Tregere, høyere kostnad. Best for støyete opptak eller kompleks domenevokabular.',
'cleanup_privacy' => 'Transkripssjonsteksten sendes til Azure OpenAI for dette trinnet. Hvis du velger å ikke kjøre opprydding, forlater transkripsjonen aldri servermiljøet.',
'lang_title' => 'Språkstøtte',
'lang_intro' => 'Følgende språk er eksplisitt støttet. Andre språk kan fungere via Whispers flerspråklige modell, men er ikke testet eller optimalisert.',
'lang_table_lang' => 'Språk',
'lang_table_engine' => 'Primærmotor',
'lang_table_notes' => 'Notater',
'lang_nb' => 'Norsk bokmål',
'lang_nb_engine' => 'Azure Speech (nb-NO)',
'lang_nb_notes' => 'Beste nøyaktighet. Dedikert norsk akustisk modell.',
'lang_nn' => 'Norsk nynorsk',
'lang_nn_engine' => 'Azure Speech (nn-NO)',
'lang_nn_notes' => 'Azure har en dedikert nn-NO-modell. Whisper-reserve er også sterk.',
'lang_en' => 'Engelsk',
'lang_en_engine' => 'Azure Speech (en-*)',
'lang_en_notes' => 'Utmerket nøyaktighet. Flere regionale lokaliteter tilgjengelig.',
'lang_pl' => 'Polsk',
'lang_pl_engine' => 'Azure Speech (pl-PL)',
'lang_pl_notes' => 'God nøyaktighet. Whisper er også sterk for polsk.',
'lang_uk' => 'Ukrainsk',
'lang_uk_engine' => 'Google Cloud (uk-UA)',
'lang_uk_notes' => 'Azure begrenset støtte; Google Cloud Chirp og Whisper begge sterke.',
'lang_sv' => 'Svensk',
'lang_sv_engine' => 'Azure Speech (sv-SE)',
'lang_sv_notes' => 'God nøyaktighet. Nært beslektet med norsk — lett å forveksle ved auto-deteksjon.',
'lang_da' => 'Dansk',
'lang_da_engine' => 'Azure Speech (da-DK)',
'lang_da_notes' => 'God nøyaktighet.',
'lang_de' => 'Tysk',
'lang_de_engine' => 'Azure Speech (de-DE)',
'lang_de_notes' => 'Utmerket nøyaktighet.',
'lang_fr' => 'Fransk',
'lang_fr_engine' => 'Azure Speech (fr-FR)',
'lang_fr_notes' => 'God nøyaktighet.',
'priv_title' => 'Personvern og datahåndtering',
'priv_1' => 'Lydfiler lastes direkte opp til transkripssjonsserveren og behandles i minnet. Det rå binære lagres ikke på disk.',
'priv_2' => 'Når Azure Speech eller Google Cloud brukes, sendes lydstrømmen til respektive sky-API over HTTPS. Lyd lagres ikke av disse tilbyderne utover varigheten av API-kallet (per standardvilkår).',
'priv_3' => 'Når Whisper brukes, behandles lyd på ocelot GPU-serveren (SimplePod privat sky, EU). Ingen tredjeparts sky-API-kall foretas.',
'priv_4' => 'Hvis det valgfrie AI-oppryddingspasset er aktivert, sendes transkripsjonsteksten (ikke lyd) til Azure OpenAI.',
'priv_5' => 'Transkripsjonen i seg selv beholdes ikke på serveren med mindre du eksplisitt velger å lagre den. Du kan lagre i Min Sak, i korpuset ditt, laste ned som fil, eller kopiere til utklippstavlen — ingenting lagres ellers.',
),
'uk' =>
array (
'nav_about' => 'Про інструмент',
'nav_guide' => 'Посібник користувача',
'nav_howit' => 'Як це працює',
'nav_opentool' => '← Відкрити інструмент',
'nav_signin' => 'Увійти',
'nav_open' => 'Відкрити Транскрипцію →',
'hero_kicker' => 'Технічна документація · Транскрипція',
'hero_title' => 'Як Транскрипція працює під капотом.',
'hero_sub' => 'Каскад трьох систем, GPU-прискорений Whisper, діаризація pyannote.audio та необов'язкове очищення GPT-4o все в одному конвеєрі.',
'stat_engines' => 'систем у каскаді',
'stat_latency' => 'сер. затримка (large-v3)',
'stat_wer' => 'WER для норвезької (Azure)',
'stat_speakers' => 'макс. мовців діаризації',
'toc_title' => 'Зміст',
'toc_1' => 'Огляд архітектури',
'toc_2' => 'Система 1: Azure Batch Speech',
'toc_3' => 'Система 2: Google Cloud Speech-to-Text v2',
'toc_4' => 'Система 3: Whisper GPU (large-v3)',
'toc_5' => 'Діаризація мовців',
'toc_6' => 'Ін'єкція словника',
'toc_7' => 'Постобробка: очищення AI',
'toc_8' => 'Підтримка мов',
'toc_9' => 'Конфіденційність та обробка даних',
'arch_title' => 'Огляд архітектури',
'arch_intro' => 'Транскрипція використовує каскад з трьох систем. Кожна система випробовується в порядку пріоритету; якщо основна система недоступна або повертає помилку, конвеєр автоматично переходить до наступної. Це означає, що транскрипція виробляється навіть під час збоїв хмарних сервісів.',
'arch_cascade_label' => 'Каскад систем',
'arch_e1' => 'Azure Batch Speech',
'arch_e1_sub' => 'Пріоритет · Хмара · Оптимізовано для норвезької',
'arch_e2' => 'Google Cloud Speech-to-Text v2',
'arch_e2_sub' => 'Резерв · Хмара · Широка підтримка мов',
'arch_e3' => 'Whisper large-v3 (GPU)',
'arch_e3_sub' => 'Кінцевий резерв · On-premise GPU · Завжди доступний',
'arch_post1' => 'Діаризація мовців (pyannote.audio)',
'arch_post1_sub' => 'Необов'язково · Виконується на GPU-сервері після транскрипції',
'arch_post2' => 'Очищення AI (GPT-4o mini / GPT-4o)',
'arch_post2_sub' => 'Необов'язково · Azure OpenAI · Виправлення помилок + термінологія',
'e1_title' => 'Система 1: Azure Batch Speech',
'e1_intro' => 'Azure Cognitive Services Speech-to-Text (Batch Transcription API) — основна система. Це найточніший варіант для норвезької і використовується для всіх виробничих транскрипцій, коли доступний.',
'e1_model' => 'Модель: локаль <code>nb-NO</code> з власною акустичною моделлю. Повертається до моделі, що відповідає локалі, для інших мов.',
'e1_latency' => 'Затримка: як правило 0,5–2× реального часу для аудіо до 200 МБ.',
'e1_format' => 'Прийняті формати: всі формати, що приймаються Azure (MP3, WAV, OGG, M4A, FLAC, WEBM — конвертуються на стороні сервера за потреби).',
'e1_auth' => 'Аутентифікація: керована ідентичність + ключ підписки, збережений у змінних середовища сервера.',
'e2_title' => 'Система 2: Google Cloud Speech-to-Text v2',
'e2_intro' => 'Google Cloud Speech-to-Text v2 (модель Chirp) — друга система в каскаді. Активується автоматично, якщо Azure повертає помилку або недоступний.',
'e2_model' => 'Модель: <code>chirp</code> — остання велика ASR-модель Google, потужна багатомовна підтримка, включаючи норвезьку, польську та українську.',
'e2_latency' => 'Затримка: порівнянна з Azure для більшості розмірів файлів.',
'e2_format' => 'Обробка форматів: аудіо перекодується у FLAC перед відправкою за потреби.',
'e3_title' => 'Система 3: Whisper GPU (large-v3)',
'e3_intro' => 'OpenAI Whisper large-v3 працює на виділеному GPU-сервері (ocelot — SimplePod RTX 3060 12 ГБ за адресою 194.93.49.14:20004). Завжди доступний як кінцевий резерв і ніколи не має збоїв сервісу.',
'e3_model' => 'Модель за замовчуванням: <code>large-v3</code>. Можна перемкнути на large-v2, medium, small, base або tiny в Розширених параметрах.',
'e3_vocab' => 'Ін'єкція словника: параметр <code>initial_prompt</code> використовується для підготовки Whisper з предметно-специфічними термінами перед початком транскрипції. Це нативний механізм Whisper підказка не включається у вивід.',
'e3_vad' => 'Фільтр VAD: коли увімкнено, параметр <code>vad_filter=True</code> використовує Silero VAD для видалення тиші та немовних сегментів перед обробкою.',
'e3_latency' => 'Затримка: приблизно 24× реального часу на RTX 3060. large-v3 на годинному записі займає приблизно 1530 хвилин.',
'e3_note' => 'Whisper працює офлайн аудіо ніколи не покидає GPU-сервер ocelot, коли використовується ця система. Хмарні API-виклики не виконуються.',
'diar_title' => 'Діаризація мовців',
'diar_intro' => 'Діаризація мовців призначає кожен сегмент транскрипції мовцю. Транскрипція використовує <strong>pyannote.audio</strong>, бібліотеку Python з відкритим кодом, що працює як сервіс на тому ж GPU-сервері, що й Whisper.',
'diar_pipeline' => 'Конвеєр: <code>pyannote/speaker-diarization-3.1</code>',
'diar_flow' => 'Як це працює:',
'diar_f1' => 'Аудіо спочатку транскрибується обраною системою.',
'diar_f2' => 'pyannote.audio обробляє аудіо незалежно для виявлення меж зміни мовця.',
'diar_f3' => 'Мітки часу на рівні слова від Whisper (де доступні) або мітки сегментів вирівнюються з виводом діаризації.',
'diar_f4' => 'Кожен рядок потім перемічається ідентичністю мовця: МОВЕЦЬ 1, МОВЕЦЬ 2 тощо.',
'diar_count' => 'Кількість мовців: якщо ви вказуєте число, воно передається як <code>num_speakers</code> до конвеєра діаризації. Якщо залишити пустим, pyannote використовує алгоритм кластеризації за замовчуванням для оцінки кількості мовців.',
'diar_limit' => 'Максимум: 20 мовців. Продуктивність знижується при понад 68 мовцях в одному записі.',
'vocab_title' => 'Ін'єкція словника',
'vocab_intro' => 'Механізм словникових пресетів працює шляхом додавання предметно-специфічних термінів до параметра <code>initial_prompt</code> Whisper. Це спрямовує ймовірності токенів моделі до наданого словника перед обробкою аудіо.',
'vocab_limit' => 'Ліміт: комбінований пресет + власна підказка повинні бути ≤ 500 символів. Довші підказки тихо скорочуються.',
'vocab_builtin' => 'Вбудовані пресети зберігаються на стороні сервера як рядки та об'єднуються з будь-яким власним текстом від користувача. Кінцева підказка передається безпосередньо до Whisper вона не надсилається до LLM і не включається у вивід транскрипції.',
'vocab_note' => 'Ін'єкція словника впливає тільки на систему Whisper. Azure Speech і Google Cloud використовують власну мовну модель і не піддаються впливу цього параметра.',
'cleanup_title' => 'Постобробка: очищення AI',
'cleanup_intro' => 'Необов'язковий прохід очищення AI надсилає необроблену транскрипцію до Azure OpenAI для виправлення. Він не перетранскрибує аудіо він виправляє текстовий вивід.',
'cleanup_prompt' => 'Системна підказка інструктує модель: виправляти помилки розпізнавання ASR (омоніми, неправильно почуті слова), нормалізувати пунктуацію та капіталізацію, виправляти норвезьку юридичну термінологію, зберігати мітки мовців і мітки часу точно, та повертати виправлену транскрипцію в тому ж форматі.',
'cleanup_mini' => 'GPT-4o mini: розгортання <code>gpt-4o-mini</code> на Azure. Швидкий, низька вартість. Найкращий для чистих записів з незначними помилками.',
'cleanup_full' => 'GPT-4o: розгортання <code>gpt-4o</code> на Azure. Повільніший, вища вартість. Найкращий для зашумлених записів або складної термінології.',
'cleanup_privacy' => 'Текст транскрипції надсилається до Azure OpenAI для цього кроку. Якщо ви вирішите не запускати очищення, транскрипція ніколи не покидає серверне середовище.',
'lang_title' => 'Підтримка мов',
'lang_intro' => 'Наступні мови підтримуються явно. Інші мови можуть працювати через багатомовну модель Whisper, але не тестуються та не оптимізуються.',
'lang_table_lang' => 'Мова',
'lang_table_engine' => 'Основна система',
'lang_table_notes' => 'Примітки',
'lang_nb' => 'Норвезька букмол',
'lang_nb_engine' => 'Azure Speech (nb-NO)',
'lang_nb_notes' => 'Найкраща точність. Виділена норвезька акустична модель.',
'lang_nn' => 'Норвезька нюношк',
'lang_nn_engine' => 'Azure Speech (nn-NO)',
'lang_nn_notes' => 'Azure має виділену модель nn-NO. Резерв Whisper також потужний.',
'lang_en' => 'Англійська',
'lang_en_engine' => 'Azure Speech (en-*)',
'lang_en_notes' => 'Відмінна точність. Доступно кілька регіональних локалей.',
'lang_pl' => 'Польська',
'lang_pl_engine' => 'Azure Speech (pl-PL)',
'lang_pl_notes' => 'Хороша точність. Whisper також потужний для польської.',
'lang_uk' => 'Українська',
'lang_uk_engine' => 'Google Cloud (uk-UA)',
'lang_uk_notes' => 'Обмежена підтримка Azure; Google Cloud Chirp і Whisper обидва потужні.',
'lang_sv' => 'Шведська',
'lang_sv_engine' => 'Azure Speech (sv-SE)',
'lang_sv_notes' => 'Хороша точність. Тісно пов'язана з норвезькою — легко плутати при автовизначенні.',
'lang_da' => 'Данська',
'lang_da_engine' => 'Azure Speech (da-DK)',
'lang_da_notes' => 'Хороша точність.',
'lang_de' => 'Німецька',
'lang_de_engine' => 'Azure Speech (de-DE)',
'lang_de_notes' => 'Відмінна точність.',
'lang_fr' => 'Французька',
'lang_fr_engine' => 'Azure Speech (fr-FR)',
'lang_fr_notes' => 'Хороша точність.',
'priv_title' => 'Конфіденційність та обробка даних',
'priv_1' => 'Аудіофайли завантажуються безпосередньо на сервер транскрипції та обробляються в пам'яті. Необроблені бінарні дані не записуються на диск.',
'priv_2' => 'При використанні Azure Speech або Google Cloud аудіопотік надсилається до відповідного хмарного API через HTTPS. Аудіо не зберігається цими постачальниками поза тривалістю API-виклику (згідно зі стандартними умовами).',
'priv_3' => 'При використанні Whisper аудіо обробляється на GPU-сервері ocelot (приватна хмара SimplePod, ЄС). Хмарні API-виклики третіх сторін не виконуються.',
'priv_4' => 'Якщо увімкнено необов'язковий прохід очищення AI, текст транскрипції (не аудіо) надсилається до Azure OpenAI.',
'priv_5' => 'Сама транскрипція не зберігається на сервері, якщо ви явно не вирішите її зберегти. Ви можете зберегти до Min Sak, до корпусу, завантажити як файл або скопіювати в буфер обміну — в іншому випадку нічого не зберігається.',
),
'pl' =>
array (
'nav_about' => 'O narzędziu',
'nav_guide' => 'Przewodnik użytkownika',
'nav_howit' => 'Jak to działa',
'nav_opentool' => '← Otwórz narzędzie',
'nav_signin' => 'Zaloguj się',
'nav_open' => 'Otwórz Transkrypcję →',
'hero_kicker' => 'Dokumentacja techniczna · Transkrypcja',
'hero_title' => 'Jak Transkrypcja działa pod maską.',
'hero_sub' => 'Kaskada trzech silników, Whisper przyspieszony przez GPU, diaryzacja pyannote.audio i opcjonalne czyszczenie GPT-4o — wszystko w jednym potoku.',
'stat_engines' => 'silniki w kaskadzie',
'stat_latency' => 'śr. opóźnienie (large-v3)',
'stat_wer' => 'WER dla norweskiego (Azure)',
'stat_speakers' => 'maks. mówców diaryzacji',
'toc_title' => 'Spis treści',
'toc_1' => 'Przegląd architektury',
'toc_2' => 'Silnik 1: Azure Batch Speech',
'toc_3' => 'Silnik 2: Google Cloud Speech-to-Text v2',
'toc_4' => 'Silnik 3: Whisper GPU (large-v3)',
'toc_5' => 'Diaryzacja mówców',
'toc_6' => 'Iniekcja słownika',
'toc_7' => 'Postprzetwarzanie: czyszczenie AI',
'toc_8' => 'Obsługa języków',
'toc_9' => 'Prywatność i obsługa danych',
'arch_title' => 'Przegląd architektury',
'arch_intro' => 'Transkrypcja używa kaskady trzech silników. Każdy silnik jest próbowany w kolejności priorytetu; jeśli podstawowy silnik jest niedostępny lub zwraca błąd, potok automatycznie przechodzi do następnego. Oznacza to, że transkrypcja jest produkowana nawet podczas awarii usług chmurowych.',
'arch_cascade_label' => 'Kaskada silników',
'arch_e1' => 'Azure Batch Speech',
'arch_e1_sub' => 'Priorytet · Chmura · Zoptymalizowany dla języka norweskiego',
'arch_e2' => 'Google Cloud Speech-to-Text v2',
'arch_e2_sub' => 'Rezerwa · Chmura · Szeroka obsługa języków',
'arch_e3' => 'Whisper large-v3 (GPU)',
'arch_e3_sub' => 'Ostatnia rezerwa · On-premise GPU · Zawsze dostępny',
'arch_post1' => 'Diaryzacja mówców (pyannote.audio)',
'arch_post1_sub' => 'Opcjonalnie · Działa na serwerze GPU po transkrypcji',
'arch_post2' => 'Czyszczenie AI (GPT-4o mini / GPT-4o)',
'arch_post2_sub' => 'Opcjonalnie · Azure OpenAI · Korekcja błędów + terminologia',
'e1_title' => 'Silnik 1: Azure Batch Speech',
'e1_intro' => 'Azure Cognitive Services Speech-to-Text (Batch Transcription API) to podstawowy silnik. Jest to najdokładniejsza opcja dla języka norweskiego i jest używana dla wszystkich produkcyjnych transkrypcji gdy jest dostępna.',
'e1_model' => 'Model: locale <code>nb-NO</code> z własnym modelem akustycznym. Powraca do modelu dopasowanego do locale dla innych języków.',
'e1_latency' => 'Opóźnienie: zazwyczaj 0,52× czasu rzeczywistego dla nagrań do 200 MB.',
'e1_format' => 'Akceptowane formaty: wszystkie formaty akceptowane przez Azure (MP3, WAV, OGG, M4A, FLAC, WEBM — konwertowane po stronie serwera w razie potrzeby).',
'e1_auth' => 'Uwierzytelnianie: zarządzana tożsamość + klucz subskrypcji przechowywany w zmiennych środowiskowych serwera.',
'e2_title' => 'Silnik 2: Google Cloud Speech-to-Text v2',
'e2_intro' => 'Google Cloud Speech-to-Text v2 (model Chirp) to drugi silnik w kaskadzie. Aktywuje się automatycznie jeśli Azure zwraca błąd lub jest niedostępny.',
'e2_model' => 'Model: <code>chirp</code> — najnowszy duży model ASR Google, silna wielojęzyczna obsługa w tym norweskiego, polskiego i ukraińskiego.',
'e2_latency' => 'Opóźnienie: porównywalne z Azure dla większości rozmiarów plików.',
'e2_format' => 'Obsługa formatów: audio jest re-kodowane do FLAC przed wysłaniem jeśli potrzeba.',
'e3_title' => 'Silnik 3: Whisper GPU (large-v3)',
'e3_intro' => 'OpenAI Whisper large-v3 działa na dedykowanym serwerze GPU (ocelot — SimplePod RTX 3060 12 GB pod adresem 194.93.49.14:20004). Zawsze dostępny jako ostatnia rezerwa i nigdy nie ma awarii usługi.',
'e3_model' => 'Domyślny model: <code>large-v3</code>. Można przełączyć na large-v2, medium, small, base lub tiny w Opcjach zaawansowanych.',
'e3_vocab' => 'Iniekcja słownika: parametr <code>initial_prompt</code> jest używany do przygotowania Whispera z terminami specjalistycznymi przed rozpoczęciem transkrypcji. To natywny mechanizm Whispera — podpowiedź nie jest uwzględniana w wynikach.',
'e3_vad' => 'Filtr VAD: gdy włączony, parametr <code>vad_filter=True</code> używa Silero VAD do usunięcia ciszy i segmentów bez mowy przed przetwarzaniem.',
'e3_latency' => 'Opóźnienie: około 24× czasu rzeczywistego na RTX 3060. large-v3 na godzinnym nagraniu zajmuje około 1530 minut.',
'e3_note' => 'Whisper działa offline — audio nigdy nie opuszcza serwera GPU ocelot gdy używany jest ten silnik. Żadne wywołania chmurowych API nie są wykonywane.',
'diar_title' => 'Diaryzacja mówców',
'diar_intro' => 'Diaryzacja mówców przypisuje każdy segment transkrypcji do mówcy. Transkrypcja używa <strong>pyannote.audio</strong>, biblioteki Python o otwartym kodzie, działającej jako usługa na tym samym serwerze GPU co Whisper.',
'diar_pipeline' => 'Potok: <code>pyannote/speaker-diarization-3.1</code>',
'diar_flow' => 'Jak to działa:',
'diar_f1' => 'Audio jest najpierw transkrybowane przez wybrany silnik.',
'diar_f2' => 'pyannote.audio przetwarza audio niezależnie, aby wykryć granice zmian mówców.',
'diar_f3' => 'Znaczniki czasu na poziomie słów od Whispera (gdzie dostępne) lub znaczniki segmentów są wyrównywane z wynikami diaryzacji.',
'diar_f4' => 'Każda linia jest następnie ponownie oznaczana tożsamością mówcy: MÓWCA 1, MÓWCA 2 itp.',
'diar_count' => 'Liczba mówców: jeśli podasz liczbę, jest przekazywana jako <code>num_speakers</code> do potoku diaryzacji. Jeśli pozostawione puste, pyannote używa domyślnego algorytmu klasteryzacji do oszacowania liczby mówców.',
'diar_limit' => 'Maksimum: 20 mówców. Wydajność spada powyżej 68 mówców w jednym nagraniu.',
'vocab_title' => 'Iniekcja słownika',
'vocab_intro' => 'Mechanizm predefiniowanych słowników działa poprzez dodanie specjalistycznych terminów do parametru <code>initial_prompt</code> Whispera. Kieruje to prawdopodobieństwami tokenów modelu w stronę dostarczonego słownictwa przed przetwarzaniem audio.',
'vocab_limit' => 'Limit: kombinacja predefiniowanego + własnego podpowiedzi musi być ≤ 500 znaków. Dłuższe podpowiedzi są cicho obcinane.',
'vocab_builtin' => 'Wbudowane predefiniowane ustawienia są przechowywane po stronie serwera jako ciągi znaków i łączone z dowolnym własnym tekstem wprowadzonym przez użytkownika. Końcowa podpowiedź jest przekazywana bezpośrednio do Whispera — nie jest wysyłana do LLM i nie jest uwzględniana w wynikach transkrypcji.',
'vocab_note' => 'Iniekcja słownika wpływa tylko na silnik Whisper. Azure Speech i Google Cloud używają własnego modelu językowego i nie są pod wpływem tego parametru.',
'cleanup_title' => 'Postprzetwarzanie: czyszczenie AI',
'cleanup_intro' => 'Opcjonalne przejście czyszczenia AI wysyła surową transkrypcję do Azure OpenAI w celu korekty. Nie transkrybuje ponownie audio — poprawia wynik tekstowy.',
'cleanup_prompt' => 'Podpowiedź systemowa instruuje model: poprawiać błędy rozpoznawania ASR (homofony, błędnie usłyszane słowa), normalizować interpunkcję i kapitalizację, korygować norweską terminologię prawną, zachowywać etykiety mówców i znaczniki czasu dokładnie oraz zwracać poprawioną transkrypcję w tym samym formacie.',
'cleanup_mini' => 'GPT-4o mini: wdrożenie <code>gpt-4o-mini</code> na Azure. Szybki, niski koszt. Najlepszy do czystych nagrań z drobnymi błędami.',
'cleanup_full' => 'GPT-4o: wdrożenie <code>gpt-4o</code> na Azure. Wolniejszy, wyższy koszt. Najlepszy do zaszumionych nagrań lub złożonej terminologii.',
'cleanup_privacy' => 'Tekst transkrypcji jest wysyłany do Azure OpenAI w tym kroku. Jeśli zdecydujesz się nie uruchamiać czyszczenia, transkrypcja nigdy nie opuszcza środowiska serwerowego.',
'lang_title' => 'Obsługa języków',
'lang_intro' => 'Następujące języki są jawnie obsługiwane. Inne języki mogą działać przez wielojęzyczny model Whispera, ale nie są testowane ani optymalizowane.',
'lang_table_lang' => 'Język',
'lang_table_engine' => 'Podstawowy silnik',
'lang_table_notes' => 'Uwagi',
'lang_nb' => 'Norweski Bokmål',
'lang_nb_engine' => 'Azure Speech (nb-NO)',
'lang_nb_notes' => 'Najlepsza dokładność. Dedykowany norweski model akustyczny.',
'lang_nn' => 'Norweski Nynorsk',
'lang_nn_engine' => 'Azure Speech (nn-NO)',
'lang_nn_notes' => 'Azure ma dedykowany model nn-NO. Rezerwa Whisper również silna.',
'lang_en' => 'Angielski',
'lang_en_engine' => 'Azure Speech (en-*)',
'lang_en_notes' => 'Doskonała dokładność. Dostępnych kilka regionalnych locale.',
'lang_pl' => 'Polski',
'lang_pl_engine' => 'Azure Speech (pl-PL)',
'lang_pl_notes' => 'Dobra dokładność. Whisper również silny dla polskiego.',
'lang_uk' => 'Ukraiński',
'lang_uk_engine' => 'Google Cloud (uk-UA)',
'lang_uk_notes' => 'Ograniczone wsparcie Azure; Google Cloud Chirp i Whisper obydwa silne.',
'lang_sv' => 'Szwedzki',
'lang_sv_engine' => 'Azure Speech (sv-SE)',
'lang_sv_notes' => 'Dobra dokładność. Ściśle spokrewniony z norweskim — łatwo pomylić przy automatycznym wykrywaniu.',
'lang_da' => 'Duński',
'lang_da_engine' => 'Azure Speech (da-DK)',
'lang_da_notes' => 'Dobra dokładność.',
'lang_de' => 'Niemiecki',
'lang_de_engine' => 'Azure Speech (de-DE)',
'lang_de_notes' => 'Doskonała dokładność.',
'lang_fr' => 'Francuski',
'lang_fr_engine' => 'Azure Speech (fr-FR)',
'lang_fr_notes' => 'Dobra dokładność.',
'priv_title' => 'Prywatność i obsługa danych',
'priv_1' => 'Pliki audio są przesyłane bezpośrednio na serwer transkrypcji i przetwarzane w pamięci. Surowe dane binarne nie są zapisywane na dysku.',
'priv_2' => 'Gdy używany jest Azure Speech lub Google Cloud, strumień audio jest wysyłany do odpowiedniego chmurowego API przez HTTPS. Audio nie jest przechowywane przez tych dostawców poza czasem trwania wywołania API (zgodnie ze standardowymi warunkami).',
'priv_3' => 'Gdy używany jest Whisper, audio jest przetwarzane na serwerze GPU ocelot (prywatna chmura SimplePod, UE). Żadne zewnętrzne wywołania chmurowych API nie są wykonywane.',
'priv_4' => 'Jeśli opcjonalne przejście czyszczenia AI jest włączone, tekst transkrypcji (nie audio) jest wysyłany do Azure OpenAI.',
'priv_5' => 'Sama transkrypcja nie jest zachowywana na serwerze, chyba że wyraźnie zdecydujesz się ją zapisać. Możesz zapisać do Min Sak, do korpusu, pobrać jako plik lub skopiować do schowka — w przeciwnym razie nic nie jest przechowywane.',
),
);