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 -

  • Place audio files in Reaper in advance

  • Prepare a spreadsheet file for the script

- Script Detail -

dofile(reaper.AZ_GetLuaInitPath())

require("reaper_AZSTOKE_BRONZE")

require("reaper_AZSTOKE_SILVER")

require("reaper_AZSTOKE_GOLD")


・ Import RIGDOCKS


function CutSilent(mediaItem)


・ Function to extract silent parts of the audio


    cutItemList = {}

    silentSectionList = reaper.AZ_GetAudioSectionListInMediaItem(mediaItem, 0.2)

    currentItem = mediaItem

    prevSplitPos = 0


・ Initialize the current item and the previous split position


    baseName = reaper.AZ_GetMediaItemName(mediaItem)


・ Get the media name and save it to baseName


    for i, section in pairs(silentSectionList) do


・ Loop over the list of silent regions


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


・ Split the item at the start of the silent part and get the left and right items


        prevSplitPos = section["StartTime"]


・ Update the previous split position


        reaper.AZ_DeleteMediaItem(leftItem)


・ The left item is a silent part, so delete it


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


・ Split the right item at the end of the silent part and get the left and right items


        prevSplitPos = section["EndTime"]


・ Update the previous split position


        currentItem = rightItem


・ Update the current item to the right item (to split this item in the next loop)


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

        reaper.AZ_SetMediaItemName(leftItem, name)


・ Set a name on the extracted item using baseName with a number


        -- リージョン作成

        reaper.AZ_AddRegionMarkerMediaItem(leftItem)


・ Create a region based on the item name


        table.insert(cutItemList, leftItem)


・ Add the extracted item to the list


    end


    reaper.AZ_DeleteMediaItem(currentItem)


・ Also delete the last remaining item (the last item of the silent part)


    return cutItemList


・ Return the list of extracted items


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"


・ Define the spreadsheet columns


R_header = 2


・ Define the spreadsheet header row


tableRange = "B3:B100"


・ Define the spreadsheet search range (column B from row 3 to row 100)


function OutputGSheet(spreadSheetId, sheetId, trscTrackList)


・ Function to output transcription results to a spreadsheet


    connection = reaper.AZ_GSheet_Connect_UserAccount(spreadSheetId)


・ Connect by specifying the spreadsheet ID


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


・ Loop over the track list of transcription results


        itemList = reaper.AZ_GetMediaItemListInTrackItem(trscTrack)


・ Get the list of items in the transcription track


        for i, noteItem in pairs(itemList) do


・ Loop over the transcription item list


            region = reaper.AZ_GetRegionMarkerListMediaItem(noteItem)[1]

            voiceID = region["Name"]


・ Get voiceID from the region name (this is assumed to be the line ID)


            trsc = reaper.AZ_GetMediaItemNotes(noteItem)


・ Get the transcription result from the item's note


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


・ Search the specified range of the sheet for the row matching the line ID


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


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


・ If there are 0 search results, show a message that it does not exist


            else


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


・ If search results exist, get the row number of the first matching row


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


・ Write the transcription result into the cell at the retrieved column D row number


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


・ Show the write-complete message


            end

        end

    end


    reaper.AZ_GSheet_Disconnect(connection)


・ Disconnect from the sheet


end



function main()


・ Main function


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

    if retval == false then return end


・ Get user input (exit if canceled)


    spreadSheetId = inputList[1]

    sheetId_str = inputList[2]

    sheetId = tonumber(sheetId_str)


・ Get the spreadsheet ID and sheet ID, and convert the sheet ID to a number


    mediaItemList = reaper.AZ_GetSelectedMediaItemList(0)


・ Get the list of selected media items


    cutAllItemList = {}


・ Initialize the list to hold the extracted items


    for i, item in pairs(mediaItemList) do


        cutItemList = CutSilent(item)


・ Call the function to extract silent parts for each item and get the list of extracted items


        for j, cutItem in pairs(cutItemList) do

            table.insert(cutAllItemList, cutItem)

        end


・ Add the extracted item to the list of all items


    end


    trscTrackList = Transcription(cutAllItemList)


・ Run transcription on the list of extracted items


    OutputGSheet(spreadSheetId, sheetId, trscTrackList)


・ Output the transcription results to a spreadsheet


end



main()


・ Call the main function to start the process

- API LINK -
- API LINK -

Transcription

AZSTOKE_TRSC_OutputToGoogleSheets

Write transcription results to a spreadsheet

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