From 06baea346a631fbcaa1bb4e918987987cc28fdf5 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 22 Oct 2026 09:13:27 +0300 Subject: [PATCH] Chinese pages for Volume Booster, Text to Speech, Audio Joiner, Audio Compressor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - scripts/build_zh.py builds /zh// from the English page with a translation table per page (stops if an English string changed, lists any English left); adds hreflang and the 中文/EN switch on both versions; puts the Chinese navigation and footer, with links to Chinese pages where they exist, on every Chinese page including the hand-made /zh/ and /zh/converter/. - og/zh-*.png previews; sitemap (4 URLs), llms.txt, README, changelog. - Helper and "continue with this file" link to the Chinese tools on Chinese pages; audio-export.js says "正在编码 MP3…" there. - Text to Speech (both languages): voices that run online (localService false, e.g. Chrome's "Google" voices) are marked, and the copy no longer claims the text never leaves the device; the Chinese page starts on Chinese voices and shows language names in the page's language. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016rsS6JgzjZXLy17J1cgACN --- README.md | 3 +- assistant.js | 11 +- audio-compressor/index.html | 6 +- audio-export.js | 2 +- audio-joiner/index.html | 4 + changelog/index.html | 2 + converter/index.html | 6 +- llms.txt | 4 +- og/zh-audio-compressor.png | Bin 0 -> 18218 bytes og/zh-audio-joiner.png | Bin 0 -> 16880 bytes og/zh-text-to-speech.png | Bin 0 -> 15224 bytes og/zh-volume-booster.png | Bin 0 -> 17739 bytes scripts/build_zh.py | 390 ++++++++++++++++++++++++++++ sitemap.xml | 26 +- text-to-speech/index.html | 22 +- volume-booster/index.html | 4 + zh/audio-compressor/index.html | 448 +++++++++++++++++++++++++++++++++ zh/audio-joiner/index.html | 387 ++++++++++++++++++++++++++++ zh/converter/index.html | 6 +- zh/index.html | 16 +- zh/text-to-speech/index.html | 393 +++++++++++++++++++++++++++++ zh/volume-booster/index.html | 442 ++++++++++++++++++++++++++++++++ 22 files changed, 2139 insertions(+), 33 deletions(-) create mode 100644 og/zh-audio-compressor.png create mode 100644 og/zh-audio-joiner.png create mode 100644 og/zh-text-to-speech.png create mode 100644 og/zh-volume-booster.png create mode 100644 scripts/build_zh.py create mode 100644 zh/audio-compressor/index.html create mode 100644 zh/audio-joiner/index.html create mode 100644 zh/text-to-speech/index.html create mode 100644 zh/volume-booster/index.html diff --git a/README.md b/README.md index b64547d..60bc180 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Privacy-first audio tools that run entirely in your browser. No uploads, no acco | **Audio Joiner** | [/audio-joiner/](https://audiotools.dev/audio-joiner/) | Web Audio API, crossfade | | **Audio Compressor** | [/audio-compressor/](https://audiotools.dev/audio-compressor/) | Web Audio API + Mediabunny MP3 | -Chinese pages: [/zh/](https://audiotools.dev/zh/) and [/zh/converter/](https://audiotools.dev/zh/converter/). +Chinese pages: [/zh/](https://audiotools.dev/zh/), [/zh/converter/](https://audiotools.dev/zh/converter/), and /zh/ versions of Volume Booster, Text to Speech, Audio Joiner and Audio Compressor. ## Architecture @@ -57,6 +57,7 @@ audiotools.dev/ - `python3 scripts/seo_sync.py` rewrites the FAQPage JSON-LD on every page from the FAQ that is visible on that page, and refreshes `` in `sitemap.xml` from git. Run it after editing a FAQ or a page (needs `beautifulsoup4`). - CI (`.github/workflows/seo-check.yml`) runs `scripts/seo_sync.py --check` and fails if the markup and the visible FAQ drift apart. +- `python3 scripts/build_zh.py` rebuilds the Chinese tool pages (volume booster, text to speech, joiner, compressor) from the English ones with the translation tables in the script, and keeps hreflang, the 中文/EN switch and the Chinese navigation in step. It stops if an English string it translates has changed. Run `scripts/seo_sync.py` after it. - Social preview images live in `og/` (1200×630, one per tool). ## Deployment diff --git a/assistant.js b/assistant.js index afad3d4..3c80942 100644 --- a/assistant.js +++ b/assistant.js @@ -137,6 +137,7 @@ const takePending = () => store('readwrite', (s) => { const g = s.get('pending'); s.delete('pending'); return g; }); // ---------- tool pages: "continue with this file" after a result ---------- + const ZH_PAGES = ['converter', 'volume-booster', 'text-to-speech', 'audio-joiner', 'audio-compressor']; // tools with a Chinese page const NEXT = [['audio-compressor', 'Compress', '压缩'], ['audio-trimmer', 'Trim', '剪辑'], ['volume-booster', 'Boost volume', '增强音量'], ['converter', 'Convert format', '转换格式'], ['audio-speed-changer', 'Change speed', '变速'], ['audio-joiner', 'Join with more', '合并']]; window.offerNext = function (tool, anchor, file) { @@ -148,7 +149,7 @@ el.append(T('Continue with this file:', '继续处理此文件:')); NEXT.filter(([t]) => t !== tool).slice(0, 3).forEach(([t, en, zh]) => { const a = document.createElement('a'); - a.href = t === 'converter' && ZH ? '/zh/converter/' : '/' + t + '/'; + a.href = (ZH && ZH_PAGES.includes(t) ? '/zh/' : '/') + t + '/'; a.textContent = T(en, zh); a.addEventListener('click', async (e) => { e.preventDefault(); @@ -185,16 +186,16 @@ 'converter': { url: ZH ? '/zh/converter/' : '/converter/', name: T('Audio Converter', '音频转换器'), kw: ['convert', 'format', 'mp3', 'wav', 'flac', 'ogg', 'm4a', 'aac', 'webm', 'mp4', 'video', 'extract audio', 'конверт', 'формат', 'преобраз', 'видео', '转换', '格式', '视频', '提取音频'] }, - 'audio-compressor': { url: '/audio-compressor/', name: T('Audio Compressor', '音频压缩'), + 'audio-compressor': { url: ZH ? '/zh/audio-compressor/' : '/audio-compressor/', name: T('Audio Compressor', '音频压缩'), kw: ['compress', 'smaller', 'reduce', 'file size', 'shrink', 'bitrate', 'email', 'telegram', 'whatsapp', 'сжать', 'уменьш', 'размер', 'меньше', 'битрейт', '压缩', '变小', '缩小', '大小', '体积'] }, - 'volume-booster': { url: '/volume-booster/', name: T('Volume Booster', '音量增强'), + 'volume-booster': { url: ZH ? '/zh/volume-booster/' : '/volume-booster/', name: T('Volume Booster', '音量增强'), kw: ['quiet', 'louder', 'volume', 'boost', 'normalize', 'amplify', 'gain', 'тих', 'громк', 'громч', 'усил', 'нормализ', '音量', '声音太小', '太小声', '放大', '增强', '标准化'] }, 'audio-trimmer': { url: '/audio-trimmer/', name: T('Audio Trimmer', '音频剪辑'), kw: ['trim', 'cut', 'crop', 'shorten', 'ringtone', 'clip', 'remove the start', 'remove the end', 'обрез', 'обреж', 'вырез', 'отрез', 'отреж', 'рингтон', 'укорот', '剪辑', '裁剪', '剪切', '铃声', '截取'] }, - 'audio-joiner': { url: '/audio-joiner/', name: T('Audio Joiner', '音频合并'), + 'audio-joiner': { url: ZH ? '/zh/audio-joiner/' : '/audio-joiner/', name: T('Audio Joiner', '音频合并'), kw: ['join', 'merge', 'combine', 'concatenate', 'several files', 'multiple files', 'склеить', 'склей', 'объедин', 'соедин', 'несколько', '合并', '拼接', '连接', '多个'] }, 'audio-speed-changer': { url: '/audio-speed-changer/', name: T('Speed Changer', '音频变速'), @@ -203,7 +204,7 @@ 'voice-to-text': { url: '/voice-to-text/', name: T('Voice to Text', '语音转文字'), kw: ['transcri', 'to text', 'subtitle', 'speech to text', 'dictat', 'voice message', 'lecture', 'interview', 'расшифр', 'в текст', 'субтитр', 'голосов', 'лекци', 'диктов', '转文字', '转录', '字幕', '语音转', '听写'] }, - 'text-to-speech': { url: '/text-to-speech/', name: T('Text to Speech', '文字转语音'), + 'text-to-speech': { url: ZH ? '/zh/text-to-speech/' : '/text-to-speech/', name: T('Text to Speech', '文字转语音'), kw: ['text to speech', 'read aloud', 'tts', 'voice over', 'narrat', 'speak', 'озвуч', 'вслух', 'синтез речи', 'прочитать', '朗读', '配音', '文字转语音', '语音合成'] }, }; diff --git a/audio-compressor/index.html b/audio-compressor/index.html index da9b650..29aed3c 100644 --- a/audio-compressor/index.html +++ b/audio-compressor/index.html @@ -17,6 +17,9 @@ + + + @@ -142,6 +145,7 @@ Text to Speech Voice to Text All tools + 中文 @@ -225,7 +229,7 @@

