标题: [文本处理] [已解决]求联想语音带时间轴的txt转srt的批处理 [打印本页]
作者: vwfgh 时间: 2022-2-6 15:25 标题: [已解决]求联想语音带时间轴的txt转srt的批处理
本帖最后由 vwfgh 于 2022-2-9 09:37 编辑
新人第一次发帖,想求论坛里的大佬解答个问题!
原文本格式是这样的,星号后面是时间轴,只有开始时间,结束时间用下一句的开始时间就行:
2022/2/6 13:01:56 **** 00:00:01.9180000 **** english **** chinese
xxxxxxxx
或者是这样的:
2022/2/6 14:28:40 **** 00:00:06.0180000
xxxxxxxxx
想转换成srt的格式,我知道缺少每句话的结束时间,结束时间就用下一句的开始时间就行:
1
00:00:13,089 --> 00:00:21,649
xxxxxxxxx
源格式有两种,哪个方便转换成srt就用哪个,谢谢大佬。不限于批处理,python等其他方法只要能实现都行。
顺便说一下,这是联想语音助手生成的字幕文件。语音转文字准确率挺高的,就是字幕格式太迷了。
作者: idwma 时间: 2022-2-6 17:44
- #@&cls&powershell "type %~s0|out-string|iex"&pause&exit
- sc a.srt $(
- gc a.txt|%{
- if($_ -replace '\.',',' -match '\d\d:\d\d:\d\d,\d{3}'){
- $a+=@($matches[0])
- if($a.count -eq 3){$i++;$i;'{0} --> {1}' -f $a[0],$a[2];$a[1],'';$a=@($a[2])}
- }else{$a+=@($_)}
- }
- $i++;$i;$a
- )
复制代码
作者: vwfgh 时间: 2022-2-6 18:17
本帖最后由 vwfgh 于 2022-2-6 18:36 编辑
回复 2# idwma
谢谢大佬,有个问题转过来的是乱码。我源文件是utf-8格式的,改成ansi以后正常了,但是我的文件很多,一个个改太麻烦了,能修改下脚本吗?
还有我想请问一下如果源文件是两行的双语字幕,批处理该怎么写?
作者: flashercs 时间: 2022-2-6 18:57
- <#*,:&cls
- @echo off
- cd /d "%~dp0"
- powershell -NoProfile -ExecutionPolicy RemoteSigned -Command ". ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~0\" -ReadCount 0 | Out-String ))) "
- pause
- exit /b
- #>
- # 功能:当前目录txt转换成srt的格式,我知道缺少每句话的结束时间,结束时间就用下一句的开始时间就行:
-
- function GenSrt {
- param(
- [string]$Source,
- [string]$Output
- )
- $re = New-Object System.Text.RegularExpressions.Regex -ArgumentList @('^[^*\n]+\*+\s*(?<begin1>\d{2}:\d{2}:\d{2})\.(?<begin2>\d{3}).*$\n(?<talk>[\s\S]*?)(?=^[^*\n]+\*+\s*(?<end1>\d{2}:\d{2}:\d{2})\.(?<end2>\d{3})|\z)', 'Multiline,Compiled')
- $evaluator = [System.Text.RegularExpressions.MatchEvaluator] {
- param([System.Text.RegularExpressions.Match]$m)
- $Script:ctr++
- # Write-Host ($m.Groups['talk'].Value) -ForegroundColor Green
- if ($m.Groups['end1'].Success) {
- $Script:format -f $Script:ctr, $m.Groups['begin1'].Value, $m.Groups['begin2'].Value, $m.Groups['end1'].Value, $m.Groups['end2'].Value, $m.Groups['talk'].Value
- } else {
- $Script:format -f $Script:ctr, $m.Groups['begin1'].Value, $m.Groups['begin2'].Value, $m.Groups['begin1'].Value, $m.Groups['begin2'].Value, $m.Groups['talk'].Value
- }
- }
- $Script:ctr = 0
- [System.IO.File]::WriteAllText($Output, ($re.Replace( [System.IO.File]::ReadAllText($Source, $encoding), $evaluator )), $encoding)
- }
- $encoding = [System.Text.Encoding]::UTF8
- $Script:format = "{0}`r`n{1},{2} --> {3},{4}`r`n{5}`r`n"
- Get-ChildItem -Path "*.txt" | ForEach-Object {
- if (-not $_.PSIsContainer) {
- $dstfile = $_.BaseName + ".srt"
- Write-Host "$($_.Name) --> $dstfile"
- GenSrt -Source $_ -Output $dstfile
- }
- }
复制代码
作者: vwfgh 时间: 2022-2-6 19:04
回复 4# flashercs
谢谢大佬,分毫不差!
作者: idwma 时间: 2022-2-6 20:14
回复 3# vwfgh - #@&cls&powershell "type %~s0|out-string|iex"&pause&exit
- foreach($j in dir *.txt){
- sc -enc utf8 $($j.basename+'.srt') $(
- gc -enc utf8 $j|%{
- if($_ -replace '\.',',' -match '\d\d:\d\d:\d\d,\d{3}'){
- $a+=@($matches[0])
- if($a.count -gt 1){$i++;$i;'{0} --> {1}' -f $a[0],$a[-1];$a[1..$($a.count-2)],'';$a=@($a[-1])}
- }else{$a+=@($_)}
- }
- $i++;$i;$a;rv a,i
- )
- }
复制代码
作者: vwfgh 时间: 2022-2-7 10:43
回复 6# idwma
非常感谢!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |