duangsuse::Echo
719 subscribers
4.28K photos
130 videos
583 files
6.49K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
./extract_subtitles.py --use-sharp -lang chi_sim -filter-code '~cvInGrayRange(it, 0xaa, 0xff)' -crop '0(0,0)[1,1] 1321(382,620)[536,53]' 2020xjp.mp4 --draw-plot --crop-debug
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 ...
……不愧是 Tesseract OCR, 我用白色文字它就看不出
and... PIPE="__import__('re').sub('[\s,.,、。“”]','',it.strip())" ./timeline_ops.py merge frames/2020xjp.mp4/timeline.txt 0.55 | ./timeline_ops.py to-lrc 25.0 srt > 2020xjp.srt
2020xjp.srt
11.4 KB
累死了,我居然为了包子熬夜做了这个东西…… 仅仅是为了方便查找吐字而已,emmm
#Python #code 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+")
Forwarded from 依云
判断路径是否存在用 exists 啊
刚才我大体想一下 Hachiko 用于声库创建的可能性,
发现取拼音的部分只需要一个 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 用于解决后两个流程
Audio
https://t.me/dsuse/14002 👆🏼 还记得上面的曲子吗?
好了,现在 srt2mid 已经可以用 mid 文件来表示 srt 文件里的时轴文字信息了…… 意味着你也可以用 Hachiko 来打字幕,如果你不想装 SynthV Editor 后期再填或者干脆没有音高的话
["the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
发现也可以解析成 Tuple 的形式
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
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
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 丢掉的代码,虽然也不怎么厉害