top of page
- Script Code -

dofile(reaper.AZ_GetLuaInitPath())

require("reaper_AZSTOKE_BRONZE")

require("reaper_AZSTOKE_SILVER")

require("reaper_AZSTOKE_GOLD")



function CutSilent(mediaItem)


    cutItemList = {}

    silentSectionList = reaper.AZ_GetAudioSectionListInMediaItem(mediaItem, 0.2)

    currentItem = mediaItem

    prevSplitPos = 0


    baseName = reaper.AZ_GetMediaItemName(mediaItem)


    for i, section in pairs(silentSectionList) do

        leftItem, rightItem = reaper.AZ_SplitMediaItem(currentItem, section["StartTime"] - prevSplitPos)

        prevSplitPos = section["StartTime"]

        reaper.AZ_DeleteMediaItem(leftItem)


        leftItem, rightItem = reaper.AZ_SplitMediaItem(rightItem, section["EndTime"] - prevSplitPos)

        prevSplitPos = section["EndTime"]

        currentItem = rightItem


        name = baseName .. "_" .. reaper.AZ_FormatNumDigit(i, 2)

        reaper.AZ_SetMediaItemName(leftItem, name)


        -- リージョン作成

        reaper.AZ_AddRegionMarkerMediaItem(leftItem)


        table.insert(cutItemList, leftItem)

    end


    reaper.AZ_DeleteMediaItem(currentItem)


    return cutItemList

end



function Transcription(mediaItemList)


    -- モデルを読み込み

    ctx = reaper.AZ_TRSC_LoadModel()


    trscTrackList = {}


    exists = {}


    for i, item in pairs(mediaItemList) do


        track = reaper.GetMediaItemTrack(item)


        trscTrack = reaper.AZ_InsertUniqueChildTrack(track, "Transcription")


        -- 文字起こし実行

        text = reaper.AZ_TRSC_FullForMediaItem(ctx, item, "ja")


        itemStart = reaper.AZ_GetMediaItemStartTimeSeconds(item)

        itemLength = reaper.AZ_GetMediaItemLength(item)


        reaper.AZ_InsertNoteItemToTrack(trscTrack, itemStart, itemLength, text)


        if not exists[trscTrack] then

            exists[trscTrack] = true

            table.insert(trscTrackList, trscTrack)

        end

    end


    -- モデルを解放

    reaper.AZ_TRSC_ReleaseModel(ctx)


    return trscTrackList

end



C_id = "B"

C_serif = "C"

C_trsc = "D"

R_header = 2

tableRange = "B3:B100"


function OutputGSheet(spreadSheetId, sheetId, trscTrackList)


    connection = reaper.AZ_GSheet_Connect_UserAccount(spreadSheetId)


    for _, trscTrack in pairs(trscTrackList) do  -- トラックをループ


        itemList = reaper.AZ_GetMediaItemListInTrackItem(trscTrack)


        for i, noteItem in pairs(itemList) do


            region = reaper.AZ_GetRegionMarkerListMediaItem(noteItem)[1]

            voiceID = region["Name"]


            trsc = reaper.AZ_GetMediaItemNotes(noteItem)


            rows = reaper.AZ_GSheet_SearchRowsInWorksheet(connection, sheetId, voiceID, C_id, tableRange)


            if #rows["Cells"] == 0 then


                Msg(voiceID .. " : 存在しません。")

            else


                rowNumber = rows["Cells"][1]["RowNumber"]


                reaper.AZ_GSheet_SetCellValue(connection, sheetId, C_trsc .. rowNumber, trsc)


                Msg(voiceID .. " : 文字起こしを書き込みました。")

            end

        end

    end


    reaper.AZ_GSheet_Disconnect(connection)

end



