手动生成音频文件

发布于 2025-02-11 06:16:18 字数 8491 浏览 4 评论 0原文

我试图了解如何基于字符串生成音频。想一想您如何在大胆(我猜是打开二进制)中打开一个非Audio文件并将其播放为噪音。

我在音调下有一个简单的工作播放器。js下方,将插入播放器的base64字符串字符串插入。如何用普通字符串(文本)(例如“ Hello World”)替换该Base64音频文件,该文件将作为字符串转换为字符串,要么像在下面一样使用二进制转换?

<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>

I'm trying to understand how generate audio based on a string. Think of how you can open a non-audio file in something like Audacity (it opens as binary I guess) and play it as noise.

I have a simple working player in tone.js below that plugs in a base64 string of an audio file to the player. How do I replace that base64 audio file with an ordinary string (text), say "Hello world", that gets converted into an audio file as a string, either as bas64 as below as perhaps using binary conversion?

<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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

楠木可依 2025-02-18 06:16:18

我没有使用音调。但是我已经使用Web Audio API播放了RAW PCM数据。数据由浮点值组成,范围从-1到1。我认为,如果您采用播放PCM播放的路径,则将提出一个转换功能,将您的字符串数据转换为落在此范围内的数字。

但是,如果您的播放是每秒44100帧的常见样本率,并且每个char地图都需要一个框架,则需要很长的字符串。

I've not used Tone.JS. But I have played by raw PCM data with the Web Audio API. The data consists of floating point values that range from -1 to 1. I think a necessary step will be coming up with a transform function that converts your String data to numbers that fall within this range, if you take the path of playing back PCM.

You will need very long strings, though, if your play is a common sample rate of 44100 frames per second, and each char maps to a single frame.

内心旳酸楚 2025-02-18 06:16:18

这是我想到的,它对其他人可能很有用 - 将ACSII转换为十进制,创建AudioBuffer,这是ASCII/DICMAL的长度,映射值-1和1之间的小数-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);

Here is what I came up with, it may be useful to others - convert acsii to decimal, create audiobuffer that's the length of the ascii/decimal, map the decimal between values -1 and 1, put the result into audiobuffer and play it. Not complicated once you know what to look for (which I completely didn't).

// 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);

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文