我正在创建一个Flutter插件。目前,代码:
1.将字符串合成为音频文件
1.获取文件的路径
1.使用audioplayers播放音频文件
当我在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
来确认文件的路径是正确的(它实际上获得了文件的持续时间),但是文件并没有播放。
我正在使用模拟器测试应用程序,这是存储文件的路径
/本地用户/设备/设备ID/数据/容器/数据/应用程序/应用程序ID/文档/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
,但在返回后显示以下错误:
图文件叉打开主文件按CFURL指示错误= 2(错误号)(打开失败)
尽管如此,使用正确的localPath
调用方法不会触发错误,因此我假设它应该正确地播放它。
- 注**
如果不调用playLocal()
,而是调用flutter_tts.speak('test')
,它就可以工作,因此,错误可能与audioplayers
有关。
我使用的版本是flutter_tts ^2.1.0
和audioplayers: ^0.17.3
5条答案
按热度按时间evrscar21#
将其添加到主.dart文件中,然后运行App(App());
5rgfhyps2#
最后,我意识到这个问题与
AVAudioSession
及其会话管理有关,flutter_tts
和audioplayers
这两个库都使用它,因此它们可以覆盖其他库。我不得不将方法更改为以下内容:
开始触发
iOS
中的一些音频。尽管如此,通知中还是有一些问题,但我认为答案已经得到了回答。rhfm7lfc3#
当您使用audio players播放声音并使用flutter_tts说话时,会使flutter_tts在iOS上无法正常工作
因此,只有其中一个包可以工作,但是一旦两个包同时使用,tts会在一段时间后停止工作,有时会持续更长时间,但有时会立即停止。
现实中,这是由于iOS端的冲突。
假设它在Android上工作,这意味着你的代码应该没有问题。
必须找到另一种替代办法。
bvn4nwqk4#
今天我修正了这个问题,我用的是来自URL的音频,我用的是这一行
我必须在代码中使用下面这行代码
isLocal
代表您的文件是否存储在本地。如果文件存储在远程,即以URL的形式,则设置为isLocal:false
。希望它能解决你的问题。
vulvrdjw5#
在使用IOS时使用play()方法代替playBytes()。int结果=0;如果(平台.isIOS){结果=等待player.play(“音频网址”,是本地的:错误); }