我正在创建一个 Flutter 插件。目前,代码:
当我在 Android 中运行该应用程序时,它完美运行。然而,当我在 iOS 上运行它时,它不会(假设相关权限/限制)
await flutterTts
.synthesizeToFile(
"This is my first audio synthesizer in Flutter", audioFileName)
.then((success) => {
if (success == 1)
{
print('Successfully synthesized!!'),
// Gets the path to the generated file depending on the platform
pathFile =
Platform.isAndroid ? pathToFileAndroid : pathToFileIos,
pathFile
.then((pathToAudioFile) => {
print('Path to file: ' + pathToAudioFile),
// Speakers/earpiece
// int result = await player.earpieceOrSpeakersToggle();
// Sets the path to the file
audioPlayer.setUrl(pathToAudioFile),
audioPlayer.setVolume(1.0),
// Gets the duration of the audio file to be reproduced
// Plays the audio file
playLocal(audioPlayer, pathToAudioFile),
}) // pathFile
.catchError((e) {
print('Error: Unable to get the path to the audio file');
}),
}, // success
}) //synthesizeToFile
.catchError((e) {
print('Error during the synthesisation: $e');
});
}
/// Gets the path to the file to be accessed (iOS)
static Future<String> get pathToFileIos async {
Directory appDocDir = await getApplicationDocumentsDirectory();
String appDocPath = appDocDir.path;
print('appDocPath: $appDocPath');
return '$appDocPath/$audioFileName';
}
我实现了 audioPlayer.onDurationChanged.listen
以确认文件路径是正确的(它实际上获取了文件的持续时间)。尽管如此,该文件并未播放。
我用模拟器测试应用程序,这是文件存放的路径
<块引用>/localPaty/Devices/deviceID/data/Containers/Data/Application/appID/Documents/temp_audio_cue.caf
我阅读了有关此主题的不同问题,但没有找到适合我的案例的解决方案
我试过了:
按照文档的建议编辑传输安全
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
使用 AudioCache
(question)
大家还有什么建议吗?我是否需要将文件移动到我的本地资产并使用 AudioCache
来复制文件?
更新
我也尝试添加标志 isLocal
。
playLocal() async {
int result = await audioPlayer.play(localPath, isLocal: true);
}
根据documentation是需要的原因
<块引用>isLocal 标志是必需的,因为 iOS 和 macOS 对此有所不同
它返回1
,所以我猜它意味着成功,但仍然没有触发声音。可能是模拟器失败了吗?
"iOS => call startHeadlessService, playerId ID"
"iOS => call setUrl, playerId ID"
"iOS => call setVolume, playerId ID"
"iOS => call play, playerId ID"
2021-02-03 11:59:33.149925+0100 Runner[61496:850044] flutter: Played successfully?: 1
我还测试过以错误的路径调用 playLocal()
。它不断返回 1
但之后它显示以下错误:
FigFileForkOpenMainByCFURL 发出信号 err=2 (errno)(打开失败)
尽管如此,使用正确的 localPath
调用方法不会触发错误,所以我认为它应该正确播放。
注意
如果不是调用 playLocal()
,而是调用 flutter_tts.speak('test')
,它会起作用。因此,错误应该与 audioplayers
相关。
我使用的版本是 flutter_tts ^2.1.0
和 audioplayers: ^0.17.3
答案 0 :(得分:0)
最后,我意识到问题与 AVAudioSession
及其会话管理有关。 flutter_tts
和 audioplayers
两个库都使用它,因此它们可以将它叠加在一起。
我不得不将方法更改为以下内容:
/// Synthesises the current audio cue into an audio file
static Future<void> synthesiseStringToAudioFile() async {
int synthesized = await flutterTts.synthesizeToFile(
"This is my first audio synthesizer in Flutter", audioFileName);
if (synthesized == 1) {
String pathFile =
await (Platform.isAndroid ? pathToFileAndroid : pathToFileIos);
print('Path to file: ' + pathFile);
playAudioFile(pathFile);
} else {
print('Error during the synthesisation');
}
}
开始触发 iOS
中的一些音频。尽管如此,通知中仍有一些问题,但我认为答案已经得到了解答。
答案 1 :(得分:0)
当你使用 audio players 播放声音并使用 flutter_tts 说词时,它会使 Flutter_tts 在 iOS 上功能失调
因此,只有一个包可以工作,但是一旦同时使用这两个包,tts 会在一段时间后停止工作。有时它会持续更长时间,但有时它会立即停止。
<块引用>实际上,这是由于 iOS 端的冲突。
假设它适用于 Android,这意味着您的代码应该没有问题。
必须找到另一种选择。