0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

.srt字幕ファイルから.wav音声を生成する

Posted at

最近、私が録画した中国語のビデオを日本語に変換する必要が出てきました。基本的な流れは以下の通りです:

  1. 中国語のビデオを準備
  2. 字幕(.srt)を抽出
  3. 字幕を最適化
  4. 日本語に翻訳
  5. 日本語音声を生成
  6. ビデオに合成

現在、この機能を持つソフトウェアはたくさんありますが、有料のものが多く、自前で実現することで、コードを手元に残しておくことができます。これにより統合が容易になります。

コードを見てみましょう

以下に示すのは、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)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?