function main()


    retval, inputList = reaper.AZ_GetUserInputList("", 2, "スプレッドシートID,シートID", "**********,**********")

    if retval == false then return end


    spreadSheetId = inputList[1]

    sheetId_str = inputList[2]

    sheetId = tonumber(sheetId_str)


    mediaItemList = reaper.AZ_GetSelectedMediaItemList(0)

    cutAllItemList = {}


    for i, item in pairs(mediaItemList) do


        cutItemList = CutSilent(item)


        for j, cutItem in pairs(cutItemList) do

            table.insert(cutAllItemList, cutItem)

        end

    end


    trscTrackList = Transcription(cutAllItemList)


    OutputGSheet(spreadSheetId, sheetId, trscTrackList)

end



main()

- Warm Up -

  • Reaperに音声ファイルを配置しておく

  • 台本用のスプレッドシートファイルを用意する

- Script Detail -

dofile(reaper.AZ_GetLuaInitPath())

require("reaper_AZSTOKE_BRONZE")

require("reaper_AZSTOKE_SILVER")

require("reaper_AZSTOKE_GOLD")


・ RIGDOCKSをインポート


function CutSilent(mediaItem)


・ 音声の無音部分を切り出す関数


    cutItemList = {}

    silentSectionList = reaper.AZ_GetAudioSectionListInMediaItem(mediaItem, 0.2)

    currentItem = mediaItem

    prevSplitPos = 0


・ 現在のアイテムと前回の分割位置を初期化


    baseName = reaper.AZ_GetMediaItemName(mediaItem)


・ メディアの名前を取得してbaseNameに保存


    for i, section in pairs(silentSectionList) do


・ 無音部分のリストをループ


        leftItem, rightItem = reaper.AZ_SplitMediaItem(currentItem, section["StartTime"] - prevSplitPos)


・ 無音部分の開始位置でアイテムを分割し、左側のアイテムと右側のアイテムを取得


        prevSplitPos = section["StartTime"]


・ 前回の分割位置を更新


        reaper.AZ_DeleteMediaItem(leftItem)


・ 左側のアイテムは無音部分なので削除


        leftItem, rightItem = reaper.AZ_SplitMediaItem(rightItem, section["EndTime"] - prevSplitPos)


・ 右側のアイテムを無音部分の終了位置で分割し、左側のアイテムと右側のアイテムを取得


        prevSplitPos = section["EndTime"]


・ 前回の分割位置を更新


        currentItem = rightItem


・ 現在のアイテムを右側のアイテムに更新(次のループでこのアイテムを分割するため)


        name = baseName .. "_" .. reaper.AZ_FormatNumDigit(i, 2)

        reaper.AZ_SetMediaItemName(leftItem, name)


・ baseNameに番号をつけて切り出したアイテムに名前を設定


        -- リージョン作成

        reaper.AZ_AddRegionMarkerMediaItem(leftItem)


・ アイテム名をもとにリージョンを作成


        table.insert(cutItemList, leftItem)


・ 切り出したアイテムをリストに追加


    end


    reaper.AZ_DeleteMediaItem(currentItem)


・ 最後に残ったアイテムも削除(無音部分の最後のアイテム)


    return cutItemList


・ 切り出したアイテムのリストを返す


end



--------  ここから REAPDOCK AZSTOKE_TRSC_CutSilentを参照 --------


function Transcription(mediaItemList)


    -- モデルを読み込み

    ctx = reaper.AZ_TRSC_LoadModel()


    trscTrackList = {}


    exists = {}


    for i, item in pairs(mediaItemList) do


        track = reaper.GetMediaItemTrack(item)


        trscTrack = reaper.AZ_InsertUniqueChildTrack(track, "Transcription")


        -- 文字起こし実行

        text = reaper.AZ_TRSC_FullForMediaItem(ctx, item, "ja")


        itemStart = reaper.AZ_GetMediaItemStartTimeSeconds(item)

        itemLength = reaper.AZ_GetMediaItemLength(item)


        reaper.AZ_InsertNoteItemToTrack(trscTrack, itemStart, itemLength, text)


        if not exists[trscTrack] then

            exists[trscTrack] = true

            table.insert(trscTrackList, trscTrack)

        end

    end


    -- モデルを解放

    reaper.AZ_TRSC_ReleaseModel(ctx)


    return trscTrackList

