Flutter未知功能插件whisper_flutter_plus的使用(注:由于介绍为undefined,以下基于插件名称推测可能功能) (注:由于实际功能未知,以下仅为基于名称的合理推测,并非真实功能描述) Flutter隐私保护通讯插件whisper_flutter_plus的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter未知功能插件whisper_flutter_plus的使用

安装库

首先,您需要在Flutter项目中添加whisper_flutter_plus插件。打开终端并执行以下命令:

flutter pub add whisper_flutter_plus

导入库

在您的Dart文件中导入该库:

import 'package:whisper_flutter_plus/whisper_flutter_plus.dart';

快速开始

下面是一个简单的示例,展示了如何使用whisper_flutter_plus进行音频转录。

// 准备wav文件
final Directory documentDirectory = await getApplicationDocumentsDirectory();
final ByteData documentBytes = await rootBundle.load('assets/jfk.wav');

final String jfkPath = '${documentDirectory.path}/jfk.wav';

await File(jfkPath).writeAsBytes(
    documentBytes.buffer.asUint8List(),
);

// 开始whisper转录
final Whisper whisper = Whisper(
    model: WhisperModel.base, // 使用基础模型
);

final String? whisperVersion = await whisper.getVersion();
print(whisperVersion); // 打印whisper版本

final String transcription = await whisper.transcribe(
    transcribeRequest: TranscribeRequest(
        audio: jfkPath, // 音频文件路径
        isTranslate: true, // 将音频语言翻译成英文文本
        isNoTimestamps: false, // 获取结果中的段落
        splitOnWord: true, // 按每个单词分割段落
    ),
);
print(transcription); // 打印转录结果

示例应用代码

