Flutter掌声检测插件detect_clap_sound_flutter的使用
Flutter掌声检测插件detect_clap_sound_flutter的使用
检测声音基于振幅参数
设置权限和其他
Android
<uses-permission android:name="android.permission.RECORD_AUDIO" />
- 最低SDK版本: 21
可以调整参数来检测不同类型的声音
DetectConfig
参数名 | 描述 | 默认值 |
---|---|---|
threshold | 识别声音的最小振幅阈值 | 30000 |
stableThreshold | 确定振幅返回到稳定水平的阈值,有助于防止重复检测 | 3000 |
amplitudeSpikeThreshold | 确定振幅突然变化(最大振幅和最小振幅之间的差异)的阈值,这可以表征掌声 | 28000 |
monitorInterval | 振幅检查间隔 | 50 |
windowSize | 测试窗口内的振幅样本数 | 5 |
使用方法
需要在要使用的Dart文件中导入包
import 'package:detect_clap_sound_flutter/detect_clap_sound_flutter.dart';
检查麦克风(录音)权限
final DetectClapSoundFlutter detectClapSoundFlutterPlugin = DetectClapSoundFlutter();
final status = await detectClapSoundFlutterPlugin.hasPermission();
请求权限
final DetectClapSoundFlutter detectClapSoundFlutterPlugin = DetectClapSoundFlutter();
final status = await detectClapSoundFlutterPlugin.requestPermission();
检查音频录制是否正在进行
final DetectClapSoundFlutter detectClapSoundFlutterPlugin = DetectClapSoundFlutter();
final isRecording = await detectClapSoundFlutterPlugin.isRecording();
开始录制
final DetectClapSoundFlutter detectClapSoundFlutterPlugin = DetectClapSoundFlutter();
/// 你可以设置文件名或路径。
/// 或更改音频检测配置参数。
detectClapSoundFlutterPlugin.startRecording();
监听录制并检测声音
final DetectClapSoundFlutter detectClapSoundFlutterPlugin = DetectClapSoundFlutter();
detectClapSoundFlutterPlugin.onListenDetectSound().listen(
(int times) {
// TODO 做一些事情。
},
);
停止录制
final DetectClapSoundFlutter detectClapSoundFlutterPlugin = DetectClapSoundFlutter();
final path = await detectClapSoundFlutterPlugin.stopRecording();
作为始终不要忘记这一条
final DetectClapSoundFlutter detectClapSoundFlutterPlugin = DetectClapSoundFlutter();
detectClapSoundFlutterPlugin.dispose();
完整示例
import 'dart:developer';
import 'package:detect_clap_sound_flutter/detect_clap_sound_flutter.dart';
import 'package:detect_clap_sound_flutter_example/widget/example_button.dart';
import 'package:flutter/material.dart';
import 'dart:async';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
/// 定义 [_detectClapSoundFlutterPlugin] 来使用插件。
final DetectClapSoundFlutter _detectClapSoundFlutterPlugin = DetectClapSoundFlutter();
/// 定义 [_hasPermission] 来获取权限状态。
bool _hasPermission = false;
/// 定义 [_isRecording] 来设置录制状态。
bool _isRecording = false;
/// 定义 [_clapSubscription] 来设置订阅和监听。
StreamSubscription<int>? _clapSubscription;
/// 定义 [_clapTimes] 来计数掌声次数。
int _clapTimes = 0;
[@override](/user/override)
void initState() {
super.initState();
_getStatusRecordPermission();
_listenDetectSound();
}
[@override](/user/override)
void dispose() {
_clapSubscription?.cancel();
_detectClapSoundFlutterPlugin.dispose();
super.dispose();
}
/// [_listenDetectSound] 来监听录制并检测声音。
void _listenDetectSound() {
_clapSubscription = _detectClapSoundFlutterPlugin.onListenDetectSound().listen(
(int times) {
log('TechMind 正在监听检测到的声音 $times');
_clapTimes = _clapTimes + times;
setState(() {});
},
);
}
/// [_getStatusRecordPermission] 来获取录制权限状态。
Future<void> _getStatusRecordPermission() async {
_hasPermission = await _detectClapSoundFlutterPlugin.hasPermission() ?? false;
_isRecording = await _detectClapSoundFlutterPlugin.isRecording() ?? false;
setState(() {});
}
/// [_requestPermissions] 来请求录制权限。
Future<void> _requestPermissions() async {
final status = await _detectClapSoundFlutterPlugin.requestPermission();
_hasPermission = status ?? false;
setState(() {});
}
/// [_startRecording] 来开始录制。
void _startRecording() {
_detectClapSoundFlutterPlugin.startRecording();
_isRecording = true;
setState(() {});
}
/// [_stopRecording] 来停止录制。
Future<void> _stopRecording() async {
final String? path = await _detectClapSoundFlutterPlugin.stopRecording();
log('TechMind: 录制音频文件路径: $path');
_isRecording = false;
setState(() {});
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
backgroundColor: _checkEvenTimes() ? Colors.white : Colors.black,
appBar: AppBar(
backgroundColor: Colors.blue,
centerTitle: true,
title: const Text(
'掌声检测',
style: TextStyle(
fontSize: 30,
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
),
body: SizedBox(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: EdgeInsets.only(bottom: MediaQuery.of(context).size.width * .3),
child: Text(
'次数: $_clapTimes',
style: TextStyle(
fontSize: 30,
color: _checkEvenTimes() ? Colors.black : Colors.white,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
),
ExampleButton(
colorBG: !_hasPermission ? Colors.red : Colors.blue,
onTap: () {
_requestPermissions();
},
label: '已授予录制权限: $_hasPermission',
),
ExampleButton(
colorBG: _isRecording ? Colors.red : Colors.blue,
onTap: () {
if (_isRecording) {
_stopRecording();
} else {
_startRecording();
}
},
label: _isRecording ? '停止录制' : '开始录制',
),
],
),
),
),
);
}
/// [_checkEvenTimes] 来检查次数是否为偶数。
/// 如果是偶数则显示打开灯或关闭灯。
bool _checkEvenTimes() {
return _clapTimes % 2 == 0;
}
}
更多关于Flutter掌声检测插件detect_clap_sound_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter掌声检测插件detect_clap_sound_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用detect_clap_sound_flutter
插件的一个示例代码案例。这个插件可以用来检测掌声声音。
首先,确保你已经在你的pubspec.yaml
文件中添加了detect_clap_sound_flutter
依赖:
dependencies:
flutter:
sdk: flutter
detect_clap_sound_flutter: ^最新版本号 # 请替换为实际最新版本号
然后运行flutter pub get
来获取依赖。
接下来,在你的Flutter应用中,你可以按照以下步骤使用detect_clap_sound_flutter
插件:
- 导入插件:
在你的Dart文件中导入插件:
import 'package:detect_clap_sound_flutter/detect_clap_sound_flutter.dart';
import 'package:flutter/material.dart';
- 创建并配置掌声检测器:
在你的StatefulWidget
中,配置并启动掌声检测器。下面是一个完整的示例:
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter掌声检测示例',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('Flutter掌声检测示例'),
),
body: Center(
child: DetectClapSoundExample(),
),
),
);
}
}
class DetectClapSoundExample extends StatefulWidget {
@override
_DetectClapSoundExampleState createState() => _DetectClapSoundExampleState();
}
class _DetectClapSoundExampleState extends State<DetectClapSoundExample> {
late ClapSoundDetector _clapSoundDetector;
bool _isListening = false;
@override
void initState() {
super.initState();
_clapSoundDetector = ClapSoundDetector();
_startListening();
}
@override
void dispose() {
_stopListening();
_clapSoundDetector.dispose();
super.dispose();
}
void _startListening() {
_clapSoundDetector.listenForClaps((bool clapDetected) {
setState(() {
if (clapDetected) {
_isListening = false; // 可选:检测到掌声后停止监听,或执行其他逻辑
print('检测到掌声!');
// 可以在这里添加UI更新或其他逻辑
}
});
});
setState(() {
_isListening = true;
});
}
void _stopListening() {
_clapSoundDetector.stopListening();
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
_isListening ? '正在监听掌声...' : '已停止监听',
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _isListening ? _stopListening : _startListening,
child: Text(_isListening ? '停止监听' : '开始监听'),
),
],
);
}
}
在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个文本显示当前监听状态,以及一个按钮用于开始和停止监听掌声。当检测到掌声时,会在控制台打印“检测到掌声!”,并且你可以根据需要在检测到掌声后执行其他逻辑,比如更新UI。
请注意,实际使用时,你可能需要根据具体需求调整监听逻辑和处理方式。此外,由于声音检测可能受到设备麦克风、环境噪音等多种因素的影响,实际应用中可能需要更复杂的处理和调优。