web/javascript的自动音频精灵生成器?
Posted
技术标签:
【中文标题】web/javascript的自动音频精灵生成器?【英文标题】:Automatic audio sprite generator for web/javascript? 【发布时间】:2013-06-01 20:54:48 【问题描述】:Audio sprites(在一个音频文件中连接多个音频片段)在 web 上的 javascript 音频控制中越来越普遍。然而,创建和实现音频精灵需要大量“愚蠢”的工作。有没有一种工具或方法可以让您自动完成而不是“手动”?
例如给定一个包含音频文件的文件夹,我想要一个生成的工具
-
包含所有内容的音频文件,最好用一点静音隔开。
音频文件中每个声音片段的开始和偏移时间(以毫秒为单位)。最好它会输出 javascript sprite 代码本身!
【问题讨论】:
【参考方案1】:查看这个出色的 Node.js 解决方案:
https://github.com/tonistiigi/audiosprite
对我来说很棒!
【讨论】:
【参考方案2】:这个 python 脚本是一种生成音频精灵的简单方法 以及适用于网络的适当 javascript 代码。
特点
无需安装特殊模块。 将音频文件连接到一个精灵,用静音填充 生成javascript精灵信息(定时)要求:
-
仅适用于 .wav 作为输入和输出。之后转换为其他文件格式。
所有音频文件都应具有相同的属性(采样率、通道等)
Python 代码:
silenceDuration = 0.2 # Seconds of silence between merged files
outfile = "soundsSprite.wav" # Output file. Will be saved in the path below.
folder = "C:/Users/Jonas/Dropbox/Documents/cnru/programmering/html5 nback/stimuli_mess/audioletters/"
# Prepare...
import wave, os, glob
os.chdir(folder)
currentTime = 0
sprite =
# Open output file
output = wave.open(outfile, 'wb')
# Loop through files in folder and append to outfile
for i, infile in enumerate(glob.glob('*.wav')):
# Skip the outfile itself
if infile == outfile: continue
# Open file and get info
w = wave.open(folder + infile, 'rb')
soundDuration = w.getnframes() / float(w.getframerate())
# First file: determine general parameters- Create silence.
if i == 0:
output.setparams(w.getparams())
silenceData = [0] * int(w.getframerate() * 2 * silenceDuration) # N 0's where N are the number of samples corresponding to the duration specified in "silenceDuration"
silenceFrames = "".join(wave.struct.pack('h', item) for item in silenceData)
# Output sound + silence to file
output.writeframes(w.readframes(w.getnframes()))
output.writeframes(silenceFrames)
w.close()
# Create sprite metadata 'mysound.wav': [start_secs, end_secs]. Then increment current time
start = round(currentTime, 3)
end = round(currentTime + soundDuration, 3)
sprite[infile[:-4]] = [start, end]
currentTime += soundDuration + silenceDuration
# Yay, the worst is behind us. Close output file
output.close()
# Output in the required format. Here for jquery.mb.audio
for filename, times in sprite.items():
print '%s: id: "%s", start: %.3f, end: %.3f, loop: false, ' % (filename, filename, times[0], times[1])
** 输出** 我为我拥有的一些音频文件(大声朗读的字母)运行了这个,并得到了以下输出:
精灵变量:
'AA': [0.449, 0.776], 'E': [3.149, 3.419], 'A': [0.0, 0.249], 'C': [2.113, 2.395], 'B': [1.554, 1.913], 'AE': [0.976, 1.354], 'D': [2.595, 2.949], 'G': [4.132, 4.554], 'F': [3.619, 3.932], 'H': [4.754, 4.972], 'K': [5.957, 6.258], 'J': [5.172, 5.757], 'L': [6.458, 6.719], 'O': [6.919, 7.133], 'Q': [8.488, 8.957], 'P': [7.853, 8.288], 'S': [9.681, 10.057], 'R': [9.157, 9.481], 'U': [10.694, 10.994], 'T': [10.257, 10.494], 'V': [11.194, 11.703], 'Y': [12.601, 12.93], 'X': [11.903, 12.401], 'Z': [13.13, 13.714], 'OE': [7.333, 7.653]
... 已转换为jquery.mb.audio 样式:
AA: id: "AA", start: 0.449, end: 0.776, loop: false,
E: id: "E", start: 3.149, end: 3.419, loop: false,
A: id: "A", start: 0.000, end: 0.249, loop: false,
C: id: "C", start: 2.113, end: 2.395, loop: false,
B: id: "B", start: 1.554, end: 1.913, loop: false,
AE: id: "AE", start: 0.976, end: 1.354, loop: false,
D: id: "D", start: 2.595, end: 2.949, loop: false,
G: id: "G", start: 4.132, end: 4.554, loop: false,
F: id: "F", start: 3.619, end: 3.932, loop: false,
H: id: "H", start: 4.754, end: 4.972, loop: false,
K: id: "K", start: 5.957, end: 6.258, loop: false,
J: id: "J", start: 5.172, end: 5.757, loop: false,
L: id: "L", start: 6.458, end: 6.719, loop: false,
O: id: "O", start: 6.919, end: 7.133, loop: false,
Q: id: "Q", start: 8.488, end: 8.957, loop: false,
P: id: "P", start: 7.853, end: 8.288, loop: false,
S: id: "S", start: 9.681, end: 10.057, loop: false,
R: id: "R", start: 9.157, end: 9.481, loop: false,
U: id: "U", start: 10.694, end: 10.994, loop: false,
T: id: "T", start: 10.257, end: 10.494, loop: false,
V: id: "V", start: 11.194, end: 11.703, loop: false,
Y: id: "Y", start: 12.601, end: 12.930, loop: false,
X: id: "X", start: 11.903, end: 12.401, loop: false,
Z: id: "Z", start: 13.130, end: 13.714, loop: false,
OE: id: "OE", start: 7.333, end: 7.653, loop: false,
感谢以下人员的启发: how to make a wav file with python 和 how to join wavefiles using python(tom10 的回答)
【讨论】:
以上是关于web/javascript的自动音频精灵生成器?的主要内容,如果未能解决你的问题,请参考以下文章
HTML5新增多媒体属性(加入视频音频)CSS3高级应用(过渡变形动画)精灵图
自动化篇 | PC 端这款黑科技录制脚本,完爆按 X 精灵!