top of page
- Script Code -

dofile(reaper.AZ_GetLuaInitPath())

require("reaper_AZSTOKE_BRONZE")

require("reaper_AZSTOKE_SILVER")

require("reaper_AZSTOKE_GOLD")


function Transcription(track)


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


    itemList = reaper.AZ_GetMediaItemListInTrackItem(track)


    -- モデルを読み込み

    ctx = reaper.AZ_TRSC_LoadModel()


    for i, item in pairs(itemList) do


       -- 文字起こし実行

       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)


    end


    -- モデルを解放

    reaper.AZ_TRSC_ReleaseModel(ctx)


    reaper.AZ_ShowMessageBox_Info("文字起こしが終了しました", "", reaper.AZ_WindowType_OK())


    return trscTrack


end


C_id = "B"

C_serif = "C"

C_trsc = "D"

C_similarity = "E"

R_header = 2


tableRnage = "3:100,B"


function OutputExcel(excelDocPath, voiceTrack)


    scriptTable = {}


    charID = reaper.AZ_GetTrackItemName(voiceTrack)

    childrenList, count = reaper.AZ_GetTrackItemChildList(voiceTrack)


    trscTrack = childrenList[1]


    itemList = reaper.AZ_GetMediaItemListInTrackItem(trscTrack)


    excelDoc = reaper.AZ_Excel_OpenFile(excelDocPath)


    if reaper.AZ_GetErrorCode() ~= 0 then

        reaper.AZ_ShowMessageBox_Error("Excelファイルの読み込みに失敗しました。", "Error", reaper.AZ_WindowType_OK())

        reaper.AZ_Excel_CloseFile(excelDoc)

        return

    end


    reaper.AZ_Excel_SaveDocument(excelDoc)


    if reaper.AZ_GetErrorCode() ~= 0 then

        reaper.AZ_ShowMessageBox_Error("Excelファイルを閉じてください。", "Error", reaper.AZ_WindowType_OK())

        reaper.AZ_Excel_CloseFile(excelDoc)

        return

    end


    worksheet = reaper.AZ_Excel_OpenWorksheet(excelDoc, charID)


    if reaper.AZ_GetErrorCode() == 53 then

        reaper.AZ_ShowMessageBox_Error("シートが存在しません。", "Error", reaper.AZ_WindowType_OK())

        reaper.AZ_Excel_CloseFile(excelDoc)

        return

    end


    rows = reaper.AZ_Excel_SearchRowsInWorksheet(worksheet, voiceID, C_id, tableRnage)


    for i, noteItem in pairs(itemList) do

        region = reaper.AZ_GetRegionMarkerListMediaItem(noteItem)[1]


        voiceID = region["Name"]


        trsc = reaper.AZ_GetMediaItemNotes(noteItem)


        exists = false

        for j, row in pairs(rows["Cells"]) do


            if row[C_id] == voiceID then


                serif = reaper.AZ_Excel_GetCellValue(worksheet, C_serif .. j)


                similarity = reaper.AZ_CalcStringSimilarity(trsc, serif)


                reaper.AZ_Excel_SetCellValue(worksheet, C_trsc .. j, trsc)

                reaper.AZ_Excel_SetCellValue(worksheet, C_similarity .. j, similarity)


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


                scriptItem = {

                    ID = voiceID,

                    NoteItem = noteItem,

                    Serif = serif,

                    Trsc = trsc,

                    Similarity = similarity

                }


                table.insert(scriptTable, scriptItem)


                exists = true

            end

        end


        if exists == false then

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

        end

    end


    reaper.AZ_Excel_SaveDocument(excelDoc)

    reaper.AZ_Excel_CloseFile(excelDoc)


    return scriptTable

end



function CheckSimilarity(voiceTrack, scriptTable, thresould)


    errorVoiceList = {}


    mediaItemList = reaper.AZ_GetMediaItemListInTrackItem(voiceTrack)


    for i, voiceMedia in pairs(mediaItemList) do

        voiceID = reaper.AZ_GetMediaItemName(voiceMedia)


        for j, scriptItem in pairs(scriptTable) do

            if scriptItem["ID"] == voiceID then


              if scriptItem["Similarity"] < thresould then


                  table.insert(errorVoiceList, voiceID)


                  region = reaper.AZ_GetRegionMarkerListMediaItem(voiceMedia)[1]


                  reaper.AZ_SetRegionMarkerColor(0, region["Index"], 255)


              end


            end

        end


    end


    return errorVoiceList


end