以下是基于whisper_flutter_plus插件的完整示例应用程序代码。此示例包括一个用户界面,允许用户选择不同的选项来配置音频转录过程,并显示转录结果。

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:path_provider/path_provider.dart';
import 'package:whisper_flutter_plus/whisper_flutter_plus.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ProviderScope(
      child: MaterialApp(
        title: 'Flutter whisper demo',
        theme: ThemeData(
          colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
          useMaterial3: true,
        ),
        home: const MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends ConsumerWidget {
  const MyHomePage({super.key});

  [@override](/user/override)
  Widget build(BuildContext context, WidgetRef ref) {
    final WhisperModel model = ref.watch(modelProvider);
    final String lang = ref.watch(langProvider);
    final bool translate = ref.watch(translateProvider);
    final bool withSegments = ref.watch(withSegmentsProvider);
    final bool splitWords = ref.watch(splitWordsProvider);

    final WhisperController controller = ref.watch(
      whisperControllerProvider.notifier,
    );

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text('Whisper flutter demo'),
      ),
      body: SafeArea(
        minimum: const EdgeInsets.all(20),
        child: Consumer(
          builder: (context, ref, _) {
            final AsyncValue<TranscribeResult?> transcriptionAsync = ref.watch(
              whisperControllerProvider,
            );

            return transcriptionAsync.maybeWhen(
              skipLoadingOnRefresh: true,
              skipLoadingOnReload: true,
              data: (TranscribeResult? transcriptionResult) {
                return Column(
                  crossAxisAlignment: CrossAxisAlignment.stretch,
                  children: <Widget>[
                    const Text('Model :'),
                    DropdownButton(
                      isExpanded: true,
                      value: model,
                      items: WhisperModel.values
                          .map(
                            (WhisperModel model) => DropdownMenuItem(
                              value: model,
                              child: Text(model.modelName),
                            ),
                          )
                          .toList(),
                      onChanged: (WhisperModel? model) {
                        if (model != null) {
                          ref.read(modelProvider.notifier).state = model;
                        }
                      },
                    ),
                    const SizedBox(height: 20),
                    const Text('Lang :'),
                    DropdownButton(
                      isExpanded: true,
                      value: lang,
                      items: ['id', 'fr', 'en']
                          .map(
                            (String lang) => DropdownMenuItem(
                              value: lang,
                              child: Text(lang),
                            ),
                          )
                          .toList(),
                      onChanged: (String? lang) {
                        if (lang != null) {
                          ref.read(langProvider.notifier).state = lang;
                        }
                      },
                    ),
                    const SizedBox(height: 20),
                    const Text('Translate result :'),
                    DropdownButton(
                      isExpanded: true,
                      value: translate,
                      items: const [
                        DropdownMenuItem(
                          value: false,
                          child: Text('No'),
                        ),
                        DropdownMenuItem(
                          value: true,
                          child: Text('Yes'),
                        ),
                      ],
                      onChanged: (bool? translate) {
                        if (translate != null) {
                          ref.read(translateProvider.notifier).state =
                              translate;
                        }
                      },
                    ),
                    const Text('With segments :'),
                    DropdownButton(
                      isExpanded: true,
                      value: withSegments,
                      items: const [
                        DropdownMenuItem(
                          value: false,
                          child: Text('No'),
                        ),
                        DropdownMenuItem(
                          value: true,
                          child: Text('Yes'),
                        ),
                      ],
                      onChanged: (bool? withSegments) {
                        if (withSegments != null) {
                          ref.read(withSegmentsProvider.notifier).state =
                              withSegments;
                        }
                      },
                    ),
                    const Text('Split word :'),
                    DropdownButton(
                      isExpanded: true,
                      value: splitWords,
                      items: const [
                        DropdownMenuItem(
                          value: false,
                          child: Text('No'),
                        ),
                        DropdownMenuItem(
                          value: true,
                          child: Text('Yes'),
                        ),
                      ],
                      onChanged: (bool? splitWords) {
                        if (splitWords != null) {
                          ref.read(splitWordsProvider.notifier).state =
                              splitWords;
                        }
                      },
                    ),
                    const SizedBox(height: 20),
                    Row(
                      mainAxisAlignment: MainAxisAlignment.spaceAround,
                      children: [
                        ElevatedButton(
                          onPressed: () async {
                            final Directory documentDirectory =
                                await getApplicationDocumentsDirectory();
                            final ByteData documentBytes =
                                await rootBundle.load(
                              'assets/jfk.wav',
                            );

                            final String jfkPath =
                                '${documentDirectory.path}/jfk.wav';

                            await File(jfkPath).writeAsBytes(
                              documentBytes.buffer.asUint8List(),
                            );

                            await controller.transcribe(jfkPath);
                          },
                          child: const Text('jfk.wav'),
                        ),
                        const SizedBox(width: 20),
                        ElevatedButton(
                          onPressed: () async {
                            // 假设RecordPage.openRecordPage返回录音文件路径
                            final String? recordFilePath =
                                await RecordPage.openRecordPage(
                              context,
                            );

                            if (recordFilePath != null) {
                              await controller.transcribe(recordFilePath);
                            }
                          },
                          child: const Text('record'),
                        ),
                      ],
                    ),
                    if (transcriptionResult != null) ...[
                      const SizedBox(height: 20),
                      Text(
                        transcriptionResult.transcription.text,
                      ),
                      const SizedBox(height: 20),
                      Text(
                        transcriptionResult.time.toString(),
                      ),
                      if (transcriptionResult.transcription.segments !=
                          null) ...[
                        const SizedBox(height: 20),
                        Expanded(
                          child: ListView.separated(
                            itemCount: transcriptionResult
                                .transcription.segments!.length,
                            itemBuilder: (context, index) {
                              final WhisperTranscribeSegment segment =
                                  transcriptionResult
                                      .transcription.segments![index];

                              final Duration fromTs = segment.fromTs;
                              final Duration toTs = segment.toTs;
                              final String text = segment.text;
                              return Text(
                                '[$fromTs - $toTs] $text',
                              );
                            },
                            separatorBuilder: (context, index) {
                              return const Divider();
                            },
                          ),
                        ),
                      ],
                    ],
                  ],
                );
              },
              orElse: () {
                return const Center(
                  child: CircularProgressIndicator(),
                );
              },
            );
          },
        ),
      ),
    );
  }
}

