OSError: [Errno 24] Too many open files: 'frames/2020xjp.mp4/subtitle_191.png'🌚 草,PIL 根本不是为 data statics 使用的
OSError: [Errno 24] Too many open files: 'frames/2020xjp.mp4/subtitle_1920.png' sudo 也只能开这么多?
ulimit -Hn 查一下,接着ulimit -n 200000 ...
duangsuse::Echo
🤔 感觉 Hachiko 的 timeline scrape 可以泛化一点,变成可以收一个任意值的流的GUI函数,其实这就是一个 realtime pitch 是否 enable 的问题而已,如果发现 nextPitch() 的返回类型不支持就不放音高好了 这样也可以给 reducer 提供一个 context 参数,方便操作文字绘制? (
想的是可以利用 Hachiko 的时间置点方法收集单字发音数据,不过可以料想效果不一定怎么样
#Python #code
impreative equivalent:
createFile("a"); createFile("a.txt") —from os.path import isfile
def infRange(start, step = 1):
acc = start - step
while True: acc += step; yield acc
def createFile(name, mode = "w+"):
if not isfile(name): fp = name
else:
(base, ext) = splitFilename(name)
fp = next(filter(lambda fp: not isfile(fp), map(lambda i: f"{base}{i}{ext}", infRange(1))))
return open(fp, mode)
def splitFilename(name):
parts = name.rsplit(".")
return (parts[0], "" if len(parts) == 1 else "."+parts[1]) impreative equivalent:
def createFile(name):
if not isfile(name): fp = name
else:
(base, ext) = splitFilename(name)
acc = 1
def accFp():
nonlocal acc
f"{base}{acc}{ext}"
while isfile(accFp()): acc += 1
fp = accFp()
return open(fp, "w+")刚才我大体想一下 Hachiko 用于声库创建的可能性,
发现取拼音的部分只需要一个 hanzi2pinyin 函数即可(不是特别困难也能兼容 a1 a2 这种文件名,因为处理的只是单个汉字的文件名),主要还是数据的问题,是在整个音频层面做处理还是先利用既成字幕划分成
显然还是前者的输出更能保持信息量
我考虑了GUI 有一个 subtitle | start | duration 列表,然后点进去
整理一下我发现除了要增强 Hachiko 目前的命令行可组合性(允许直接提供数据流以及录制的seek开始时间),还需要一个能按字幕切音频的脚本以及一个批量重命名的脚本
大致上工作流是这样:
1. 打开 GUI,选择一个 subtitle 以文本和开始时间启动 hachiko,接受它的输出吐字时间线 srt (添加
2. 前端要处理显式待录制状态的问题,随时允许用户输出合并后的 srt (srt2mid 也要添加 from-lyrics 功能了...)
3. 利用切字幕脚本按字幕切出每个波形采样,重名自动解决
4. 用批量重命名脚本按汉字规则 (
合理化一下文件模块,发现必要两个:
+ hachiko_segment GUI用于录制和合并所有字幕的吐字时间线,当然不是必要的(单纯利用 hachiko 和外部 mid lyrics 编辑也能合并出来)但会很方便
+ srt_segment / srt_segment rename 用于解决后两个流程
发现取拼音的部分只需要一个 hanzi2pinyin 函数即可(不是特别困难也能兼容 a1 a2 这种文件名,因为处理的只是单个汉字的文件名),主要还是数据的问题,是在整个音频层面做处理还是先利用既成字幕划分成
[subtitle].ogg 这样的音频文件然后再让用户打出时间线划分为 [lyric].ogg ,UI 上面会费功夫显然还是前者的输出更能保持信息量
我考虑了GUI 有一个 subtitle | start | duration 列表,然后点进去
guiReadPitch(subtitle, audio
[start:end]) 最后再合并回来,可是后来想想我们已经有 srt2mid 这样可以创建 SRT / MID+Lyrics 的等价关系了,合并可以直接转 mid 用 SynthesizerV Editor 然后再 back srt…… 所以主要是添加一个开始时间命令行参数以及直接把列表在命令行指定的问题,UI 做多少另说 整理一下我发现除了要增强 Hachiko 目前的命令行可组合性(允许直接提供数据流以及录制的seek开始时间),还需要一个能按字幕切音频的脚本以及一个批量重命名的脚本
大致上工作流是这样:
1. 打开 GUI,选择一个 subtitle 以文本和开始时间启动 hachiko,接受它的输出吐字时间线 srt (添加
-o stdout 功能)2. 前端要处理显式待录制状态的问题,随时允许用户输出合并后的 srt (srt2mid 也要添加 from-lyrics 功能了...)
3. 利用切字幕脚本按字幕切出每个波形采样,重名自动解决
4. 用批量重命名脚本按汉字规则 (
pinyin(it[0]) + it[1:] ) 转换文件名合理化一下文件模块,发现必要两个:
+ hachiko_segment GUI用于录制和合并所有字幕的吐字时间线,当然不是必要的(单纯利用 hachiko 和外部 mid lyrics 编辑也能合并出来)但会很方便
+ srt_segment / srt_segment rename 用于解决后两个流程
好了,现在 srt2mid 已经可以用 mid 文件来表示 srt 文件里的时轴文字信息了…… 意味着你也可以用 Hachiko 来打字幕,如果你不想装 SynthV Editor 后期再填或者干脆没有音高的话
["the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]Forwarded from duangsuse Throws
def readDazibao(text):
entries = map(str.strip, text.split("\n\n"))
for entry in entries:
entryMap = dict()
key = None; content = ""
for line in entry.split("\n"): # k: \n v
if line.endswith(":"):
if key != None: entryMap[key] = content; content = ""
key = line[:-1]; continue
else: content += f"{line}\n"
entryMap[key] = content
yield entryMap
a = document.createElement("a");
a.innerText = "你好";
a.position = "absolute";
a.style.left = 100;
a.style.top = 100;
可以实现纵向:
a.style.writingMode = "tb-rl"
字号:
a.style.fontSize="100px"
a.style.fontWeight="bold"
@font-face {
font-family: '';
src: url() format();
}
var fileref = document.createElement("link");
fileref.rel = "stylesheet";
fileref.type = "text/css";
fileref.href = "filename";
document.getElementsByTagName("head")[0].appendChild(fileref)
https://font-converter.net/en
duangsuse Throws
def readDazibao(text): entries = map(str.strip, text.split("\n\n")) for entry in entries: entryMap = dict() key = None; content = "" for line in entry.split("\n"): # k: \n v if line.endswith(":"): if key != None: entryMap[key]…
用这种方法解析还是不如直接流式灵活,流式可以支持
K:
V
和 K: V 两种情况,就是
K:
V
和 K: V 两种情况,就是
Pair = K':' '\n' V '\n\n' | K':' V '\n'function cssFontFamilyDef(name, url) {
return `@font-face { font-family: ${name}; src: url(${url}) format('woff2'); }`;
}
function appendFont(url) {
document.head.appendChild(element("link",
configured(withAttr("rel", "stylesheet"), e => { e.innerHtml = cssFontFamilyDef(font_name.value, url); })
));
} 删掉的好代码…… 因为我看到了新的可用API
https://www.filamentgroup.com/lab/js-web-fonts.html
Filament Group
Should I Use JavaScript to Load My Web Fonts? | Filament Group, Inc., Boston, MA
Read this page on the Filament Group website
function* readSourceTable(text) { //< obsoleted
let entries = text.split("\n\n");
for (let entry of entries) {
let entryList = [];
let key = null; let content = "";
for (let line of entry.split("\n").map(it => it.trim())) {
if (line.length == 0) continue;
if (line.endsWith(":")) {
if (key != null) entryList.push([key, content]);
key = line.substring(0, line.length-1); content = "";
} else content += `${line}\n`;
}
entryList.push([key, content]);
yield entryList;
}
} #JavaScript #web 丢掉的代码,虽然也不怎么厉害