function GetSlackUserData()

    slackDataPath = reaper.GetResourcePath() .. "\\AZData\\Slack"


    token = reaper.AZ_ReadFile(slackDataPath, "slackToken.txt")


    userName =  reaper.AZ_ReadFile(slackDataPath, "slackUser.txt")


    if userName == "" or token == "" then

        retval, obj = reaper.AZ_GetUserInputList("SlackInfo", 2, "slackトークン,通知先ユーザー", token..","..userName )

        token = obj[1]

        userName = obj[2]

        reaper.AZ_WriteFile(slackDataPath, "slackToken.txt", token, 0)

        reaper.AZ_WriteFile(slackDataPath, "slackUser.txt", userName, 0)

    else

        token = reaper.AZ_ReplaceSearchString(token, "\n", "")

        userName = reaper.AZ_ReplaceSearchString(userName, "\n", "")

    end


    return token, userName

end


function SendSlackMessage(token, userName, caption, body)



    slackMessage = reaper.AZ_Slack_PostDirectMessage(token, userName, caption, false)


    if slackMessage ~= nil then


      t0 = os.clock()

      while os.clock() - t0 <= 5 do end


      slackMessage = reaper.AZ_Slack_ReplayMessage(token, slackMessage["Channel"], slackMessage["TimeStamp"], body)


    end

end



function main()


    excelDocPath = "D:\\reapdock\\voice\\Scripts.xlsx"

    threshould = 80


    retval, inputList = reaper.AZ_GetUserInputList("", 2, "台本パス,台本一致許容度", excelDocPath.."," .. tostring(threshould))

    if retval == false then return end


    token, userName = GetSlackUserData()


    excelDocPath = inputList[1]

    threshould = tonumber(inputList[2])


    voiceTrack = reaper.GetSelectedTrack(0, 0)


    if voiceTrack == nil then

        reaper.AZ_ShowMessageBox_Error("トラックが選択されていません。", "Error", reaper.AZ_WindowType_OK())

        return

    end


    -- リージョン作成

    itemList = reaper.AZ_GetMediaItemListInTrackItem(voiceTrack)

    for i, item in pairs(itemList) do

        reaper.AZ_AddRegionMarkerMediaItem(item)

    end


    Transcription(voiceTrack)


    scriptTable = OutputExcel(excelDocPath, voiceTrack)


    caption = "ボイスの文字起こしと台本チェックが完了しました。"


    if scriptTable == nil then

        Msg(caption)


        message = "Excelの書き込みに失敗しました。"

        Msg(message)


        SendSlackMessage(token, userName, caption, message)


    elseif #scriptTable > 0 then

        Msg(caption)


        errorVoiceList = CheckSimilarity(voiceTrack, scriptTable, threshould)


        message = "以下のボイスが台本と一致していない可能性があります。"

        Msg(message)

        ShowObject(errorVoiceList)


        message = message .. "\n" .. "```"

        for i, errorVoice in pairs(errorVoiceList) do

            message= message .. errorVoice .. "\n"

        end

        message = message .. "```"


        SendSlackMessage(token, userName, caption, message)

    else

        Msg(caption)


        message = "台本と相違があるボイスはありませんでした。"

        Msg(message)


        SendSlackMessage(token, userName, caption, message)

    end


end


main()

- Warm Up -

  • Reaperにボイスのメディアを並べる

  • 台本用のExcelファイルを用意する

- Script Detail -

dofile(reaper.AZ_GetLuaInitPath())

require("reaper_AZSTOKE_BRONZE")  

require("reaper_AZSTOKE_SILVER")   

require("reaper_AZSTOKE_GOLD")   


******** AZSTOKE_TRSC_OutputToProject参照 ******


function Transcription(track)


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

    

    itemList = reaper.AZ_GetMediaItemListInTrackItem(track)

    

    -- モデルを読み込み

    ctx = reaper.AZ_TRSC_LoadModel()

    

    for i, item in pairs(itemList) do

       

       -- 文字起こし実行

       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)

       

    end

    

    -- モデルを解放

    reaper.AZ_TRSC_ReleaseModel(ctx)

    

    reaper.AZ_ShowMessageBox_Info("文字起こしが終了しました", "", reaper.AZ_WindowType_OK())

    

    return trscTrack


end


******** AZSTOKE_TRSC_OutputToProject参照 ここまで ******


******** AZSTOKE_TRSC_OutputToExcel参照 ******


C_id = "B"

C_serif = "C"

C_trsc = "D"

C_similarity = "E"

R_header = 2


