Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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 `<lastmod>` 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
Expand Down
11 changes: 6 additions & 5 deletions assistant.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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();
Expand Down Expand Up @@ -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', '音频变速'),
Expand All @@ -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',
'озвуч', 'вслух', 'синтез речи', 'прочитать', '朗读', '配音', '文字转语音', '语音合成'] },
};
Expand Down
6 changes: 5 additions & 1 deletion audio-compressor/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
<meta name="description" content="Compress audio files online for free. Reduce MP3, WAV file size by adjusting bitrate and sample rate. No upload, runs in your browser.">
<meta name="keywords" content="audio compressor, reduce audio file size, compress mp3 online, shrink audio file, audio bitrate reducer, compress wav free">
<link rel="canonical" href="https://audiotools.dev/audio-compressor/">
<link rel="alternate" hreflang="en" href="https://audiotools.dev/audio-compressor/">
<link rel="alternate" hreflang="zh" href="https://audiotools.dev/zh/audio-compressor/">
<link rel="alternate" hreflang="x-default" href="https://audiotools.dev/audio-compressor/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="AudioTools.dev">
<meta property="og:locale" content="en_US">
Expand Down Expand Up @@ -142,6 +145,7 @@
<a href="/text-to-speech/">Text to Speech</a>
<a href="/voice-to-text/">Voice to Text</a>
<a href="/">All tools</a>
<a href="/zh/audio-compressor/" class="at-lang" hreflang="zh" lang="zh">中文</a>
</div>
</div>
</nav>
Expand Down Expand Up @@ -225,7 +229,7 @@ <h1>Audio Compressor</h1>
<h2>Free Online Audio Compressor</h2>
<p>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.</p>
<h3>How It Works</h3>
<p>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.</p>
<p>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.</p>
<h3>Choosing the Right Bitrate</h3>
<p>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.</p>
<p>Need other edits? Try our <a href="/converter/">Audio Converter</a>, <a href="/audio-trimmer/">Audio Trimmer</a>, <a href="/audio-joiner/">Audio Joiner</a>, or <a href="/volume-booster/">Volume Booster</a>.</p>
Expand Down
2 changes: 1 addition & 1 deletion audio-export.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down
4 changes: 4 additions & 0 deletions audio-joiner/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
<meta name="description" content="Free online audio joiner. Merge and combine MP3, WAV, FLAC files in your browser. No upload, no sign-up. Add crossfade between tracks.">
<meta name="keywords" content="audio joiner, merge audio online, combine mp3, join audio files, audio merger, concatenate audio, merge wav files free">
<link rel="canonical" href="https://audiotools.dev/audio-joiner/">
<link rel="alternate" hreflang="en" href="https://audiotools.dev/audio-joiner/">
<link rel="alternate" hreflang="zh" href="https://audiotools.dev/zh/audio-joiner/">
<link rel="alternate" hreflang="x-default" href="https://audiotools.dev/audio-joiner/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="AudioTools.dev">
<meta property="og:locale" content="en_US">
Expand Down Expand Up @@ -137,6 +140,7 @@
<a href="/text-to-speech/">Text to Speech</a>
<a href="/voice-to-text/">Voice to Text</a>
<a href="/">All tools</a>
<a href="/zh/audio-joiner/" class="at-lang" hreflang="zh" lang="zh">中文</a>
</div>
</div>
</nav>
Expand Down
2 changes: 2 additions & 0 deletions changelog/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ <h1>Changelog</h1>
<section class="entry">
<h2><time datetime="2026-10-22">October 22, 2026</time></h2>
<ul>
<li>Chinese versions of Volume Booster, Text to Speech, Audio Joiner and Audio Compressor: <a href="/zh/volume-booster/">/zh/volume-booster/</a>, <a href="/zh/text-to-speech/">/zh/text-to-speech/</a>, <a href="/zh/audio-joiner/">/zh/audio-joiner/</a>, <a href="/zh/audio-compressor/">/zh/audio-compressor/</a>.</li>
<li>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.</li>
<li>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.</li>
<li>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.</li>
<li>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.</li>
Expand Down
6 changes: 3 additions & 3 deletions converter/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
<meta name="description" content="Convert audio or video files to MP3, M4A, WAV or FLAC in your browser. No upload, no server, 100% private. Free online audio converter.">
<meta name="keywords" content="audio converter online, convert mp3 wav, wav to mp3, mp3 converter, audio format converter, free audio converter, browser audio converter, private audio converter">
<link rel="canonical" href="https://audiotools.dev/converter/">
<link rel="alternate" hreflang="en" href="https://audiotools.dev/converter/">
<link rel="alternate" hreflang="zh" href="https://audiotools.dev/zh/converter/">
<link rel="alternate" hreflang="x-default" href="https://audiotools.dev/converter/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="AudioTools.dev">
<meta property="og:locale" content="en_US">
Expand All @@ -32,9 +35,6 @@
<meta name="twitter:title" content="Audio Converter Online — Free, Private, No Upload">
<meta name="twitter:description" content="Convert audio or video to MP3, M4A, WAV or FLAC directly in your browser. No server, 100% private.">
<meta name="twitter:image" content="https://audiotools.dev/og/converter.png">
<link rel="alternate" hreflang="en" href="https://audiotools.dev/converter/">
<link rel="alternate" hreflang="zh" href="https://audiotools.dev/zh/converter/">
<link rel="alternate" hreflang="x-default" href="https://audiotools.dev/converter/">
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large">

<!-- Favicon -->
Expand Down
4 changes: 2 additions & 2 deletions llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Binary file added og/zh-audio-compressor.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added og/zh-audio-joiner.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added og/zh-text-to-speech.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added og/zh-volume-booster.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading