我在我的 flutter 项目中使用了 record 包,并将通过 pcm16 位编码器从音频流生成音频文件。就目前而言。稍后我会将此流发送到我的语音转音频端点。这是我的代码库:
Future<void> startRecording() async {
try {
if (await audioRecord.hasPermission()) {
final file = File('/Users/steffen/Documents/steffen.wav');
stream = await audioRecord.startStream(const RecordConfig(encoder: AudioEncoder.pcm16bits, echoCancel: true, noiseSuppress: true));
stream.listen((data) {
audioDataBuffer.addAll(data.toList());
file.writeAsBytesSync(data, mode: FileMode.append);
}, onDone: () => {
sendFileToBackend()
},
onError: (e) => log(e.toString())
);
setState(() {
isRecording = true;
});
}
} catch (e) {
log(e.toString());
}
}
Future<void> stopRecording() async {
try {
await audioRecord.stop();
setState(() {
isRecording = false;
});
} catch (e) {
log(e.toString());
}
}
void sendFileToBackend() async {
if(audioDataBuffer.isNotEmpty){
Uri uri = Uri.parse('http://localhost:8000/speech-to-text/');
var request = http.MultipartRequest('POST', uri);
//var file = http.MultipartFile('file', stream, data.length);
var file = http.MultipartFile.fromBytes(
'file', audioDataBuffer, filename: 'speech.wav',
contentType: MediaType('application', 'octet-stream'));
我的流可能需要一个标头吗?
对于任何想要解决同样问题的人来说,这确实是由于缺少文件头引起的。 @Dhalloo 的这个answer用于创建标题。