tableRnage = "3:100,B"


function OutputExcel(excelDocPath, voiceTrack)


    scriptTable = {}


    charID = reaper.AZ_GetTrackItemName(voiceTrack)

    childrenList, count = reaper.AZ_GetTrackItemChildList(voiceTrack)

    

    trscTrack = childrenList[1]

    

    itemList = reaper.AZ_GetMediaItemListInTrackItem(trscTrack)

    

    excelDoc = reaper.AZ_Excel_OpenFile(excelDocPath)

    

    if reaper.AZ_GetErrorCode() ~= 0 then

        reaper.AZ_ShowMessageBox_Error("Excelファイルの読み込みに失敗しました。", "Error", reaper.AZ_WindowType_OK())

        reaper.AZ_Excel_CloseFile(excelDoc)

        return

    end

    

    reaper.AZ_Excel_SaveDocument(excelDoc)

    

    if reaper.AZ_GetErrorCode() ~= 0 then

        reaper.AZ_ShowMessageBox_Error("Excelファイルを閉じてください。", "Error", reaper.AZ_WindowType_OK())

        reaper.AZ_Excel_CloseFile(excelDoc)        

        return

    end

    

    worksheet = reaper.AZ_Excel_OpenWorksheet(excelDoc, charID)

    

    if reaper.AZ_GetErrorCode() == 53 then

        reaper.AZ_ShowMessageBox_Error("シートが存在しません。", "Error", reaper.AZ_WindowType_OK())

        reaper.AZ_Excel_CloseFile(excelDoc)

        return

    end

    

    rows = reaper.AZ_Excel_SearchRowsInWorksheet(worksheet, voiceID, C_id, tableRnage)

    

    for i, noteItem in pairs(itemList) do

        region = reaper.AZ_GetRegionMarkerListMediaItem(noteItem)[1]

        

        voiceID = region["Name"]

        

        trsc = reaper.AZ_GetMediaItemNotes(noteItem)

         

        exists = false

        for j, row in pairs(rows["Cells"]) do

        

            if row[C_id] == voiceID then

            

                serif = reaper.AZ_Excel_GetCellValue(worksheet, C_serif .. j)

                

                similarity = reaper.AZ_CalcStringSimilarity(trsc, serif)

                

                reaper.AZ_Excel_SetCellValue(worksheet, C_trsc .. j, trsc)

                reaper.AZ_Excel_SetCellValue(worksheet, C_similarity .. j, similarity)

                

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

                

                scriptItem = {

                    ID = voiceID,

                    NoteItem = noteItem,

                    Serif = serif,

                    Trsc = trsc,

                    Similarity = similarity

                }

                

                table.insert(scriptTable, scriptItem)

                

                exists = true

            end

        end

        

        if exists == false then

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

        end

    end

    

    reaper.AZ_Excel_SaveDocument(excelDoc)

    reaper.AZ_Excel_CloseFile(excelDoc)

    

    return scriptTable

end



******** AZSTOKE_TRSC_OutputToExcel参照 ここまで******


******** AZSTOKE_TRSC_CheckSimilarity参照 ******


function CheckSimilarity(voiceTrack, scriptTable, thresould)


    errorVoiceList = {}


    mediaItemList = reaper.AZ_GetMediaItemListInTrackItem(voiceTrack)

    

    for i, voiceMedia in pairs(mediaItemList) do

        voiceID = reaper.AZ_GetMediaItemName(voiceMedia)

        

        for j, scriptItem in pairs(scriptTable) do

            if scriptItem["ID"] == voiceID then

              

              if scriptItem["Similarity"] < thresould then

              

                  table.insert(errorVoiceList, voiceID)

                  

                  region = reaper.AZ_GetRegionMarkerListMediaItem(voiceMedia)[1]

                  

                  reaper.AZ_SetRegionMarkerColor(0, region["Index"], 255)

                  

              end            

            

            end

        end

        

    end

    

    return errorVoiceList


end


******** AZSTOKE_TRSC_CheckSimilarity参照 ここまで******


function GetSlackUserData()


・ Slackのトークンと通知先ユーザーを取得する関数


    slackDataPath = reaper.GetResourcePath() .. "\\AZData\\Slack" 


・ Slackのトークンと通知先ユーザーを保存するパス

    

    token = reaper.AZ_ReadFile(slackDataPath, "slackToken.txt")

    

    userName =  reaper.AZ_ReadFile(slackDataPath, "slackUser.txt")


