Files
ObsidianHome/思睿/vocab_audio_tools/generate_vocab_audio.ps1
T
2026-11-05 15:16:24 +08:00

54 lines
1.6 KiB
PowerShell

param(
[string]$DataJson = "vocab_audio_output\vocab_days.json",
[string]$OutDir = "vocab_audio_output\audio",
[string]$Voice = "Microsoft Zira Desktop",
[int]$Rate = -2,
[int]$Volume = 100
)
$ErrorActionPreference = "Stop"
Add-Type -AssemblyName System.Speech
$data = Get-Content -LiteralPath $DataJson -Encoding UTF8 -Raw | ConvertFrom-Json
New-Item -ItemType Directory -Force -Path $OutDir | Out-Null
$synth = New-Object System.Speech.Synthesis.SpeechSynthesizer
$synth.SelectVoice($Voice)
$synth.Rate = $Rate
$synth.Volume = $Volume
$format = New-Object System.Speech.AudioFormat.SpeechAudioFormatInfo(
16000,
[System.Speech.AudioFormat.AudioBitsPerSample]::Sixteen,
[System.Speech.AudioFormat.AudioChannel]::Mono
)
$breakShort = [TimeSpan]::FromMilliseconds(320)
$breakLong = [TimeSpan]::FromMilliseconds(640)
foreach ($day in $data.days) {
$dayNumber = [int]$day.day
$path = Join-Path $OutDir ("Day{0:D2}.wav" -f $dayNumber)
$builder = New-Object System.Speech.Synthesis.PromptBuilder(
[System.Globalization.CultureInfo]::GetCultureInfo("en-US")
)
foreach ($entry in $day.entries) {
$term = ([string]$entry.spoken).Trim()
if ([string]::IsNullOrWhiteSpace($term)) {
continue
}
$builder.AppendText($term)
$builder.AppendBreak($breakShort)
$builder.AppendText($term)
$builder.AppendBreak($breakLong)
}
$synth.SetOutputToWaveFile($path, $format)
$synth.Speak($builder)
$synth.SetOutputToNull()
Write-Host ("Day {0:D2}: wrote {1}" -f $dayNumber, $path)
}
$synth.Dispose()