更多关于Flutter未知功能插件whisper_flutter_plus的使用(注:由于介绍为undefined,以下基于插件名称推测可能功能) (注:由于实际功能未知,以下仅为基于名称的合理推测,并非真实功能描述) Flutter隐私保护通讯插件whisper_flutter_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter未知功能插件whisper_flutter_plus的使用(注:由于介绍为undefined,以下基于插件名称推测可能功能) (注:由于实际功能未知,以下仅为基于名称的合理推测,并非真实功能描述) Flutter隐私保护通讯插件whisper_flutter_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


由于whisper_flutter_plus这个Flutter插件的具体功能未知,且介绍为undefined,我们只能基于其名称做一些合理的推测,比如它可能是一个用于隐私保护通讯的插件。基于这个假设,以下是一个可能的代码示例,展示如何在一个Flutter应用中集成和使用这个插件(请注意,这完全是基于假设的示例代码,实际使用时需要根据插件的真实API进行调整)。

首先,确保你已经在pubspec.yaml文件中添加了whisper_flutter_plus依赖:

dependencies:
  flutter:
    sdk: flutter
  whisper_flutter_plus: ^x.y.z  # 替换为实际版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter应用中,你可以按照以下方式使用这个插件(假设它提供了加密和解密通讯的功能):

import 'package:flutter/material.dart';
import 'package:whisper_flutter_plus/whisper_flutter_plus.dart';  // 假设这是插件的导入路径

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Whisper Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: WhisperDemoScreen(),
    );
  }
}

class WhisperDemoScreen extends StatefulWidget {
  @override
  _WhisperDemoScreenState createState() => _WhisperDemoScreenState();
}

class _WhisperDemoScreenState extends State<WhisperDemoScreen> {
  String encryptedMessage = '';
  String decryptedMessage = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Whisper Flutter Plus Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              decoration: InputDecoration(labelText: 'Original Message'),
              onChanged: (value) {
                // 这里可以调用插件的加密方法(假设存在encrypt方法)
                // 注意:以下代码是假设的,实际使用时需要根据插件API调整
                setState(() {
                  encryptedMessage = WhisperFlutterPlus.encrypt(value);
                });
              },
            ),
            SizedBox(height: 16),
            Text(
              'Encrypted Message: $encryptedMessage',
              style: TextStyle(color: Colors.grey),
            ),
            SizedBox(height: 32),
            Text(
              'Decrypted Message: $decryptedMessage',
              style: TextStyle(color: Colors.grey),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                // 这里可以调用插件的解密方法(假设存在decrypt方法)
                // 注意:以下代码是假设的,实际使用时需要根据插件API调整
                if (encryptedMessage.isNotEmpty) {
                  setState(() {
                    decryptedMessage = WhisperFlutterPlus.decrypt(encryptedMessage);
                  });
                }
              },
              child: Text('Decrypt'),
            ),
          ],
        ),
      ),
    );
  }
}

// 假设的 WhisperFlutterPlus 类定义(实际使用时需要替换为插件的真实实现)
class WhisperFlutterPlus {
  static String encrypt(String message) {
    // 这里应该是插件提供的加密逻辑
    // 由于是假设,这里只是简单地返回了原始字符串加上"ENCRYPTED"后缀
    return '${message}_ENCRYPTED';
  }

  static String decrypt(String encryptedMessage) {
    // 这里应该是插件提供的解密逻辑
    // 由于是假设,这里只是简单地移除了"_ENCRYPTED"后缀
    if (encryptedMessage.endsWith('_ENCRYPTED')) {
      return encryptedMessage.substring(0, encryptedMessage.length - '_ENCRYPTED'.length);
    }
    return encryptedMessage; // 如果不匹配,则返回原始字符串
  }
}

重要说明

  1. 上述代码中的WhisperFlutterPlus类及其encryptdecrypt方法是完全基于假设的。实际使用时,你需要根据whisper_flutter_plus插件的真实API来实现这些功能。
  2. 由于插件的具体功能未知,上述代码仅用于展示如何在Flutter应用中集成和使用一个假设的隐私保护通讯插件。
  3. 在实际开发中,务必查阅whisper_flutter_plus插件的官方文档或源代码,以了解其真实的功能和使用方法。
回到顶部