- 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
文字起こし結果をスプレッドシートに記載する