end


--------  ここまで REAPDOCK AZSTOKE_TRSC_CutSilentを参照 --------



C_id = "B"

C_serif = "C"

C_trsc = "D"


・ スプレッドシートの列を定義


R_header = 2


・ スプレッドシートのヘッダー行を定義


tableRange = "B3:B100"


・ スプレッドシートの検索範囲を定義(3行目から100行目までのB列)


function OutputGSheet(spreadSheetId, sheetId, trscTrackList)


・ スプレッドシートに文字起こし結果を出力する関数


    connection = reaper.AZ_GSheet_Connect_UserAccount(spreadSheetId)


・ スプレッドシートIDを指定して接続


    for _, trscTrack in pairs(trscTrackList) do -- トラックをループ


・ 文字起こし結果のトラックリストをループ


        itemList = reaper.AZ_GetMediaItemListInTrackItem(trscTrack)


・ 文字起こしトラック内にあるアイテムのリストを取得


        for i, noteItem in pairs(itemList) do


・ 文字起こしアイテムリストをループ


            region = reaper.AZ_GetRegionMarkerListMediaItem(noteItem)[1]

            voiceID = region["Name"]


・ リージョン名からvoiceIDを取得(これがセリフIDになる想定)


            trsc = reaper.AZ_GetMediaItemNotes(noteItem)


・ アイテムのノートから文字起こし結果を取得


            rows = reaper.AZ_GSheet_SearchRowsInWorksheet(connection, sheetId, voiceID, C_id, tableRange)


・ シートの指定範囲からセリフIDと一致する行を検索


            if #rows["Cells"] == 0 then


                Msg(voiceID .. " : 存在しません。")


・ 検索結果が0件の場合、存在しない旨をメッセージ表示


            else


                rowNumber = rows["Cells"][1]["RowNumber"]


・ 検索結果が存在する場合、最初の一致行の行番号を取得


                reaper.AZ_GSheet_SetCellValue(connection, sheetId, C_trsc .. rowNumber, trsc)


・ 取得したD列の行番号のセルに文字起こし結果を書き込む


                Msg(voiceID .. " : 文字起こしを書き込みました。")


・ 書き込み完了のメッセージ表示


            end

        end

    end


    reaper.AZ_GSheet_Disconnect(connection)


・ シートから切断


end



function main()


・ メイン関数


    retval, inputList = reaper.AZ_GetUserInputList("", 2, "スプレッドシートID,シートID", "**********,**********")

    if retval == false then return end


・ ユーザー入力を取得(キャンセルの場合は終了)


    spreadSheetId = inputList[1]

    sheetId_str = inputList[2]

    sheetId = tonumber(sheetId_str)


・ スプレッドシートIDとシートIDを取得し、シートIDを数値に変換


    mediaItemList = reaper.AZ_GetSelectedMediaItemList(0)


・ 選択されているメディアイテムのリストを取得


    cutAllItemList = {}


・ 切り出したアイテムを格納するリストを初期化


    for i, item in pairs(mediaItemList) do


        cutItemList = CutSilent(item)


・ 各アイテムに対して無音部分を切り出す関数を呼び出し、切り出したアイテムのリストを取得


        for j, cutItem in pairs(cutItemList) do

            table.insert(cutAllItemList, cutItem)

        end


・ 切り出したアイテムを全てのアイテムのリストに追加


    end


    trscTrackList = Transcription(cutAllItemList)


・ 切り出したアイテムのリストに対して文字起こしを実行


    OutputGSheet(spreadSheetId, sheetId, trscTrackList)


・ 文字起こしした結果をスプレッドシートに出力


end



main()


・ メイン関数を呼び出して処理を開始

- API LINK -
- API LINK -

Transcription

AZSTOKE_TRSC_OutputToGoogleSheets

文字起こし結果をスプレッドシートに記載する

01_BRONZE_ss_edited.png
01_SILVER_edited_edited.png
03_GOLD_edited_edited.png
bottom of page