Transcript4netのアップデートについて
Transcript4netのアップデートについて
以前、Teamsのトランスクリプトについて、発話者や内容を整理するプログラムを紹介しました!
dotnetでTeamsのトランスクリプトを活用
今回はこのライブラリをアップデートしたので、追加した機能を紹介していきたいと思います。
よければ実際にライブラリを使ってみてください!
なお、もっとこうしたほうが良いなどのご意見があれば宜しくお願いいたします。
Transcript4CSV
アップデート内容
それでは、アップデートの内容を紹介していきます。
- 多くのvttファイルに対応
vttファイルといっても、色々な形式のファイルが存在していることがわかりました。
一般的には前回紹介した例のようにvタグで囲われているものと思っていましたが、実際にはvタグが存在せず行ごとにデータが記されているものも存在しました。
WEBVTT xxxxxxxxxxxxxxxx-xx 00:00.000 --> 00:02.000 よろしくお願いいたします。 xxxxxxxxxxxxxxxx-xx 00:02.000 --> 00:06.000 はい、よろしくお願いします。このように、1行目が発話時間、2行目は発話者情報、3行目は発話内容となっています。
※同じTeams内で異なる形式のファイルがダウンロードできてしまうのはどうなのでしょうか。。
他にも、下記のような形式も存在しており、多くのバリエーションに対応する必要が出てきました。。
WEBVTT 00:00.000 --< 00:02.000 よろしくお願いいたします。 00:02.000 --< 00:06.000 はい、よろしくお願いします。
OpenAIのWhisperを利用した際に出力されるvttファイルはこの形式のため、これが一般的なのでしょうか。
私はTeasmでvttファイルを知ったので、もしかしたらTeamsのVタグ形式の方が特殊事例だったりして。。
と言うこともあり、バリエーションが増えたとしても、しっかりデータを取り出せるように改修をいれています。
新しくTypeCheckFunctionというクラスを作成し、ここで抽出するためのキーパターンを整理できるようになっています。
using System;
using System.Text;
using System.Text.RegularExpressions;
using Transcript4CSV.Model;
namespace Transcript4CSV.Functions;
class TypeCheckFunction
{
private static List keyList = new List()
{
@"(?(\d{1,2}:\d{1,2}:\d{1,2}.\d{1,3})*?)" + " --> " + @"(?(\d{1,2}:\d{1,2}:\d{1,2}.\d{3})*?)\r\n" + ".*?)>(?.*?) ",
@"(?.*?)\r\n" + @"(?(\d{1,2}:\d{1,2}:\d{1,2}.\d{1,3})*?)" + " --> " + @"(?(\d{1,2}:\d{1,2}:\d{1,2}.\d{3})*?)\r\n" + @"(?.*?)\r\n",
@"(?(\d{1,2}:\d{1,2}.\d{1,3})*?)" + " --> " + @"(?(\d{1,2}:\d{1,2}.\d{3})*?)\r\n" + @"(?.*?)\r\n"
};
public static string GetLineKey(string text)
{
string lineKey = "";
foreach(string str in keyList)
{
Regex reg = new Regex(str, RegexOptions.IgnoreCase | RegexOptions.Singleline);
Match m = reg.Match(text);
if(m.Success)
{
lineKey = str;
break;
}
}
return lineKey;
}
}
ちょっと無理矢理感がありますが、キーパターンのリストを作成し、ファイル内容と照らし合わせ、マッチする場合はそのキーパターンをメイン処理に返す仕組みになっています。これで、データを抽出できるキーパターンを選定することができ、あたらしいパターンが見つかった際にも追加が容易になります。
実際に処理をする際には、上記のクラスからメソッドを呼び出しキーパターンを取得し、それをもとにファイルデータを抽出していきます。
string lineKey = TypeCheckFunction.GetLineKey(text);
Regex reg = new Regex(lineKey, RegexOptions.IgnoreCase | RegexOptions.Singleline);
for (Match m = reg.Match(text); m.Success; m = m.NextMatch())
{
string formatStr = wordFunction.Formatting(m.Groups["text"].Value);
modelList.Add(new UtteranceData { Speaker = m.Groups["speaker"].Value, Text = formatStr, StartDate = m.Groups["start"].Value, EndDate = m.Groups["end"].Value });
}
1つ目の機能追加はvttファイルの多様化対応でした!
先程のvttファイル多様化に合わせて、句読点の存在しないvttファイルも存在することがわかりました。代わりに半角空白で文字が区切られていました。
正直、句読点が無いなら無いでも良かったのですが、半角空白を除去しようとすると句読点用の空白も除去してしまい、文が読みにくくなってしまう事象が発覚したため、句読点対応を追加しました。
半角空白ですが、句読点用のものと英単語間の空白など色々な用途で使われてるため、単純にReplaceさせてしまうと英語にも影響がでてしまいます。
そのため、正規表現を使い「アルファベット+半角空白+アルファベット」以外を検知し、Replaceさせるようにします。
private static string AddPunctuationBetweenJapaneseAndJapanese(string text)
{
string str = text;
Regex reg = new Regex("(?[^A-Za-z]) (?[^A-Za-z])");
for (Match m = reg.Match(str); m.Success; m = m.NextMatch())
{
if(m.Groups["endChar"].Value == "す" || m.Groups["endChar"].Value == "た" || m.Groups["endChar"].Value == "る")
{
str = str.Replace(m.Value, m.Groups["endChar"] + "。" + m.Groups["startChar"]);
}
else
{
str = str.Replace(m.Value, m.Groups["endChar"] + "、" + m.Groups["startChar"]);
}
}
return str;
}
上記のAddPunctuationBetweenJapaneseAndJapaneseという置換メソッドを作成しました。2行目で「アルファベット+半角空白+アルファベット」以外を検知する正規表現を作成し、それをもとに引数の文字列から検知をしていきます。
for文内のif文では、句点と読点を制御しています。半角空白前の文字が「す」or「た」or「る」であれば読点、それ以外なら句点になるようにしています。
また、上記のメソッドだけでは文字列の最後に句読点を付与できません。なので下記コードも追加をしておきます。
formattingText = AddPunctuationBetweenJapaneseAndJapanese(formattingText);
char result = formattingText[formattingText.Length - 1];
if(result == 'す' || result == 'た' || result == 'る')
{
formattingText += "。";
}
else if(result != '。' && result != '、')
{
formattingText += "、";
}
以上、2つ目の機能追加は句読点対応でした!
さいごに
今回は自作ライブラリである「Transcript4CSV」の追加機能紹介をしました。
ここ最近の悩みとしては、Teamsのトランスクリプトが主催者しかダウンロードできなくなったことでしょうか。。
それにより、このライブラリを使おうにも、主催者に連携依頼をしないといけないですし、、
途中で記載しましたが、vttファイルが結構形式があるようで、「実はこのシステムではこの形式になっている」ということがあれば、 このライブラリも対応できるようにしていきたいと思います。
またアップデートすることがあれば、このブログで紹介していこうと思います。
今回はこのへんで、ではまた!
コメント
コメントを投稿