📺

文章を自動で改行して字幕を作る。(BudouX in Python)

2023/09/27に公開

ゴール:文章を読みやすい位置で改行するために分割する。

先日、BudouX: 読みやすい改行のための軽量な分かち書き器という記事が公開されていました。

動画の字幕を作成するために早速使ってみました。

開発環境

  • Python 3.10.12

事前準備

pip install budoux

やったこと

分かち書き

日本語は単語ごとに空白で区切らないため単語の切れ目の判定が難しいです。

そこで、BudouXはこの問題を次の文字の間で区切るべきか否かの二値分類問題に落とし込み、文章に対して、予測値が正であれば区切り、そうでなければ区切らないという処理を繰り返すことで、読みやすく分かち書きされたテキストを出力することができます。

実際に試してみました。

import budoux

parser = budoux.load_default_japanese_parser()

text = parser.parse("それでは最後まで動画をご視聴いただきありがとうございました!この動画が役に立ったと思ったら、チャンネル登録と高評価をよろしくお願いいたします。それでは、次の動画でお待ちしていますね。")

print(text)

# 出力
# ['それでは', '最後まで', '動画を', 'ご視聴いただき', 'ありがとう', 'ございました!', 'この', '動画が', '役に', '立ったと', '思ったら、', 'チャンネル登録と', '高評価を', 'よろしく', 'お願いいたします。', 'それでは、', '次の', '動画で', 'お待ちしていますね。']

うまく分かち書きできています。

字幕のために1行ごとに出力

上記で出力された分かち書きを使って、最大文字数を超えない、かつ、不自然なところで切れないように文章を分割します。

import budoux

parser = budoux.load_default_japanese_parser()

text = parser.parse("それでは最後まで動画をご視聴いただきありがとうございました!この動画が役に立ったと思ったら、チャンネル登録と高評価をよろしくお願いいたします。それでは、次の動画でお待ちしていますね。")

# max_length以下の文字数で分割
def combine_elements_until_max_length(data, max_length):
    if not data:
        return []

    combined_list = []
    current_string = ""

    for item in data:
        if len(current_string + item) <= max_length:
            current_string += item
        else:
            combined_list.append(current_string)
            current_string = item

    # 最後のcurrent_stringをリストに追加
    if current_string:
        combined_list.append(current_string)

    return combined_list


# 使用例
result = combine_elements_until_max_length(text, 30)
print(result)

# 出力
# ['それでは最後まで動画をご視聴いただきありがとうございました!', 'この動画が役に立ったと思ったら、チャンネル登録と高評価を', 'よろしくお願いいたします。それでは、次の動画で', 'お待ちしていますね。']

自然な場所で区切れているのではないでしょうか。

まとめ

とても簡単に字幕用の改行ができるようになりました。製作者の方には感謝しかありません。

Discussion