lrc歌词转srt并添加中文字幕

Hik
@Ta 2019-05-26 1077点击
自己有时候没事也去油管搬运点MV到b站,但是欧美MV一般都没有字幕的,于是我下载lrc再手动改成srt,并且网易云上虽然是中英文字幕,但是下载的lrc文件中并不是中英文,如下图:

但是实际下载的歌词如下:

以前都是一点点把中文歌词复制到英文字幕下边,但确实太多了,于是自己动手丰衣足食吧,用Java自已写个,代码比较基础,但能用就行
打包好的程序解压即用,改cmd中lrc跟中英文文档,运行cmd即用:
makeSrtCE.zip(3.54 KB)
代码仅供学习:
public class Main {
    private static Map<String, String> map = new LinkedHashMap<>();
    private static List lrcList = new ArrayList<>();

    public static void main(String[] args) {
        //        lrc文件路径
        String lrcPath = "C:\\Users\\Cheng\\Downloads\\me.lrc";
        //        中英文歌词路径
        String enCnPath = "C:\\Users\\Cheng\\Downloads\\me.txt";
        if (args != null && args.length >= 2) {
            lrcPath = args[0];
            enCnPath = args[1];
        }
//        读取中英文歌词
        readToString(enCnPath);
//        lrc转srt方法
        lrc2Srt(lrcPath);
//        srt中加中文歌词
        writeToString(lrcPath + ".srt");
    }

    /**
     * 读取中英文文件 存入map
     *
     * @param fileName
     */
    private static void readToString(String fileName) {
        try {
            BufferedReader br = new BufferedReader(new FileReader(fileName));
            String line;
            while ((line = br.readLine()) != null) {
                String one = line.trim();
                if ((line = br.readLine()) != null) {
                    String two = line.trim();
            /*
            I promise that you'll never find another like me
            我保证你会发现我是无可替代的
            I know that I'm a handful baby uh
            我知道我是不好驾驭的那款 亲爱的
            */
//          网易云音乐歌词复制下来存到文本文件中,歌词如上只保留歌词主体,不要有换行
//          将歌词英文行作为key 中文作为value存入map中
                    map.put(one, two);
                }
            }
            br.close();
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
        System.out.println("读取中英文歌词完毕");
    }

    /**
     * 将lrc转srt
     *
     * @param fileName
     */
    private static void lrc2Srt(String fileName) {
        try {
//            读取.lrc歌词文件
            BufferedReader br = new BufferedReader(new FileReader(fileName));
//            输出.srt字幕文件
            BufferedWriter bw = new BufferedWriter(new FileWriter(fileName + ".srt"));
            String line;
            while ((line = br.readLine()) != null) {
                String trimLine = line.trim();
//                将有效(即包含中括号)的lrc歌词行加入list集合
                if (trimLine.contains("[") && trimLine.contains("]")) {
                    lrcList.add(trimLine);
                }
            }
//            遍历歌词list集合
            for (int i = 0; i < lrcList.size(); i++) {
                String startTime = covertTime(lrcList.get(i).toString());
                String endTime = startTime;
                if (i + 1 < lrcList.size() - 1) {
//                    将endtime结束时间设置为lrc列表中下一个list对象的时间
                    endTime = covertTime(lrcList.get(i + 1).toString());
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss,SSS");
                    Date date = simpleDateFormat.parse(endTime);
//                    字幕结束时间减50毫秒 其实这步无所谓吧 但是看别人也是减50ms的
                    Date date1 = new Date(Long.parseLong((date.getTime() - 50) + ""));
                    String format = simpleDateFormat.format(date1);
                    endTime = format;
                }
//                按规则写入字幕文件
                String num = String.valueOf(i + 1);
                bw.write(num);
                bw.newLine();
                bw.write(startTime + " --> " + endTime);
                bw.newLine();
                String lrcStr = lrcList.get(i).toString();
//                去掉中括号时间
                bw.write(lrcStr.substring(lrcStr.indexOf(']')+1));
                bw.newLine();
                bw.newLine();
            }
            br.close();
            bw.close();
        } catch (IOException e) {
            System.out.println(e.getMessage());
        } catch (ParseException e) {
            System.out.println(e.getMessage());
        }
        System.out.println("lrc转srt字幕文件完毕,文件lrc同目录下.srt后缀");
    }

    /**
     * lrc歌词中的时间进行转换成符合srt字幕的格式
     *
     * @param lrc
     * @return
     */
    private static String covertTime(String lrc) {
        String time = "00:" + lrc.substring(lrc.indexOf("[") + 1, lrc.indexOf("]"));
        int i = time.lastIndexOf(".") + 4 - time.length();
        StringBuilder sb = new StringBuilder(time);
//        最后","后面位数不足追加0 其实这步也无所谓 补齐看起来整洁点
        for (int i1 = 0; i1 < i; i1++) {
            sb.append("0");
        }
//        原lrc歌词中用.分割毫秒的 在srt字幕中要替换成,符号
        time = sb.toString().replace(".", ",");
        return time;
    }

    /**
     * 处理已生成好的srt字幕,在英文字幕下添加中文
     *
     * @param fileName
     */
    private static void writeToString(String fileName) {
        try {
            BufferedReader br = new BufferedReader(new FileReader(fileName));
            BufferedWriter bw = new BufferedWriter(new FileWriter(fileName + ".srt"));
            String line;
            while ((line = br.readLine()) != null) {
                String trimLine = line.trim();
                bw.write(trimLine);
                bw.newLine();
//                纯英文srt行若包含在中英文map中 则在下面追加对应的中文翻译
                if (map.toString().contains(trimLine) && trimLine.length() > 1) {
                    bw.write(map.get(trimLine));
                    bw.newLine();
                }
            }
            br.close();
            bw.close();
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
        System.out.println("srt字幕添加中文完毕,文件lrc同目录下.srt.srt后缀");
    }
}


回复列表(0)
帖子没有回复
添加新回复
回复需要登录

[聊天-公共聊天室] 方爷:@姜辰,姜老湿好,鸡佬版华为P40放飞梦想小尾巴