Audio Compressor

Free Online Audio Compressor

Audio Compressor reduces the file size of your audio by re-encoding it to MP3 at a bitrate and sample rate you choose. Perfect for fitting audio into email attachments, messaging apps, or storage limits.

How It Works

-

Lossy MP3 compression removes inaudible data to shrink the file. A 44 MB WAV can become a 4 MB MP3 at 128 kbps — roughly a 10x reduction with minimal quality loss for most uses. Higher bitrates (256–320 kbps) preserve more detail for music. Everything runs in your browser via the Web Audio API and a JavaScript MP3 encoder — nothing is uploaded.

+

Lossy MP3 compression removes inaudible data to shrink the file. A 44 MB WAV can become a 4 MB MP3 at 128 kbps — roughly a 10x reduction with minimal quality loss for most uses. Higher bitrates (256–320 kbps) preserve more detail for music. Everything runs in your browser, with the LAME MP3 encoder compiled to WebAssembly — nothing is uploaded.

Choosing the Right Bitrate

64 kbps — voice recordings and podcasts (smallest files). 128 kbps — general purpose, good quality for most uses. 192 kbps — high quality for music. 320 kbps — maximum quality, indistinguishable from uncompressed for most listeners. Lowering the sample rate to 22 kHz or 16 kHz shrinks speech files further.