・ Slackのトークンと通知先ユーザーをファイルから読み込む

    

    if userName == "" or token == "" then

        retval, obj = reaper.AZ_GetUserInputList("SlackInfo", 2, "slackトークン,通知先ユーザー", token..","..userName )


・ Slackのトークンと通知先ユーザーが保存されていない場合、ユーザーに入力を促すダイアログを表示


        token = obj[1]

        userName = obj[2]

        reaper.AZ_WriteFile(slackDataPath, "slackToken.txt", token, 0)

        reaper.AZ_WriteFile(slackDataPath, "slackUser.txt", userName, 0)


・ ユーザーが入力したSlackのトークンと通知先ユーザーをファイルに保存


    else

        token = reaper.AZ_ReplaceSearchString(token, "\n", "")

        userName = reaper.AZ_ReplaceSearchString(userName, "\n", "")


・ ファイルから読み込んだSlackのトークンと通知先ユーザーから改行コードを削除

    end

    

    return token, userName


・ Slackのトークンと通知先ユーザーを返す

end


function SendSlackMessage(token, userName, caption, body)


・ Slackにメッセージを送信する関数


    slackMessage = reaper.AZ_Slack_PostDirectMessage(token, userName, caption, false)


・ SlackのAPIを使用して、指定されたユーザーにメッセージを送信


    if slackMessage ~= nil then


・ メッセージの送信に成功した場合

    

      t0 = os.clock()

      while os.clock() - t0 <= 5 do end


・ メッセージの送信後、一定時間待機(SlackのAPIの反映を待つため)

      

      slackMessage = reaper.AZ_Slack_ReplayMessage(token, slackMessage["Channel"], slackMessage["TimeStamp"], body)


・ 送信したメッセージに対して、さらに内容を追加するためのAPIを呼び出す

   

    end

end



function main()


    excelDocPath = "D:\\reapdock\\voice\\Scripts.xlsx"

    threshould = 80


    retval, inputList = reaper.AZ_GetUserInputList("", 2, "台本パス,台本一致許容度", excelDocPath.."," .. tostring(threshould))

    if retval == false then return end

    

    token, userName = GetSlackUserData()

    

    excelDocPath = inputList[1]

    threshould = tonumber(inputList[2])

    

    voiceTrack = reaper.GetSelectedTrack(0, 0)

    

    if voiceTrack == nil then

        reaper.AZ_ShowMessageBox_Error("トラックが選択されていません。", "Error", reaper.AZ_WindowType_OK())

        return

    end


    -- リージョン作成

    itemList = reaper.AZ_GetMediaItemListInTrackItem(voiceTrack)

    for i, item in pairs(itemList) do

        reaper.AZ_AddRegionMarkerMediaItem(item)

    end

    

    Transcription(voiceTrack)

    

    scriptTable = OutputExcel(excelDocPath, voiceTrack)

    

    caption = "ボイスの文字起こしと台本チェックが完了しました。"


・ ボイスの文字起こしと台本チェックが完了したことを知らせるキャプション

    

    if scriptTable == nil then 

        Msg(caption)

        

        message = "Excelの書き込みに失敗しました。"

        Msg(message)

        

        SendSlackMessage(token, userName, caption, message)


・ Excelの書き込みに失敗した場合、Slackにエラーメッセージを送信

        

    elseif #scriptTable > 0 then

        Msg(caption)  

        

        errorVoiceList = CheckSimilarity(voiceTrack, scriptTable, threshould)

        

        message = "以下のボイスが台本と一致していない可能性があります。"

        Msg(message)        

        ShowObject(errorVoiceList)


・ 台本と一致していない可能性のあるボイスのリストをコンソール表示

        

        message = message .. "\n" .. "```"

        for i, errorVoice in pairs(errorVoiceList) do

            message= message .. errorVoice .. "\n"

        end

        message = message .. "```"


・ 台本と一致していない可能性のあるボイスのリストをSlackに送信するためのメッセージを作成

・ メッセージのフォーマットは、コードブロック(``` ~ ```)を使用して見やすくする

        

        SendSlackMessage(token, userName, caption, message)


・ 台本と一致していない可能性のあるボイスのリストをSlackに送信


    else

        Msg(caption)

        

        message = "台本と相違があるボイスはありませんでした。"

        Msg(message)


        SendSlackMessage(token, userName, caption, message)


・ 台本と相違があるボイスがなかった場合、その旨をSlackに送信

    end

    

end


main()


- API LINK -
- RigYouTube -

Transcription

AZSTOKE_TRSC_NoticeToSlack

台本との比較結果をslackに通知

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