彭立发喇叭生成器
俺在ChatGPT的帮助下,整了一个新活:
彭立发喇叭生成器是一个单独的HTML文件,不需要联网,可以在任何有浏览器的设备上运行。本工具用于在任意的音频前插入指定时长的空白,并将结果生成音频文件,可以放到任意设备上运行。
不过由于浏览器的技术限制,空白时长不能过长。在俺的测试机上,空白时长最高只有2小时。
使用方法:
本代码遵循BSD-2-Clause协议开源,欢迎其他人修改源代码并发布。不需要注明程序出处。
P.S. 俺觉得如果想要生成格式更好,时长更长的彭立发喇叭文件,就只能使用浏览器javascript之外的技术了。不知道站长能不能做一个PHP版本,集成到品葱里?
彭立发喇叭生成器是一个单独的HTML文件,不需要联网,可以在任何有浏览器的设备上运行。本工具用于在任意的音频前插入指定时长的空白,并将结果生成音频文件,可以放到任意设备上运行。
不过由于浏览器的技术限制,空白时长不能过长。在俺的测试机上,空白时长最高只有2小时。
使用方法:
- 进入如下地址 【警告:链接内容可能存在钓鱼网址,请勿打开】https://pastebin .com/gCCUM6cG
- 点击 “download” 按钮来下载网页文件
- 直接双击打开下载的文件 (安全提示:请使用 Brave、FireFox 之类的安全浏览器,绝对不要使用国产浏览器打开!)
- 使用第一个按钮来选择一个音频文件
- 在输入框内输入空白时间(分钟)
- 单击“生成并下载” (由于技术限制,只能生成wav文件,而且体积很大。2个小时的空白文件大约有1.5G大小)
- 把生成的音频文件放进任意的播放器即可。(请手动检查一下生成的文件有没有错)
本代码遵循BSD-2-Clause协议开源,欢迎其他人修改源代码并发布。不需要注明程序出处。
P.S. 俺觉得如果想要生成格式更好,时长更长的彭立发喇叭文件,就只能使用浏览器javascript之外的技术了。不知道站长能不能做一个PHP版本,集成到品葱里?
10 个评论
看起来品葱不喜欢pastebin.com,大家有其他推荐的匿名文本分享工具吗?
俺把文件直接发布在这里好了。大家可以复制下面的文本,粘贴到一个空白的txt文件里,然后把后缀名改成html
<!doctype html>
<html lang="zh-Hans">
<head>
<meta charset="UTF-8" />
<title>彭立发喇叭生成器</title>
</head>
<body>
<h2>彭立发喇叭生成器</h2>
<p>注:如果文件生成失败,请尝试把空白时间改小</p>
<input type="file" id="audioInput" accept="audio/*" />
<input type="number" id="durationInput" placeholder="前置空白(分钟)" />
<button onclick="processAudio()">生成并下载</button>
<script>
function processAudio() {
const audioInput = document.getElementById("audioInput");
const duration = document.getElementById("durationInput").value;
if (!audioInput.files.length || !duration) {
alert("请选择文件并输入空白时间!");
return;
}
const audioContext = new (window.AudioContext ||
window.webkitAudioContext)();
const reader = new FileReader();
reader.onload = function (event) {
audioContext.decodeAudioData(event.target.result, function (buffer) {
try {
processGeneration(buffer, duration, audioContext);
} catch (error) {
alert("文件生成出错:" + (error.message || error));
}
});
};
reader.onerror = function (event) {
alert("文件生成出错:" + event.target.error.message);
};
reader.readAsArrayBuffer(audioInput.files[0]);
}
function processGeneration(buffer, duration, audioContext) {
const blankBuffer = audioContext.createBuffer(
buffer.numberOfChannels,
audioContext.sampleRate * duration * 60,
audioContext.sampleRate,
);
// Create a new, longer buffer
const newBuffer = audioContext.createBuffer(
buffer.numberOfChannels,
buffer.length + blankBuffer.length,
audioContext.sampleRate,
);
// Fill the new buffer with the original and the blank audio
for (let channel = 0; channel < buffer.numberOfChannels; channel++) {
const newChannelData = newBuffer.getChannelData(channel);
newChannelData.set(blankBuffer.getChannelData(channel));
newChannelData.set(
buffer.getChannelData(channel),
blankBuffer.length,
);
}
// Convert the buffer to an audio blob and download it
bufferToWave(newBuffer, newBuffer.length).then((blob) => {
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.style.display = "none";
a.href = url;
a.download = "processed_audio.wav";
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
});
}
function bufferToWave(abuffer, len) {
return new Promise((resolve) => {
var numOfChan = abuffer.numberOfChannels,
length = len * numOfChan * 2 + 44,
buffer = new ArrayBuffer(length),
view = new DataView(buffer),
channels = [],
i,
sample,
offset = 0,
pos = 0;
// write WAVE header
setUint32(0x46464952); // "RIFF"
setUint32(length - 8); // file length - 8
setUint32(0x45564157); // "WAVE"
setUint32(0x20746d66); // "fmt " chunk
setUint32(16); // length = 16
setUint16(1); // PCM (uncompressed)
setUint16(numOfChan);
setUint32(abuffer.sampleRate);
setUint32(abuffer.sampleRate * 2 * numOfChan); // byte rate
setUint16(numOfChan * 2); // block align
setUint16(16); // bits per sample
setUint32(0x61746164); // "data" - chunk
setUint32(length - pos - 4); // chunk length
// write interleaved data
for (i = 0; i < abuffer.numberOfChannels; i++)
channels.push(abuffer.getChannelData(i));
while (pos < length) {
for (i = 0; i < numOfChan; i++) {
// interleave channels
sample = Math.max(-1, Math.min(1, channels[i][offset])); // clamp
sample = (0.5 + sample < 0 ? sample * 32768 : sample * 32767) | 0;
view.setInt16(pos, sample, true); // write 16 bit sample
pos += 2;
}
offset++; // next source sample
}
// create Blob
resolve(new Blob([buffer], { type: "audio/wav" }));
function setUint16(data) {
view.setUint16(pos, data, true);
pos += 2;
}
function setUint32(data) {
view.setUint32(pos, data, true);
pos += 4;
}
});
}
</script>
</body>
</html>
网上很多可将.wav 文件转为 .mp3 文件的压缩网站,比如:
https://cloudconvert.com/wav-to-mp3
https://www.freeconvert.com/wav-to-mp3
https://cloudconvert.com/wav-to-mp3
https://www.freeconvert.com/wav-to-mp3
干的不错,希望你们这些懂技术的多多支持打倒共产党干死习近平的事业,我们文科阵线的很需要你们
建议你想办法搜集一下各个县级市级单位官员的邮箱和手机号,在恰当时候给他们发送要给政府和家属大院邮寄炸弹或暗杀的信息,让他们把很多警力安排到政府或家属大院里,借以缓解群众运动的压力。
我有一个建议:可以利用障眼法时间差来混淆你放置喇叭的时间。
例如音频的空白时长为6小时,但是实际上你先播放4小时空白部分,然后剩下2小时空白时长后再放置喇叭。
喇叭响起以后,匪警肯定会调阅事发前半小时的监控来看谁放置的喇叭。然后再分析喇叭,发现有6小时的空白,于是推断喇叭是在事发前6小时左右放置的,又会再调取相关时段的监控。
而你真正放置喇叭的时间,除非动用大量人力调看全程监控,否则根本无法发现。
例如音频的空白时长为6小时,但是实际上你先播放4小时空白部分,然后剩下2小时空白时长后再放置喇叭。
喇叭响起以后,匪警肯定会调阅事发前半小时的监控来看谁放置的喇叭。然后再分析喇叭,发现有6小时的空白,于是推断喇叭是在事发前6小时左右放置的,又会再调取相关时段的监控。
而你真正放置喇叭的时间,除非动用大量人力调看全程监控,否则根本无法发现。
>>建议你想办法搜集一下各个县级市级单位官员的邮箱和手机号,在恰当时候给他们发送要给政府和家属大院邮寄炸...
这里有国际黑客组织公布的上海广东共匪大批干部警察名单电邮地址及手机号:
国际黑客组织 Anonymous 支持大陆民众 “白纸运动”,已经且将继续公布共匪成员名单
https://pincong.rocks/article/51763