Need other edits? Try our Audio Converter, Audio Trimmer, Audio Joiner, or Volume Booster.

diff --git a/audio-export.js b/audio-export.js index 15fc49e..d6a5776 100644 --- a/audio-export.js +++ b/audio-export.js @@ -5,7 +5,7 @@ window.downloadAudio = async function (buffer, wavBlob, select, baseName, button) { const mp3 = select.value === 'mp3'; const label = button && button.textContent; - if (button) { button.disabled = true; if (mp3) button.textContent = 'Encoding MP3…'; } + if (button) { button.disabled = true; if (mp3) button.textContent = document.documentElement.lang.startsWith('zh') ? '正在编码 MP3…' : 'Encoding MP3…'; } try { const blob = mp3 ? await (await import('/media.js')).encodeBuffer(buffer, { format: 'mp3', bitrate: 192000 }) : wavBlob; const a = document.createElement('a'); diff --git a/audio-joiner/index.html b/audio-joiner/index.html index 36cee01..aa16135 100644 --- a/audio-joiner/index.html +++ b/audio-joiner/index.html @@ -17,6 +17,9 @@ + + + @@ -137,6 +140,7 @@ Text to Speech Voice to Text All tools + 中文 diff --git a/changelog/index.html b/changelog/index.html index 631f925..c050bc8 100644 --- a/changelog/index.html +++ b/changelog/index.html @@ -75,6 +75,8 @@

Changelog

    +
  • Chinese versions of Volume Booster, Text to Speech, Audio Joiner and Audio Compressor: /zh/volume-booster/, /zh/text-to-speech/, /zh/audio-joiner/, /zh/audio-compressor/.
  • +
  • Text to Speech marks online voices (for example Chrome's “Google” voices), which the browser vendor processes, so you can pick a voice that stays on your device.
  • Several files at once in the Audio Converter and the Audio Compressor: drop a batch, follow each file's progress, download them one by one or all as a ZIP.
  • Audio Converter saves M4A (AAC) and FLAC as well as MP3 and WAV, and takes video files (MP4, MOV, MKV, WebM) to pull out the sound.
  • The homepage helper understands settings: “compress to 10 MB”, “keep the first 30 seconds”, “1.5x faster”, “louder by 6 dB”, “convert to FLAC” (also in Russian and Chinese). It opens the tool with your file and those settings already in place.
  • diff --git a/converter/index.html b/converter/index.html index 5da1ee6..0ad751a 100644 --- a/converter/index.html +++ b/converter/index.html @@ -18,6 +18,9 @@ + + + @@ -32,9 +35,6 @@ - - - diff --git a/llms.txt b/llms.txt index c106112..755fc23 100644 --- a/llms.txt +++ b/llms.txt @@ -24,11 +24,11 @@ - [About AudioTools.dev](https://audiotools.dev/about/): who builds it, how files stay on the device (and how to verify it in DevTools), what the site loads from the network, and how it is built. - [Changelog](https://audiotools.dev/changelog/): dated list of everything that has shipped since January 2026. -- Chinese versions: [homepage](https://audiotools.dev/zh/), [audio converter](https://audiotools.dev/zh/converter/). +- Chinese versions: [homepage](https://audiotools.dev/zh/), [audio converter](https://audiotools.dev/zh/converter/), [volume booster](https://audiotools.dev/zh/volume-booster/), [text to speech](https://audiotools.dev/zh/text-to-speech/), [audio joiner](https://audiotools.dev/zh/audio-joiner/), [audio compressor](https://audiotools.dev/zh/audio-compressor/). ## Key Facts -- Privacy: all browser tools process audio locally. No files uploaded, audio is never collected. The site uses Google Analytics for anonymous page-view statistics only. +- Privacy: all browser tools process audio locally. No files uploaded, audio is never collected. The site uses Google Analytics (and Yandex Metrika on Voice to Text) for anonymous page-view statistics only. Text to Speech uses the browser's voices; voices marked “online” are processed by the browser vendor. - License: MIT. - Formats: reads WAV, MP3, FLAC, OGG, AAC, M4A, WebM and video (MP4, MOV, MKV); the converter saves MP3, M4A, WAV or FLAC, the other tools MP3 or WAV. - Works offline: Converter, Trimmer, Joiner, Volume Booster, Speed Changer, Compressor work without internet. diff --git a/og/zh-audio-compressor.png b/og/zh-audio-compressor.png new file mode 100644 index 0000000000000000000000000000000000000000..6b591fa0fe272d0adc8d50b6c350e0ec0a2f8104 GIT binary patch literal 18218 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≫Zj(5GB=Yjtv-0%H^(n-A%or^%#Fh&l( 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 bkNQ)yQWa8k=EMUJzhUrn^>bP0l+XkK3i*=E literal 0 HcmV?d00001 diff --git a/og/zh-audio-joiner.png b/og/zh-audio-joiner.png new file mode 100644 index 0000000000000000000000000000000000000000..699b5a87d38ffb38ada4af8e828d0a76e71ff165 GIT binary patch literal 16880 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 OqN%F)tW3rF&Hn?`?AKHP literal 0 HcmV?d00001 diff --git a/og/zh-text-to-speech.png b/og/zh-text-to-speech.png new file mode 100644 index 0000000000000000000000000000000000000000..3139f0a93df7fb196d99a745052a43cde3bab75f GIT binary patch literal 15224 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
    0?^5i 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/ is // with the same code and translated text. Every English string in a table below must +still be on the English page: if the English copy changes, the script stops and names the string to update, +so a Chinese page never silently falls behind. After building, the script lists any English text left on a +Chinese page. It also keeps the language links in step: hreflang and the 中文/EN switch on both versions, +and the Chinese navigation and footer on every Chinese page. + +The Chinese converter (/zh/converter/) and home page (/zh/) are maintained by hand; only their navigation, +footer and tool links are updated here. +""" +import re +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +SITE = 'https://audiotools.dev' +ZH_PAGES = ['converter', 'volume-booster', 'text-to-speech', 'audio-joiner', 'audio-compressor'] # tools with a Chinese page +BUILT = ['volume-booster', 'text-to-speech', 'audio-joiner', 'audio-compressor'] # built by this script + +ZH_HREF = lambda tool: f'/zh/{tool}/' if tool in ZH_PAGES else f'/{tool}/' + + +def zh_nav(current, en_href): + items = [('converter', '转换器'), ('volume-booster', '音量增强'), ('text-to-speech', '文字转语音'), ('voice-to-text', '语音转文字')] + links = [f'
    {name}' for t, name in items] + links.append(f'全部工具') + links.append(f'EN') + return '' + + +def zh_footer(current): + items = [('converter', '转换器'), ('voice-to-text', '语音转文字'), ('text-to-speech', '文字转语音'), ('audio-trimmer', '剪辑'), + ('audio-speed-changer', '变速'), ('volume-booster', '音量增强'), ('audio-joiner', '合并'), ('audio-compressor', '压缩')] + tools = ''.join(f'{name}' for t, name in items) + return f'''''' + + +def alternates(tool): + return (f' \n' + f' \n' + f' \n') + + +ALT_RE = re.compile(r' \n') +NAV_RE = re.compile(r'', re.S) +FOOTER_RE = re.compile(r'
    .*?
    ', re.S) +TOOL_HREF_RE = re.compile(r'href="/(' + '|'.join(ZH_PAGES) + r')/"') + + +def english_page(tool): + """Add hreflang and the 中文 switch to the English page (idempotent); return its HTML.""" + path = ROOT / tool / 'index.html' + s = path.read_text(encoding='utf-8') + s = ALT_RE.sub('', s) + s = re.sub(r'(\n)', lambda m: m.group(1) + alternates(tool), s, count=1) + s = re.sub(r'\s*]*>中文', '', s) + s = NAV_RE.sub(lambda m: m.group(0)[:-len('')].rstrip() + f'\n 中文\n ', s, count=1) + path.write_text(s, encoding='utf-8') + return s + + +def build(tool, table): + s = english_page(tool) + missing = [en for en, _ in table if en not in s] + if missing: + sys.exit(f'{tool}: the English page no longer contains:\n ' + '\n '.join(missing)) + table = table + [(en, zh) for en, zh in COMMON if en in s] # shared strings, where the page has them + for en, zh in sorted(table, key=lambda p: -len(p[0])): # longer strings first, so parts don't break them + s = s.replace(en, zh) + s = s.replace('', '', 1) + s = s.replace('aria-label="Main"', 'aria-label="主导航"', 1) + s = s.replace('', '') + s = s.replace(f'{SITE}/og/{tool}.png', f'{SITE}/og/zh-{tool}.png') + s = ALT_RE.sub('', s) + s = s.replace(f'{SITE}/{tool}/', f'{SITE}/zh/{tool}/') # canonical, og:url, JSON-LD url + s = re.sub(r'(\n)', lambda m: m.group(1) + alternates(tool), s, count=1) + s = re.sub(r'("@type":\s*"WebApplication",)(\s*)', lambda m: m.group(1) + m.group(2) + '"inLanguage": "zh-CN",' + (m.group(2) or ''), s, count=1) + s = TOOL_HREF_RE.sub(lambda m: f'href="/zh/{m.group(1)}/"', s) # links to tools that have a Chinese page + s = s.replace('href="/"', 'href="/zh/"') + s = NAV_RE.sub(lambda m: zh_nav(tool, f'/{tool}/'), s, count=1) + s = FOOTER_RE.sub(lambda m: zh_footer(tool), s, count=1) + out = ROOT / 'zh' / tool / 'index.html' + out.parent.mkdir(parents=True, exist_ok=True) + out.write_text(s, encoding='utf-8') + leftovers(out, s) + + +ALLOWED = {'AudioTools.dev', 'AudioTools', 'GitHub', 'DevToolKit.site', 'Boosty', 'Roman Gordienko', 'MP3', 'WAV', 'FLAC', 'OGG', + 'M4A', 'AAC', 'WebM', 'ZIP', 'Web Audio API', 'Web Speech Synthesis API', 'Speech Synthesis API', 'dBFS', 'kbps', 'TTS', 'EN', 'Google', 'Chrome', 'Safari', 'Edge', 'Windows', 'macOS', 'Android', 'LAME', 'WebAssembly', 'PCM'} + + +def leftovers(path, s): + """English words left in visible text, attributes and UI strings of a Chinese page.""" + body = re.sub(r'', '', s[s.index('(.*?)', body, re.S)) + text = re.sub(r'<[^>]+>', '\n', re.sub(r'', '', body, flags=re.S)) + text += '\n'.join(re.findall(r'(?:title|placeholder|aria-label|alt)="([^"]*)"', body)) + strings = [t for t in re.findall(r"'([^'\n]*)'", code) if re.search(r'[A-Za-z]{3}', t) and ' ' in t.strip() and not re.search(r'[<>={}()#]', t)] + words = set() + for chunk in list(text.split('\n')) + strings: + for w in re.findall(r'[A-Za-z][A-Za-z\-’\']{3,}', chunk): + if not any(w in a for a in ALLOWED): + words.add(w) + print(f'{path.relative_to(ROOT)}: built' + (f'; English left: {" ".join(sorted(words))}' if words else '')) + + +def update_hand_made(path, current, en_href): + """Chinese navigation, footer and tool links on the hand-maintained Chinese pages.""" + s = path.read_text(encoding='utf-8') + body_start = s.index('Drop audio file here or click to browse

    ', '

    将音频文件拖放到此处,或点击选择

    '), + ('

    MP3, WAV, FLAC, OGG, M4A — processed locally, never uploaded

    ', '

    MP3、WAV、FLAC、OGG、M4A — 在本地处理,绝不上传

    '), + ('title="Remove"', 'title="移除"'), + ('>Reset', '>重置'), + ('