最近、私が録画した中国語のビデオを日本語に変換する必要が出てきました。基本的な流れは以下の通りです:
- 中国語のビデオを準備
- 字幕(.srt)を抽出
- 字幕を最適化
- 日本語に翻訳
- 日本語音声を生成
- ビデオに合成
現在、この機能を持つソフトウェアはたくさんありますが、有料のものが多く、自前で実現することで、コードを手元に残しておくことができます。これにより統合が容易になります。
コードを見てみましょう
以下に示すのは、smartfill.srt
という字幕ファイルの内容です:
1
00:00:02,912 --> 00:00:05,905
こんにちは、今日は皆さんに紹介します。
2
00:00:05,905 --> 00:00:08,412
一つの生成型AIに基づいた
3
00:00:08,412 --> 00:00:11,162
インテリジェントな補助ツール、
4
00:00:11,162 --> 00:00:13,913
入力ツール、smart fillです。
...
このコードは、MicrosoftのSpeechサービスを使用します。既に手元にあるものを利用するため、料金はかかりますが、再購入の必要はありません。このコードの基本的な流れは、.srtファイルをSpeechで認識可能なSSMLに変換し、それをSpeech APIに渡すことです。
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.CognitiveServices.Speech;
string subscriptionKey = File.ReadAllText("C:/GPT/audiokey.txt");
string region = "westus2";
var config = SpeechConfig.FromSubscription(subscriptionKey, region);
var voceName = "ja-JP-KeitaNeural";
config.SpeechSynthesisVoiceName = voceName;
using var synthesizer = new SpeechSynthesizer(config, null);
synthesizer.SynthesisStarted += (s, e) =>
{
Console.WriteLine($"开始生成音频……");
};
synthesizer.SynthesisCompleted += (s, e) =>
{
Console.WriteLine($"生成语音完成!");
};
var subtitles = ParseSrt(Directory.GetCurrentDirectory() + "/smartfill.srt");
var voices = ParseVoices(subtitles);
var ssml = BuildSSML(voices);
using (var result = await synthesizer.SpeakSsmlAsync(ssml.ToString()))
{
if (result.Reason == ResultReason.SynthesizingAudioCompleted)
{
using (var outputStream = new FileStream("smartfill.wav", FileMode.Create))
{
using (var waveFileWriter = new NAudio.Wave.WaveFileWriter(outputStream, new NAudio.Wave.WaveFormat(16000, 16, 1)))
{
waveFileWriter.Write(result.AudioData, 0, result.AudioData.Length);
}
}
}
else
{
Console.WriteLine($"语音合成失败:{result.Reason}");
}
}
最後の結果
もちろん、品質の向上と最適化が必要ですが、ここでは詳細は省略します。
(Translated by GPT)