Flutter掌声检测插件detect_clap_sound_flutter的使用

发布于 1周前 作者 caililin 来自 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

1 回复

更多关于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插件:

  1. 导入插件

在你的Dart文件中导入插件:

import 'package:detect_clap_sound_flutter/detect_clap_sound_flutter.dart';
import 'package:flutter/material.dart';
  1. 创建并配置掌声检测器

在你的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。

请注意,实际使用时,你可能需要根据具体需求调整监听逻辑和处理方式。此外,由于声音检测可能受到设备麦克风、环境噪音等多种因素的影响,实际应用中可能需要更复杂的处理和调优。

回到顶部