提交 29fa1f76 作者: edy

feat: 语音合成相关

上级 a5965975
......@@ -16,20 +16,71 @@ class AivoicePlugin: FlutterPlugin, MethodCallHandler {
/// when the Flutter Engine is detached from the Activity
private lateinit var channel : MethodChannel
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
channel = MethodChannel(flutterPluginBinding.binaryMessenger, "aivoice_plugin")
channel.setMethodCallHandler(this)
}
override fun onMethodCall(call: MethodCall, result: Result) {
if (call.method == "getPlatformVersion") {
result.success("Android ${android.os.Build.VERSION.RELEASE}")
} else {
result.notImplemented()
override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
when (call.method) {
"initEngine" -> {
// 现有的实现
}
"stopEngine" -> {
// 现有的实现
}
"uninitEngine" -> {
// 现有的实现
}
"startOrStopEngine" -> {
// 现有的实现
}
"prepareEnvironment" -> {
// 现有的实现
}
"ttsStartEngineBtnClick" -> {
// 空实现
result.success(null)
}
"ttsSynthesis" -> {
// 空实现
result.success(null)
}
"ttsStopEngineBtnClicked" -> {
// 空实现
result.success(null)
}
"ttsPausePlayback" -> {
// 空实现
result.success(null)
}
"ttsResumePlayback" -> {
// 空实现
result.success(null)
}
"ttsInitEngine" -> {
// 空实现
result.success(null)
}
"ttsUnInitEngine" -> {
// 空实现
result.success(null)
}
"destoryTtsNovel" -> {
// 空实现
result.success(null)
}
"destoryAsrVoice" -> {
// 空实现
result.success(null)
}
else -> {
result.notImplemented()
}
}
}
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
channel.setMethodCallHandler(null)
}
}
......@@ -34,6 +34,6 @@ SPEC CHECKSUMS:
SpeechEngineToB: a49185c07a099cdc052de97218bc10dc4ff60152
TTNetworkManager: 47d93100d944e2ae807e035d8636df92fd5cc390
PODFILE CHECKSUM: bde3e45995fad5550475b342803cb71575488751
PODFILE CHECKSUM: 0212500e480860ee905e9b132693e030f85d651b
COCOAPODS: 1.14.3
COCOAPODS: 1.15.2
......@@ -66,19 +66,40 @@ class _MyAppState extends State<MyApp> {
children: [
TextButton(
onPressed: () {
_aivoicePlugin.initEngine(configMap);
_aivoicePlugin.ttsInitEngine(configMap);
},
child: const Text('init')),
TextButton(
onPressed: () {
_aivoicePlugin.startOrStopEngine(true);
_aivoicePlugin.ttsStartEngineBtnClick(
{"text": "引擎启动成功,收到该回调后,在单次合成场景下收到该回调时语音合成已经开始,同时数据字段为该次请求的请求 ID; 连续合成场景下还需要再发送合成指令,才真正的开始合成。"});
},
child: const Text('start')),
TextButton(
onPressed: () {
_aivoicePlugin.stopEngine();
_aivoicePlugin.ttsStopEngineBtnClicked();
},
child: const Text('stop')),
TextButton(
onPressed: () {
_aivoicePlugin.ttsSynthesis({});
},
child: const Text('合成'))
// TextButton(
// onPressed: () {
// _aivoicePlugin.initEngine(configMap);
// },
// child: const Text('init')),
// TextButton(
// onPressed: () {
// _aivoicePlugin.startOrStopEngine(true);
// },
// child: const Text('start')),
// TextButton(
// onPressed: () {
// _aivoicePlugin.stopEngine();
// },
// child: const Text('stop')),
],
),
),
......
#import "AivoicePlugin.h"
#import "VoiceAsr.h"
#import "TtsNovel.h"
@interface AivoicePlugin () <FlutterStreamHandler, VoiceAsrDelegate>
@interface AivoicePlugin () <FlutterStreamHandler, VoiceAsrDelegate, TtsNovelDelegate>
@property (nonatomic, strong) FlutterEventSink eventSink;
@property(nonatomic, strong)VoiceAsr * voiceAsr;
@property(nonatomic, strong)TtsNovel * ttsNovel;
@property(nonatomic, strong)NSDictionary * config;
@property(nonatomic, strong)NSDictionary * ttsNovelconfig;
@end
@implementation AivoicePlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
FlutterMethodChannel* channel = [FlutterMethodChannel
methodChannelWithName:@"aivoice_plugin"
binaryMessenger:[registrar messenger]];
AivoicePlugin* instance = [[AivoicePlugin alloc] init];
[registrar addMethodCallDelegate:instance channel:channel];
FlutterMethodChannel* channel = [FlutterMethodChannel
methodChannelWithName:@"aivoice_plugin"
binaryMessenger:[registrar messenger]];
AivoicePlugin* instance = [[AivoicePlugin alloc] init];
[registrar addMethodCallDelegate:instance channel:channel];
FlutterEventChannel* eventChannel = [FlutterEventChannel
eventChannelWithName:@"aivoice_plugin/events"
binaryMessenger:[registrar messenger]];
[eventChannel setStreamHandler:instance];
FlutterEventChannel* eventChannel = [FlutterEventChannel
eventChannelWithName:@"aivoice_plugin/events"
binaryMessenger:[registrar messenger]];
[eventChannel setStreamHandler:instance];
}
- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
// 删除了 getPlatformVersion 方法的实现
if ([@"initEngine" isEqualToString:call.method]) {
self.config = call.arguments;
[self.voiceAsr initEngineWithConfig:call.arguments];
result(nil);
} else if ([@"stopEngine" isEqualToString:call.method]) {
[self.voiceAsr stopEngineBtnClicked];
result(nil);
} else if ([@"uninitEngine" isEqualToString:call.method]) {
[self.voiceAsr uninitEngine];
result(nil);
} else if ([@"startOrStopEngine" isEqualToString:call.method]) {
// BOOL arg = [NSNumber numberWithBool:call.arguments];
[self.voiceAsr startEngineBtnClicked];
result(nil);
} else if ([@"prepareEnvironment" isEqualToString:call.method]) {
[VoiceAsr prepareEnvironment:call.arguments];
result(nil);
} else {
result(FlutterMethodNotImplemented);
}
// 删除了 getPlatformVersion 方法的实现
if ([@"initEngine" isEqualToString:call.method]) {
self.config = call.arguments;
[self.voiceAsr initEngineWithConfig:call.arguments];
result(nil);
} else if ([@"stopEngine" isEqualToString:call.method]) {
[self.voiceAsr stopEngineBtnClicked];
result(nil);
} else if ([@"uninitEngine" isEqualToString:call.method]) {
[self.voiceAsr uninitEngine];
result(nil);
} else if ([@"startOrStopEngine" isEqualToString:call.method]) {
[self.voiceAsr startEngineBtnClicked];
result(nil);
} else if ([@"prepareEnvironment" isEqualToString:call.method]) {
[VoiceAsr prepareEnvironment:call.arguments];
result(nil);
} else if ([@"ttsStartEngineBtnClick" isEqualToString:call.method]) {
[self.ttsNovel startEngineBtnClick:call.arguments[@"text"]];
result(nil);
} else if ([@"ttsSynthesis" isEqualToString:call.method]) {
[self.ttsNovel synthesis];
result(nil);
} else if ([@"ttsStopEngineBtnClicked" isEqualToString:call.method]) {
[self.ttsNovel stopEngineBtnClicked];
result(nil);
} else if ([@"ttsPausePlayback" isEqualToString:call.method]) {
[self.ttsNovel pausePlayback];
result(nil);
} else if ([@"ttsResumePlayback" isEqualToString:call.method]) {
[self.ttsNovel resumePlayback];
result(nil);
} else if ([@"ttsInitEngine" isEqualToString:call.method]) {
self.ttsNovelconfig = call.arguments;
[self.ttsNovel switchEngine];
result(nil);
} else if ([@"ttsUnInitEngine" isEqualToString:call.method]) {
[self.ttsNovel switchEngine];
result(nil);
} else if ([@"destoryTtsNovel" isEqualToString:call.method]) {
[self destoryTtsNovel];
result(nil);
} else if ([@"destoryAsrVoice" isEqualToString:call.method]) {
[self destoryVoiceAsr];
result(nil);
} else {
result(FlutterMethodNotImplemented);
}
}
- (FlutterError* _Nullable)onListenWithArguments:(id _Nullable)arguments eventSink:(FlutterEventSink)events {
self.eventSink = events;
return nil;
self.eventSink = events;
return nil;
}
- (FlutterError* _Nullable)onCancelWithArguments:(id _Nullable)arguments {
self.eventSink = nil;
return nil;
self.eventSink = nil;
return nil;
}
// 新增的发送 Map<String, dynamic> 方法
- (void)sendMessageToFlutter:(NSDictionary*)message {
if (self.eventSink) {
self.eventSink(message);
}
if (self.eventSink) {
self.eventSink(message);
}
}
- (void) destoryVoiceAsr {
[self.voiceAsr destroyEngine];
_voiceAsr = nil;
}
- (void) destoryTtsNovel {
[self.ttsNovel destroyEngine];
_ttsNovel = nil;
}
- (VoiceAsr *)voiceAsr {
......@@ -76,11 +118,18 @@
}
return _voiceAsr;
}
- (TtsNovel *)ttsNovel {
if(!_ttsNovel) {
_ttsNovel = [[TtsNovel alloc] initWithDelegate:self config:self.ttsNovelconfig];
}
return _ttsNovel;
}
- (void)onRecieve:(nonnull NSDictionary *)message {
- (void)onRecieve:(nonnull NSDictionary *)message {
[self sendMessageToFlutter:message];
}
@end
......@@ -46,8 +46,8 @@ extern NSString* SDEF_AU_DEFAULT_URI;
extern NSString* SDEF_TTS_DEFAULT_URI;
extern NSString* SDEF_TTS_DEFAULT_CLUSTER;
extern NSString* SDEF_TTS_DEFAULT_BACKEND_CLUSTER;
//extern NSString* SDEF_TTS_DEFAULT_ONLINE_VOICE;
//extern NSString* SDEF_TTS_DEFAULT_ONLINE_VOICE_TYPE;
extern NSString* SDEF_TTS_DEFAULT_ONLINE_VOICE;
extern NSString* SDEF_TTS_DEFAULT_ONLINE_VOICE_TYPE;
extern NSString* SDEF_TTS_DEFAULT_OFFLINE_VOICE;
extern NSString* SDEF_TTS_DEFAULT_OFFLINE_VOICE_TYPE;
extern NSString* SDEF_TTS_DEFAULT_ONLINE_LANGUAGE;
......
......@@ -43,8 +43,8 @@ const NSString* SDEF_AU_DEFAULT_URI = @"/api/v1/sauc";
const NSString* SDEF_TTS_DEFAULT_URI = @"/api/v1/tts/ws_binary";
const NSString* SDEF_TTS_DEFAULT_CLUSTER = @"volcano_tts";
const NSString* SDEF_TTS_DEFAULT_BACKEND_CLUSTER = @"YOUR TTS BACKEND CLUSTER";
//const NSString* SDEF_TTS_DEFAULT_ONLINE_VOICE = @"灿灿";
//const NSString* SDEF_TTS_DEFAULT_ONLINE_VOICE_TYPE = @"BV213_w5H18f6VbKnhg3Ph";
const NSString* SDEF_TTS_DEFAULT_ONLINE_VOICE = @"灿灿";
const NSString* SDEF_TTS_DEFAULT_ONLINE_VOICE_TYPE = @"BV002_streaming";
//BV002_streaming BV021_PSj8BvWAZyepfUPB BV705_streaming BV115_H74MBi790rUFu993 BV213_w5H18f6VbKnhg3Ph
const NSString* SDEF_TTS_DEFAULT_OFFLINE_VOICE = @"YOUR TTS OFFLINE VOICE";
const NSString* SDEF_TTS_DEFAULT_OFFLINE_VOICE_TYPE = @"YOUR TTS OFFLINE VOICE TYPE";
......
//
// TtsNovel.h
// aivoice_plugin
//
// Created by edy on 2024/9/11.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@protocol TtsNovelDelegate <NSObject>
- (void)onRecieve:(NSDictionary*)message;
@end
@interface TtsNovel : NSObject
- (instancetype)initWithDelegate:(id<TtsNovelDelegate>)delegate
config:(NSDictionary *)config;
- (void)switchEngine;
- (void)startEngineBtnClick:(NSString *)text;
- (void)stopEngineBtnClicked;
- (void)synthesis;
- (void) destroyEngine;
- (void)pausePlayback;
- (void)resumePlayback;
@end
NS_ASSUME_NONNULL_END
......@@ -26,6 +26,8 @@ NS_ASSUME_NONNULL_BEGIN
- (void)uninitEngine;
- (void) destroyEngine;
- (void)startEngineBtnClicked;
- (void)stopEngineBtnClicked;
......
......@@ -148,6 +148,10 @@
}
}
- (void) destroyEngine {
[self.curEngine destroyEngine];
}
#pragma mark - Config & Init & Uninit Methods
-(void)configInitParams{
......
......@@ -36,4 +36,49 @@ class AivoicePlugin {
Stream<Map<String, dynamic>> get onAsrResultReceived {
return _eventChannel.receiveBroadcastStream().map((event) => Map<String, dynamic>.from(event));
}
// 更改方法名
Future<void> ttsStartEngineBtnClick(Map<String, dynamic> params) {
return AivoicePluginPlatform.instance.ttsStartEngineBtnClick(params);
}
// 新增的 ttsSynthesis 方法
Future<void> ttsSynthesis(Map<String, dynamic> params) {
return AivoicePluginPlatform.instance.ttsSynthesis(params);
}
// 修改方法名
Future<void> ttsStopEngineBtnClicked() {
return AivoicePluginPlatform.instance.ttsStopEngineBtnClicked();
}
// 新增的 ttsPausePlayback 方法
Future<void> ttsPausePlayback() {
return AivoicePluginPlatform.instance.ttsPausePlayback();
}
// 新增的 ttsResumePlayback 方法
Future<void> ttsResumePlayback() {
return AivoicePluginPlatform.instance.ttsResumePlayback();
}
// 新增的 ttsInitEngine 方法
Future<void> ttsInitEngine(Map<String, dynamic> config) {
return AivoicePluginPlatform.instance.ttsInitEngine(config);
}
// 新增的 ttsUnInitEngine 方法
Future<void> ttsUnInitEngine() {
return AivoicePluginPlatform.instance.ttsUnInitEngine();
}
// 新增的 destoryTtsNovel 方法
Future<void> destoryTtsNovel() {
return AivoicePluginPlatform.instance.destoryTtsNovel();
}
// 新增的 destoryAsrVoice 方法
Future<void> destoryAsrVoice() {
return AivoicePluginPlatform.instance.destoryAsrVoice();
}
}
......@@ -35,4 +35,49 @@ class MethodChannelAivoicePlugin extends AivoicePluginPlatform {
Future<void> prepareEnvironment(Map<String, dynamic> config) async {
await methodChannel.invokeMethod<void>('prepareEnvironment', config);
}
@override
Future<void> ttsStartEngineBtnClick(Map<String, dynamic> params) async {
await methodChannel.invokeMethod<void>('ttsStartEngineBtnClick', params);
}
@override
Future<void> ttsSynthesis(Map<String, dynamic> params) async {
await methodChannel.invokeMethod<void>('ttsSynthesis', params);
}
@override
Future<void> ttsStopEngineBtnClicked() async {
await methodChannel.invokeMethod<void>('ttsStopEngineBtnClicked');
}
@override
Future<void> ttsPausePlayback() async {
await methodChannel.invokeMethod<void>('ttsPausePlayback');
}
@override
Future<void> ttsResumePlayback() async {
await methodChannel.invokeMethod<void>('ttsResumePlayback');
}
@override
Future<void> ttsInitEngine(Map<String, dynamic> config) async {
await methodChannel.invokeMethod<void>('ttsInitEngine', config);
}
@override
Future<void> ttsUnInitEngine() async {
await methodChannel.invokeMethod<void>('ttsUnInitEngine');
}
@override
Future<void> destoryTtsNovel() async {
await methodChannel.invokeMethod<void>('destoryTtsNovel');
}
@override
Future<void> destoryAsrVoice() async {
await methodChannel.invokeMethod<void>('destoryAsrVoice');
}
}
......@@ -39,4 +39,49 @@ abstract class AivoicePluginPlatform extends PlatformInterface {
// 新增的 prepareEnvironment 方法
Future<void> prepareEnvironment(Map<String, dynamic> config);
// 新增的 ttsStartEngineBtnClick 方法
Future<void> ttsStartEngineBtnClick(Map<String, dynamic> params) {
throw UnimplementedError('ttsStartEngineBtnClick() has not been implemented.');
}
// 新增的 ttsSynthesis 方法
Future<void> ttsSynthesis(Map<String, dynamic> params) {
throw UnimplementedError('ttsSynthesis() has not been implemented.');
}
// 修改方法名
Future<void> ttsStopEngineBtnClicked() {
throw UnimplementedError('ttsStopEngineBtnClicked() has not been implemented.');
}
// 新增的 ttsPausePlayback 方法
Future<void> ttsPausePlayback() {
throw UnimplementedError('ttsPausePlayback() has not been implemented.');
}
// 新增的 ttsResumePlayback 方法
Future<void> ttsResumePlayback() {
throw UnimplementedError('ttsResumePlayback() has not been implemented.');
}
// 新增的 ttsInitEngine 方法
Future<void> ttsInitEngine(Map<String, dynamic> config) {
throw UnimplementedError('ttsInitEngine() has not been implemented.');
}
// 新增的 ttsUnInitEngine 方法
Future<void> ttsUnInitEngine() {
throw UnimplementedError('ttsUnInitEngine() has not been implemented.');
}
// 新增的 destoryTtsNovel 方法
Future<void> destoryTtsNovel() {
throw UnimplementedError('destoryTtsNovel() has not been implemented.');
}
// 新增的 destoryAsrVoice 方法
Future<void> destoryAsrVoice() {
throw UnimplementedError('destoryAsrVoice() has not been implemented.');
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论