- 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 -
- API LINK -
Transcription
AZSTOKE_TRSC_NoticeToSlack
台本との比較結果をslackに通知









