Google Cloud TTS生成MP3时动态文本开头音节丢失的解决办法咨询
Google Cloud TTS生成MP3时动态文本开头音节丢失的解决办法咨询
我最近做了一个调用Google Cloud Text-to-Speech的PHP服务,功能是把返回的base64解码后的audioContent直接写入MP3文件。现在遇到个头疼的问题:如果在动态文本前加一段硬编码的短语(比如“Ein Moment der Ruhe…”,和后面动态文本里可能出现的短语一致),这段硬编码内容播放完全正常,没有任何单词丢失;但只要动态文本一开头,前1-2个词总是会淡入或者直接被切掉。
我试过在SSML里加开头或中间的停顿标签,但不管怎么调整,生成的MP3播放时动态文本的开头部分还是有问题。因为我用的是虚拟主机,不想自己搞转码流程,就想直接用Google返回的MP3文件。有没有什么办法能保证动态文本的第一个音节不会丢失啊?
下面是我的服务代码:
namespace App\Services; class GoogleTtsService extends TtsService { private const API_URL = 'https://texttospeech.googleapis.com/v1/text:synthesize'; public function synthesize(string $text, array $options, string $outputPath, string $apiKey): bool { $breakMs = defined('TTS_INITIAL_BREAK_MS') ? TTS_INITIAL_BREAK_MS : 100; // 这段硬编码的短语播放完全正常 $ssml = '<speak>' . 'Ein Moment der Ruhe...' . '<break time="'. $breakMs .'ms"/>' . htmlspecialchars($text, ENT_QUOTES|ENT_XML1, 'UTF-8') // 这段永远播放不正常 . '</speak>'; $payload = [ 'input' => ['ssml' => $ssml], 'voice' => [ 'languageCode' => $options['language'] ?? 'de-DE', 'name' => $options['voice'] ?? 'de-DE-Standard-A' ], 'audioConfig' => [ 'audioEncoding' => 'MP3', 'speakingRate' => $options['speed'] ?? 1.0 ] ]; $response = $this->postJson(self::API_URL . '?key=' . urlencode($apiKey), $payload); if (empty($response['audioContent'])) { return false; } $audioData = base64_decode($response['audioContent']); return file_put_contents($outputPath, $audioData) !== false; } }
相关调试日志:
[28-Jun-2025 00:15:21] TTS chunk for job 311: text length=4159
[28-Jun-2025 00:15:21] SSML sent (first 100 chars):Ein Moment der Ruhe... Ein Moment der Ruhe am Morgen. Ein bewu…
有没有大佬能给点可行的解决建议呀?
内容来源于stack exchange
相关产品推荐
相关产品推荐

