乐于分享
好东西不私藏

Flutter实现语音播报,3分钟让App开口说话!

Flutter实现语音播报,3分钟让App开口说话!

订单来了!“您有一个新的订单”——语音播报是外卖、物流、医疗、社交等场景的刚需。本文带你用最少的代码,快速实现Flutter语音播报功能。


一、语音播报能做什么?

语音播报(Text-to-Speech,TTS)的应用场景非常广泛:

  • 📦 物流/外卖:新订单提醒、取餐通知

  • 💬 社交应用:收到新消息时朗读内容

  • 📢 资讯阅读:新闻、小说的语音播放

  • 🧑‍🦯 无障碍辅助:帮助视障用户使用应用

  • 🗣️ 语音助手:与用户进行语音交互 

今天我们就用Flutter最流行的TTS插件,快速实现这些功能。


二、插件选型——flutter_tts 一统江湖

Flutter中实现语音播报,首选 flutter_tts 插件 :

特性
flutter_tts
其他方案
⭐ Pub 点赞
1.2k+
较少
📱 平台支持
iOS/Android/Web/Windows
通常仅移动端
🎚️ 参数控制
语速、音调、音量、语言
功能不全
📝 文档完善度
参差不齐
🔄 维护状态
活跃
部分已停更

添加依赖

dependencies:  flutter_tts: ^4.0.2  # 请使用最新版

执行 flutter pub get 。


三、极简实现:5行代码让App开口

1. 基础用法

