手动生成音频文件



我试图了解如何基于字符串生成音频。想想如何在Audacity中打开非音频文件(我猜它以二进制形式打开)并将其作为噪声播放。

我在tone.js下面有一个简单的工作播放器,插入一个音频文件的base64字符串到播放器。我如何用一个普通的字符串(文本)替换base64音频文件,比如"Hello world",它被转换成一个字符串的音频文件,要么是bas64,要么是使用二进制转换?

<script>
//load a base64 mp3
const player = new Tone.Player("data:audio/mp3;base64, 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").toDestination();
//if loaded then play
Tone.loaded().then(() => {
player.start();
});

</script>

我没有使用Tone.JS。但是我用Web Audio API玩了原始的PCM数据。数据由浮点值组成,范围从-1到1。我认为一个必要的步骤将是提出一个转换函数,该函数将您的字符串数据转换为落在此范围内的数字,如果您采取播放PCM的路径。

你将需要非常长的字符串,但是,如果你的播放是一个44100帧/秒的普通采样率,每个字符映射到一个帧。

这就是我想到的,它可能对其他人有用-将acsii转换为十进制,创建audiobuffer,这是ascii/decimal的长度,映射值-1和1之间的小数,将结果放入audiobuffer并播放它。一旦你知道要找什么(我完全不知道),这就不复杂了。

// String to convert to audio
var html = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed accumsan commodo pretium. Aliquam porta tortor ut quam sagittis posuere. Nullam in condimentum purus, nec vulputate risus. Sed a sollicitudin ipsum. Pellentesque diam nisi, viverra vitae metus at, consectetur posuere lorem. Morbi faucibus sed mi quis cursus. Morbi et tincidunt sem. Phasellus pretium ultricies massa, sit amet consectetur urna rutrum nec. Proin vel velit neque. Fusce eget nulla dui. Phasellus id risus ut lacus laoreet rhoncus. Nunc ultrices eleifend eros, et rhoncus dui dictum sit amet. In dignissim velit ac rhoncus faucibus. Sed viverra lorem at nulla mollis auctor. Etiam vel lacinia neque. Nullam ipsum sapien, rutrum egestas nulla a, efficitur mattis nisi. Nulla non nibh arcu. Vestibulum quis dui non mauris placerat egestas. Suspendisse potenti. Nulla porta id felis sit amet feugiat. Fusce felis metus, ultrices eget posuere id, consectetur nec augue. Nulla nec tortor ac felis rhoncus tempor quis id erat. Nam semper tincidunt ex eu iaculis. Cras a turpis eget dui viverra elementum. In eu orci sodales, ornare leo ut, fermentum elit. Aenean non sem at dui laoreet gravida eu a magna. Praesent vitae urna mattis, efficitur erat id, sagittis neque. Sed sit amet suscipit felis. Nam fringilla ligula leo, vitae malesuada ipsum tincidunt nec. Proin at justo in nisl accumsan consectetur. Phasellus sit amet nisl lacus. Quisque ornare enim laoreet sapien ultricies, ornare faucibus diam condimentum. Donec facilisis at turpis in iaculis. Phasellus laoreet condimentum varius. Phasellus sed dui ut nibh placerat ultrices quis vel lacus. Cras nec vehicula diam. Vivamus vel lacus accumsan, faucibus quam vitae, hendrerit nibh. Aliquam et elementum nunc. Sed mi est, lobortis eu orci sed, tempor vehicula mauris. Aenean non massa varius, ultrices justo eu, cursus ante. In ex nulla, tincidunt eget arcu hendrerit, tempor eleifend ipsum. Vivamus suscipit justo at finibus faucibus. Cras dolor erat, blandit sit amet lacus sit amet, sollicitudin aliquet arcu. Nulla nec sodales neque. Suspendisse sed laoreet mauris. Curabitur sapien neque, lobortis at blandit in, eleifend aliquet velit. Nullam dictum justo quis tellus rutrum, at tincidunt libero iaculis. Nulla convallis eget nisl viverra hendrerit. Nulla imperdiet orci non suscipit elementum. Nunc a metus finibus arcu fermentum porttitor. Morbi semper porttitor cursus.";
// String length
var htmllength = html.length;
// Create an audio context
const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
// Create an empty three-second stereo buffer at the sample rate of the AudioContext
//const audiobuffer = audioCtx.createBuffer(2, audioCtx.sampleRate * 3, audioCtx.sampleRate);
const audiobuffer = audioCtx.createBuffer(2, htmllength, audioCtx.sampleRate);
// Map a number from one range to another
function map (number, inMin, inMax, outMin, outMax)
{
return (number - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;
}
// Fill the buffer with white noise;
// just random values between -1.0 and 1.0
for (var channel = 0; channel < audiobuffer.numberOfChannels; channel++)
{
// This gives us the actual array that contains the data
var nowBuffering = audiobuffer.getChannelData(channel);
// Loop through the array
for (var i = 0; i < audiobuffer.length; i++)
{
// Get each character
var char = html.charAt(i);
// Get the character's binary character code (0 - 256)
var decimal = char.charCodeAt(0);
// Map binary character code to PCM audio number
var pcmnumber = map(decimal, 0, 256, -1, 1);
// Add PCM audio to group of slots in audiobuffer 
nowBuffering[i] = pcmnumber;
}
}
// Get an AudioBufferSourceNode.
// This is the AudioNode to use when we want to play an AudioBuffer
var source = audioCtx.createBufferSource();
// set the buffer in the AudioBufferSourceNode
source.buffer = audiobuffer;
// Set volume
gainnode = audioCtx.createGain();
gainnode.gain.value = 1.0;
// Slow down the playback rate
source.playbackRate.value = 0.1;
// connect the AudioBufferSourceNode to the
// destination so we can hear the sound
source.connect(gainnode).connect(audioCtx.destination);
// start the source playing
//source.loop = true;
source.start(0);

最新更新