- 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 main()
excelDocPath = "D:\\reapdock\\voice\\Scripts.xlsx"
threshould = 80
retval, inputList = reaper.AZ_GetUserInputList("", 2, "台本パス,台本一致許容度", excelDocPath.."," .. tostring(threshould))
if retval == false then return end
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)
if scriptTable == nil then
Msg("Excelの書き込みに失敗しました。")
elseif #scriptTable > 0 then
errorVoiceList = CheckSimilarity(voiceTrack, scriptTable, threshould)
Msg("以下のボイスが台本と一致していない可能性があります。")
ShowObject(errorVoiceList)
else
Msg("台本と相違があるボイスはありませんでした。")
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)
・ Excelのシートに一致度を書き込む
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参照 ここまで******
function CheckSimilarity(voiceTrack, scriptTable, thresould)
errorVoiceList = {}
・ 台本と一致していない可能性のあるボイスを格納するリスト
mediaItemList = reaper.AZ_GetMediaItemListInTrackItem(voiceTrack)
・ ボイストラックのアイテムのリストを取得
for i, voiceMedia in pairs(mediaItemList) do
voiceID = reaper.AZ_GetMediaItemName(voiceMedia)
・ アイテムの名前をセリフIDとして取得
for j, scriptItem in pairs(scriptTable) do
if scriptItem["ID"] == voiceID then
・ 台本のテーブルからセリフIDが一致するアイテムを探す
if scriptItem["Similarity"] < thresould then
・ 一致度が閾値を下回っている場合
table.insert(errorVoiceList, voiceID)
・ 一致していない可能性のあるボイスのリストにセリフIDを追加
region = reaper.AZ_GetRegionMarkerListMediaItem(voiceMedia)[1]
・ アイテムに対応するリージョンを取得
reaper.AZ_SetRegionMarkerColor(0, region["Index"], 255)
・ 一致していない可能性のあるボイスのリージョンの色を赤に変更
end
end
end
end
return errorVoiceList
・ 一致していない可能性のあるボイスのリストを返す
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
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)
if scriptTable == nil then
Msg("Excelの書き込みに失敗しました。")
elseif #scriptTable > 0 then
errorVoiceList = CheckSimilarity(voiceTrack, scriptTable, threshould)
・ 台本と一致していない可能性のあるボイスのリストを取得
Msg("以下のボイスが台本と一致していない可能性があります。")
ShowObject(errorVoiceList)
・ 一致していない可能性のあるボイスのリストを表示
else
Msg("台本と相違があるボイスはありませんでした。")
end
end
main()
- API LINK -
- API LINK -
Transcription
AZSTOKE_TRSC_CheckSimilarity
文字起こし結果を台本と比較