import 'package:flutter_tts/flutter_tts.dart';class VoiceService {  final FlutterTts _flutterTts = FlutterTts();  // 一句话播报  Future<voidspeak(String text) async {    await _flutterTts.speak(text);  }}// 使用VoiceService().speak("您有一个新的订单");

就这么简单!这5行代码已经实现了核心的语音播报功能 。

2. 完整示例:带按钮的播报页面

import 'package:flutter/material.dart';import 'package:flutter_tts/flutter_tts.dart';class VoiceDemoPage extends StatefulWidget {  @override  _VoiceDemoPageState createState() => _VoiceDemoPageState();}class _VoiceDemoPageState extends State<VoiceDemoPage> {  final FlutterTts _flutterTts = FlutterTts();  final TextEditingController _controller = TextEditingController();  @override  void initState() {    super.initState();    _initTts();  }  // 初始化TTS配置  _initTts() async {    await _flutterTts.setLanguage("zh-CN"); // 设置中文    await _flutterTts.setSpeechRate(0.5);   // 设置语速    await _flutterTts.setVolume(1.0);        // 设置音量    await _flutterTts.setPitch(1.0);         // 设置音调  }  // 播报文本  Future<void_speak(String text) async {    if (text.isEmptyreturn;    await _flutterTts.speak(text);  }  // 停止播报  Future<void_stop() async {    await _flutterTts.stop();  }  @override  Widget build(BuildContext context) {    return Scaffold(      appBarAppBar(titleText('语音播报示例')),      bodyPadding(        paddingEdgeInsets.all(16),        childColumn(          children: [            TextField(              controller: _controller,              decorationInputDecoration(                labelText'输入要播报的文字',                borderOutlineInputBorder(),              ),            ),            SizedBox(height20),            Row(              mainAxisAlignmentMainAxisAlignment.spaceEvenly,              children: [                ElevatedButton(                  onPressed() => _speak(_controller.text),                  childText('播报'),                ),                ElevatedButton(                  onPressed: _stop,                  childText('停止'),                ),              ],            ),          ],        ),      ),    );  }  @override  void dispose() {    _flutterTts.stop();    super.dispose();  }}

四、进阶功能:让播报更智能

1. 设置语言和发音人

// 支持的语言列表List<dynamic> languages = await _flutterTts.getLanguages;// 设置中文await _flutterTts.setLanguage("zh-CN");// 设置英文await _flutterTts.setLanguage("en-US");// 获取可用发音人(不同设备支持不同)List<dynamic> voices = await _flutterTts.getVoices;

2. 精细控制语速和音调

// 语速范围 0.0-1.0,默认 0.5await _flutterTts.setSpeechRate(0.5);  // 正常await _flutterTts.setSpeechRate(0.3);  // 慢速await _flutterTts.setSpeechRate(0.8);  // 快速// 音调范围 0.5-2.0,默认 1.0await _flutterTts.setPitch(1.0);  // 正常await _flutterTts.setPitch(1.5);  // 偏高await _flutterTts.setPitch(0.7);  // 偏低

3. 监听播报状态

_flutterTts.setStartHandler(() {  print("开始播报");});_flutterTts.setCompletionHandler(() {  print("播报完成");  // 可以在这里播报下一条消息});_flutterTts.setErrorHandler((msg) {  print("播报错误: $msg");});_flutterTts.setProgressHandler((String text, int startOffset, int endOffset, String word) {  print("正在播报: $word");});

4. 队列播报(多条消息依次播放)

class VoiceQueue {  final FlutterTts _flutterTts = FlutterTts();  final List<String> _queue = [];  bool _isSpeaking = false;  VoiceQueue() {    _flutterTts.setCompletionHandler(() {      _isSpeaking = false;      _next();  // 播完一条,播放下一条    });  }  void add(String text) {    _queue.add(text);    if (!_isSpeaking) {      _next();    }  }  void _next() async {    if (_queue.isEmpty) return;    _isSpeaking = true;    final text = _queue.removeAt(0);    await _flutterTts.speak(text);  }}

五、STT + TTS:构建语音对话闭环

如果你的应用需要语音交互(用户说话 → 理解意图 → 语音回复),可以将语音识别(STT)和语音播报(TTS)结合 :

class VoiceAssistant {  final FlutterTts _tts = FlutterTts();  // 假设你用了某个语音识别插件  // final SpeechRecognition _stt = SpeechRecognition();  // 处理用户输入  void onUserSpeaking(String recognizedText) async {    // 1. 用户说完话,停止识别    // await _stt.stop();    // 2. 理解意图(调用后端API或本地逻辑)    String response = await _processCommand(recognizedText);    // 3. 语音回复    await _tts.speak(response);    // 4. 回复完成后,重新开始监听    // await _stt.listen();  }  Future<String_processCommand(String input) async {    if (input.contains('天气')) return '今天天气晴朗,气温25度';    if (input.contains('时间')) return '现在是下午3点30分';    return '抱歉,我没有理解您的意思';  }}

⚠️ 注意:STT 和 TTS 不能同时工作——TTS播报时麦克风会采集到播报声音,导致STT误识别。需要在播报前暂停识别,播报完成后恢复识别 。


六、平台适配与避坑指南

🤖 Android 配置

在 android/app/src/main/AndroidManifest.xml 中添加权限(部分语音引擎需要联网下载数据):

<uses-permissionandroid:name="android.permission.INTERNET" />

如果需要录音(STT场景),还需添加:

<uses-permissionandroid:name="android.permission.RECORD_AUDIO" />

📱 iOS 配置

在 ios/Runner/Info.plist 中添加:

<key>NSMicrophoneUsageDescription</key><string>我们需要访问麦克风进行语音输入</string>

🚨 常见问题

❌ 播报没有声音

  • 检查设备是否静音

  • 确认音量是否开启

  • Android 需要确保系统 TTS 引擎已安装并启用(通常在设置 → 语言和输入法 → 文字转语音中)

❌ 中文播报无效

  • 确保设置了正确的语言代码 zh-CN

  • 某些设备可能需要下载中文语音数据

❌ iOS 模拟器无声音

  • iOS 模拟器不支持 TTS,必须在真机上测试 

❌ 播报卡顿或延迟

  • 避免一次性播报过长的文本

  • 可以分段播报,利用 setProgressHandler 监听进度

❌ Web 平台支持

  • flutter_tts 支持 Web,但需要浏览器支持 Web Speech API 


七、完整示例:语音播报工具类

import 'package:flutter_tts/flutter_tts.dart';class TtsService {  static final TtsService _instance = TtsService._internal();  factory TtsService() => _instance;  TtsService._internal();  final FlutterTts _flutterTts = FlutterTts();  bool get isSpeaking => _flutterTts.isSpeaking;  Future<voidinit({    String language = 'zh-CN',    double speechRate = 0.5,    double pitch = 1.0,    double volume = 1.0,  }) async {    await _flutterTts.setLanguage(language);    await _flutterTts.setSpeechRate(speechRate);    await _flutterTts.setPitch(pitch);    await _flutterTts.setVolume(volume);    // 监听完成事件    _flutterTts.setCompletionHandler(() {      print('播报完成');    });    _flutterTts.setErrorHandler((msg) {      print('播报错误: $msg');    });  }  Future<voidspeak(String textasync {    if (text.isEmpty) return;    await _flutterTts.speak(text);  }  Future<voidstop() async {    await _flutterTts.stop();  }  Future<voidpause() async {    await _flutterTts.pause();  }  Future<voidresume() async {    await _flutterTts.speak(''); // 继续播放  }  Future<voiddispose() async {    await _flutterTts.stop();  }}// 使用await TtsService().init();await TtsService().speak('欢迎使用语音播报');

八、总结

Flutter 实现语音播报,核心就是 flutter_tts 插件

  1. 添加依赖,一行命令搞定

  2. 初始化配置,设置语言、语速、音调

  3. 调用 speak,传入要播报的文本

  4. 进阶:状态监听、队列播报、STT+TTS联动

这个功能非常适合需要实时通知无障碍辅助语音交互的应用场景。

谢谢你读到最后。

若觉得尚可,恳请点赞、在看、转发分享。

山高水长,我们下期再会。

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » Flutter实现语音播报,3分钟让App开口说话!

评论 抢沙发

2 + 5 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