MSRFarsi | MasoudSoft Screen Reader
28 subscribers
1 file
6 links
یک صفحه خوان بر پایه پلاگین جاوا اسکریپتی اوپن سورس
این چنل مخصوص توسعه یک صفحه خوان مناسب رایگان و اوپن سورس جهت استفاده نابینایان طراحی شده است
Download Telegram
پیام های امیرحسین در پیگیری مشکلات فارسی زبانان در صفحه خوان پرودنس انشالله که مارو از یوغ کامنتری خلاص کند
ممنونم ازش به خاطر پیگیری های خوبش
با سلام
پس از تفکرات زیادو ریاضت کشیدن بسیار( یا همون نشستن و هیچ کاری نکردن) به این نتیجه رسیدم که برم به سازنده مولتی شرپا که قبلا هم سازنده tts-server بود یعنی همون jing332 بگم که حاجی تو بیا همین ساپورت مدل های شرپارو به عنوان موتور صوتی آفلاین به این تی تی اس سرور خودت اضافه کن و یه چند خط کد هم بنویس که خود همینو به عنوان صفحه خوان بشناسه تا ما از شر چهار تا اپ که به هم متصل میکنیم تا یه امکانات حداقلی بگیریم خلاص شیم.
یارو کامنتری نصب میکنه که توش تی تی اس سرورو انتخاب کنه و توش شرپا و یه موتور دیگه رو که مثلا انگلیسیش خوبه رو انتخاب کنه که توسط یه قانون خواندن یا reading rule داخل تی تی اس سرور مثل فسقلیکس یا دلفریب یک متن رو که دو زبانه هست رو آفلاین بخونه!
هرکی باشه گیج میشه دیگه من خودمم گاها نمیتونم بفهمم چی به چیه.
اما اگر خود تی تی اس سرور به جای مولتی شرپا و کامنتری و خودش جایگزین بشه همه چی جمع میشه تو یه نرم افزار و راحت دیگه فوکوس میکنیم رو اون.
کلی هم امکانات ممکانات از جمله اتصال به چت جی پی تی اینارو میشه روش پیاده کرد...

اینجا ببینید پیشنهادی که بهش دادم رو اگر لایکو کامنت هم بذارید که دیگه نور علی نور میشه میاد یه ترتیب اثری میده:
https://github.com/jing332/tts-server-android/discussions/222
یه سخنرانی حماسی:

من موافق نیستم که tts-server به یک apk جداگانه برای هر زبان نیاز دارد. در واقع فهرستی از زبان های آنلاین و آفلاین را به صورت داخلی مدیریت می کند. مشابه موتور چند شرپا Jing332، من معتقدم که می توانیم مدل های اضافی مانند فایل های فشرده Sherpa ONNX را به راحتی از اینترنت یا ذخیره سازی دانلود کنیم.

با ترکیب این مدل‌های دانلود شده، می‌توانیم عملکردهای گفتار به متن (STT) و تشخیص خودکار گفتار (ASR) را برای نوشتن قوانین پیاده‌سازی کنیم. علاوه بر این، می‌توانیم به طور بالقوه همه انواع قوانین (خواندن، نوشتن، جایگزینی) را در یک برگه «قوانین» برای گردش کار بهتر ادغام کنیم.

دلیلی که من tts-server را انتخاب کردم به دلیل ویژگی های گسترده آن از جمله خواندن قوانین و افزونه ها است. عملکردهای nirenr/jieshuo را ارائه می دهد، اما منبع باز نیست، تروجان های بالقوه ای در نسخه های قدیمی دارد و رایگان نیست بسیاری از ایرانیان نابینا از نسخه های کرک شده آغشته به بدافزار به دلیل نبود جایگزین استفاده می کنند.

در کشورهای دیگر مانند ترکیه، کاربران نابینا برای سرعت و قابلیت های افزونه به این صفحه خوان اعتماد می کنند. به طور مشابه، افراد ناشنوا فاقد ابزارهای آفلاین قابل دسترسی برای ارتباط هستند. با ادغام عملکرد Sherpa در tts-server، می‌توانیم ابزاری قدرتمند برای افراد دارای معلولیت‌های مختلف ایجاد کنیم.

برای زبان‌هایی مانند پشتو، Microsoft Read Aloud پشتیبانی محدودی را با دو صدای متفاوت ارائه می‌کند. با این حال، tts-server به طور بالقوه می تواند دسترسی آنلاین به این عملکرد را تا زمانی که یک مدل اختصاصی پشتو شرپا در دسترس قرار گیرد، فراهم کند. متأسفانه فقدان کلان داده مانع از توسعه Icefall در این زمینه می شود.

مشاهده tts-server به عنوان یک ابزار دسترسی چندزبانه با پشتیبانی از مدل Sherpa می تواند به طور بالقوه بسیاری از مسائل جاری، از جمله مشکلات روتین و پشتیبانی محدود زبان را برطرف کند.

چالش های فعلی:
* پشتیبانی از زبان محدود: موتورهای TTS موجود فاقد پشتیبانی آفلاین برای زبان هایی مانند پشتو هستند.
* مشکلات دسترسی: بسیاری از ابزارهای دسترسی برای نابینایان منبع بسته، غیر رایگان یا حاوی بدافزار هستند. جوامع ناشنوا فاقد ابزارهای دسترسی آفلاین هستند.
* عملکرد تکه تکه: سرورهای TTS اغلب به برنامه های جداگانه برای هر زبان نیاز دارند و فاقد عملکردهای یکپارچه مانند Sherpa برای کمک نوشتن هستند.

راه حل پیشنهادی:
* گسترش عملکرد سرور TTS: ما پیشنهاد می کنیم یک سرور TTS موجود مانند tts-server (شبیه به jieshuo) را تقویت کنیم تا قابلیت های Sherpa را برای کمک نوشتن اضافه کنیم. این یک ابزار دسترسی قدرتمند و چند زبانه ایجاد می کند.
* دانلود مدل آفلاین: قابلیت دانلود و مدیریت مدل‌های زبان آفلاین (مانند مدل‌های ONNX Sherpa) را مستقیماً در سرور TTS پیاده‌سازی کنید و نیازی به برنامه‌های متعدد را از بین ببرید. مدل ها را می توان از اینترنت یا ذخیره سازی محلی دانلود کرد.
* مدیریت قوانین یکپارچه: قوانین خواندن، نوشتن و جایگزینی را در یک برگه «قوانین» ترکیب کنید تا تجربه کاربری ساده‌تری داشته باشید.

مزایا:
* دسترس‌پذیری بهبودیافته: این راه‌حل یک ابزار دسترسی آفلاین و ایمن برای جوامع نابینا و ناشنوا فراهم می‌کند و طیف وسیع‌تری از معلولیت‌ها را تامین می‌کند.
* پشتیبانی چند زبانه: توانایی دانلود و مدیریت مدل‌های زبان آفلاین می‌تواند محدودیت‌های زبان‌هایی مانند پشتو را برطرف کند و انعطاف‌پذیری بیشتری در زبان ارائه دهد.
* عملکرد پیشرفته: ادغام عملکردهای شرپا ابزارهای کمکی اضافی برای نوشتن را فراهم می کند و تجربه کلی کاربر را بهبود می بخشد.

رسیدگی به نگرانی ها:
* امنیت: ما خطرات امنیتی مربوط به نسخه های کرک شده اپ های صفحه خوان مانند کامنتری را تایید می کنیم. با ترویج یک رویکرد ایمن و منبع باز، می توانیم ایمنی کاربر را تضمین کنیم.
* در دسترس بودن داده ها: در حالی که ممکن است یک مدل پشتو شرپا به آسانی در دسترس نباشد، این راه حل راه را برای ادغام آینده زمانی که چنین مدل هایی در دسترس قرار می گیرند هموار می کند.

نکته پایانی:
* با مشاهده tts-server به عنوان ابزار دسترسی اصلی و فعال کردن پشتیبانی مدل Sherpa، می‌توانیم راه‌حلی قدرتمند، ایمن و چند زبانه ایجاد کنیم که نیازهای حیاتی جوامع مختلف معلول را برطرف می‌کند.
* هر روزی که به تأخیر می اندازیم، بسیاری از مردم قادر به خواندن، نوشتن، شنیدن یا مشارکت کامل در زندگی نیستند. هر روز که می گذرد، فرصت های آنها کمتر می شود. نگذاریم صدای آنها شنیده نشود.
psr_001.apk
33.5 MB
صفحه خوان پرودنس آخرین نسخه
صفحه خوان Prudence
شماره نسخه:
v2.0.3.20240929172005.56
Prudence Screen Reader است
صفحه نمایش قدرتمند نسل جدید
خواننده، به خصوص طراحی شده است
برای ساخت گوشی های هوشمند بیشتر
قابل دسترسی برای افراد دارای اختلال بینایی با عملکرد استثنایی و پاسخگویی برتر مشخص می شود
انجام کلیه وظایف


Prudence Screen Reader
Version number:
v2.0.3.20240929172005.56
Prudence Screen Reader is a
powerful new generation screen
reader, especially designed
to make smartphones more
accessible to people with visual impairment. It is characterized by exceptional performance and superior responsiveness in
performing all tasks.
simplest kotlin code to make an android screen reader with compose jetpac that can user set default tts engine from installed tts engines inside it
Sure! Here is a simple example of Kotlin code for an Android screen reader using Jetpack Compose, which allows the user to select a default Text-to-Speech (TTS) engine from the installed engines.

First, you'll need to add the following dependencies to your build.gradle file:

dependencies {
implementation "androidx.compose.ui:ui:1.0.0"
implementation "androidx.compose.material:material:1.0.0"
implementation "androidx.compose.ui:ui-tooling-preview:1.0.0"
implementation "androidx.activity:activity-compose:1.3.1"
}

Next, create the MainActivity and the Compose UI:

import android.app.Activity
import android.content.Context
import android.os.Bundle
import android.speech.tts.TextToSpeech
import android.speech.tts.TextToSpeech.EngineInfo
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import java.util.*

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val viewModel: TTSViewModel = viewModel()
TTSSelectionScreen(viewModel, this)
}
}
}

@Composable
fun TTSSelectionScreen(viewModel: TTSViewModel, activity: Activity) {
val ttsEngines by remember { viewModel.ttsEngines }
val selectedEngine by remember { viewModel.selectedEngine }

LaunchedEffect(Unit) {
viewModel.loadTTSEngines(activity)
}

Column(modifier = Modifier.padding(16.dp)) {
Text("Select TTS Engine")
Spacer(modifier = Modifier.height(8.dp))
ttsEngines?.let { engines ->
engines.forEach { engine ->
Row(verticalAlignment = Alignment.CenterVertically) {
RadioButton(
selected = (selectedEngine == engine),
onClick = { viewModel.setDefaultEngine(activity, engine) }
)
Text(engine.label)
}
Spacer(modifier = Modifier.height(8.dp))
}
}
}
}

class TTSViewModel : androidx.lifecycle.ViewModel() {
var ttsEngines = mutableStateOf<List<EngineInfo>?>(null)
var selectedEngine = mutableStateOf<EngineInfo?>(null)

fun loadTTSEngines(context: Context) {
val tts = TextToSpeech(context, null)
ttsEngines.value = tts.engines
selectedEngine.value = tts.defaultEngine?.let { engineName ->
tts.engines.find { it.name == engineName }
}
}

fun setDefaultEngine(context: Context, engine: EngineInfo) {
val tts = TextToSpeech(context) {
if (it == TextToSpeech.SUCCESS) {
tts.defaultEngine = engine.name
selectedEngine.value = engine
}
}
}
}

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
val viewModel: TTSViewModel = viewModel()
TTSSelectionScreen(viewModel = viewModel, activity = MainActivity())
}

This code sets up a basic screen that lists the available TTS engines and allows the user to select one as the default. When a TTS engine is selected, it updates the default engine used by the TextToSpeech service.

Keep in mind that this is a simple example and may require additional error handling and user feedback in a production environment. Let me know if you have any questions or need further assistance!
where is the code piece that gets text from android os and sends them to selected tts ?!
You're right; I didn't include that part earlier. Let's add the necessary code to fetch text from the Android OS and send it to the selected Text-to-Speech (TTS) engine.

Here's an updated version that includes a function to get text and send it to the TTS engine:

1. Add the permission for using the TTS in your AndroidManifest.xml:

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

2. Update your MainActivity and the Compose UI to include a TextField for input and a Button to trigger the TTS:

import android.os.Bundle
import android.speech.tts.TextToSpeech
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import java.util.*

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val viewModel: TTSViewModel = viewModel()
TTSSelectionScreen(viewModel, this)
}
}
}

@Composable
fun TTSSelectionScreen(viewModel: TTSViewModel, activity: MainActivity) {
val ttsEngines by remember { viewModel.ttsEngines }
val selectedEngine by remember { viewModel.selectedEngine }
val textToRead = remember { mutableStateOf("") }

LaunchedEffect(Unit) {
viewModel.loadTTSEngines(activity)
}

Column(modifier = Modifier.padding(16.dp)) {
Text("Select TTS Engine")
Spacer(modifier = Modifier.height(8.dp))
ttsEngines?.let { engines ->
engines.forEach { engine ->
Row(verticalAlignment = Alignment.CenterVertically) {
RadioButton(
selected = (selectedEngine == engine),
onClick = { viewModel.setDefaultEngine(activity, engine) }
)
Text(engine.label)
}
Spacer(modifier = Modifier.height(8.dp))
}
}
Spacer(modifier = Modifier.height(16.dp))
TextField(
value = textToRead.value,
onValueChange = { textToRead.value = it },
label = { Text("Enter text to read") }
)
Spacer(modifier = Modifier.height(8.dp))
Button(onClick = { viewModel.speakText(activity, textToRead.value) }) {
Text("Read Text")
}
}
}

class TTSViewModel : androidx.lifecycle.ViewModel() {
var ttsEngines = mutableStateOf<List<TextToSpeech.EngineInfo>?>(null)
var selectedEngine = mutableStateOf<TextToSpeech.EngineInfo?>(null)
private var tts: TextToSpeech? = null

fun loadTTSEngines(context: Context) {
tts = TextToSpeech(context, null)
ttsEngines.value = tts?.engines
selectedEngine.value = tts?.defaultEngine?.let { engineName ->
tts?.engines?.find { it.name == engineName }
}
}

fun setDefaultEngine(context: Context, engine: TextToSpeech.EngineInfo) {
tts = TextToSpeech(context) {
if (it == TextToSpeech.SUCCESS) {
tts?.defaultEngine = engine.name
selectedEngine.value = engine
}
}
}

fun speakText(context: Context, text: String) {
tts?.speak(text, TextToSpeech.QUEUE_FLUSH, null, null)
}
}

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
val viewModel: TTSViewModel = viewModel()
TTSSelectionScreen(viewModel = viewModel, activity = MainActivity())
}
This update includes a TextField for the user to input text and a Button to trigger the Text-to-Speech functionality. The speakText function is responsible for converting the text to speech using the selected TTS engine.

This should cover the basic functionality of getting text from the user and sending it to the selected TTS engine. Let me know if you need any further adjustments or explanations!
معرفی چنل‌های مرتبط با زمینه‌های مختلف فعالیت‌ ما

لینک چنل تبدیل متن به گفتار:
@ttsfarsi
@ttsenglish
لینک چنل تبدیل گفتار به متن:
@sttfarsi
لینک چنل تبدیل تصویر و pdf به متن:
@ocrfarsi
لینک چنل توسعه صفحه خوان اوپن سورس:
@msrfarsi
چنل جالب لاگ فوروارد چیزایی که جالب به نظر میرسن:
@jaleblog
چنل پادکست صوتی مسعود سافت:
@masouds0ft
لینک گروه چشمم باش:
https://t.me/+48S1fRi33fU2NGVk
لینک چنل ابزار استیل بیس‌لاینز:
@stablebaselines
لینک گالری مسوت:
@m0savet
لینک چنل خودرون، خودرو خود ران ایرانی:
@SDCFarsi

لیست تمام چنلهای مسعود سافت.
با کلیک روی این لینک میتونید در تمام چنلها با یک کلیک عضو بشوید.
https://t.me/addlist/KYBnlh_rCCljNTVk
ایجاد صفحه خوان مالتی پلتفرم (یعنی قابل اجرا روی تمام سیستم عاملها) توسط فلاتر.
Using Flutter to create a multiplatform screen reader involves integrating platform-specific accessibility APIs. Flutter itself provides basic accessibility features, but for advanced screen reader functionality, you’ll need to write platform-specific code using platform channels. Below, I’ll show you how to create a bridge for each platform (Android, iOS, Windows, macOS, and Linux).

---

### 1. Flutter Platform Channels
Flutter allows you to write platform-specific code using MethodChannel. You can call native code from Dart and vice versa.

---

### 2. Platform-Specific Code

#### Android (Kotlin)
Android uses the AccessibilityService API for screen reader functionality.

1. Create an AccessibilityService:
- In android/app/src/main/java/com/example/app/MyAccessibilityService.kt:

     package com.example.app

import android.accessibilityservice.AccessibilityService
import android.view.accessibility.AccessibilityEvent

class MyAccessibilityService : AccessibilityService() {
override fun onAccessibilityEvent(event: AccessibilityEvent?) {
// Handle accessibility events (e.g., text changes, button clicks)
}

override fun onInterrupt() {
// Handle interruption
}
}

2. Register the Service:
- In android/app/src/main/AndroidManifest.xml:

     <service
android:name=".MyAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_service_config" />
</service>

3. Accessibility Service Configuration:
- Create android/app/src/main/res/xml/accessibility_service_config.xml:

     <accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100" />

4. Flutter MethodChannel:
- In lib/main.dart:

     import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class MyAccessibility {
static const platform = MethodChannel('com.example.app/accessibility');

Future<void> startService() async {
try {
await platform.invokeMethod('startAccessibilityService');
} on PlatformException catch (e) {
print("Failed to start service: ${e.message}");
}
}
}

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

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Screen Reader')),
body: Center(
child: ElevatedButton(
onPressed: () => MyAccessibility().startService(),
child: Text('Start Screen Reader'),
),
),
),
);
}
}

---
#### iOS (Swift)
iOS uses the UIAccessibility API.

1. Enable Accessibility:
- In ios/Runner/AppDelegate.swift:

     import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let controller = window?.rootViewController as! FlutterViewController
let channel = FlutterMethodChannel(name: "com.example.app/accessibility", binaryMessenger: controller.binaryMessenger)
channel.setMethodCallHandler { call, result in
if call.method == "startAccessibilityService" {
UIAccessibility.post(notification: .announcement, argument: "Screen reader started")
result(nil)
} else {
result(FlutterMethodNotImplemented)
}
}
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}

2. Flutter MethodChannel:
- Use the same Dart code as above to call the method.

---
#### Windows (C++)
Windows uses the UI Automation API.

1. Create a Native Plugin:
- In windows/runner/main.cpp:

     #include <flutter/method_channel.h>
#include <flutter/plugin_registrar_windows.h>
#include <windows.h>
#include <uiautomation.h>

class ScreenReaderPlugin : public flutter::Plugin {
public:
static void RegisterWithRegistrar(flutter::PluginRegistrarWindows* registrar) {
auto channel = std::make_unique<flutter::MethodChannel<>>(
registrar->messenger(), "com.example.app/accessibility",
&flutter::StandardMethodCodec::GetInstance());

auto plugin = std::make_unique<ScreenReaderPlugin>();

channel->SetMethodCallHandler(
[plugin_pointer = plugin.get()](const auto& call, auto result) {
plugin_pointer->HandleMethodCall(call, std::move(result));
});

registrar->AddPlugin(std::move(plugin));
}

void HandleMethodCall(const flutter::MethodCall<>& call,
std::unique_ptr<flutter::MethodResult<>> result) {
if (call.method_name() == "startAccessibilityService") {
// Implement UI Automation logic here
result->Success();
} else {
result->NotImplemented();
}
}
};

void ScreenReaderPluginRegisterWithRegistrar(
FlutterDesktopPluginRegistrarRef registrar) {
ScreenReaderPlugin::RegisterWithRegistrar(
flutter::PluginRegistrarManager::GetInstance()
->GetRegistrar<flutter::PluginRegistrarWindows>(registrar));
}

2. Flutter MethodChannel:
- Use the same Dart code as above to call the method.

---
#### macOS (Swift)
macOS also uses the Accessibility API.

1. Enable Accessibility:
- In macos/Runner/AppDelegate.swift:

     import Cocoa
import FlutterMacOS

@main
class AppDelegate: FlutterAppDelegate {
override func applicationDidFinishLaunching(_ notification: Notification) {
let controller = mainFlutterWindow?.contentViewController as! FlutterViewController
let channel = FlutterMethodChannel(name: "com.example.app/accessibility", binaryMessenger: controller.engine.binaryMessenger)
channel.setMethodCallHandler { call, result in
if call.method == "startAccessibilityService" {
// Implement macOS Accessibility API logic here
result(nil)
} else {
result(FlutterMethodNotImplemented)
}
}
super.applicationDidFinishLaunching(notification)
}
}

2. Flutter MethodChannel:
- Use the same Dart code as above to call the method.

---
#### Linux (C)
Linux uses the AT-SPI (Assistive Technology Service Provider Interface).

1. Create a Native Plugin:
- In linux/my_plugin.cc:

     #include <flutter_linux/flutter_linux.h>
#include <atspi/atspi.h>

void screen_reader_plugin_register_with_registrar(FlPluginRegistrar* registrar) {
g_autoptr(FlMethodChannel) channel = fl_method_channel_new(
fl_plugin_registrar_get_messenger(registrar),
"com.example.app/accessibility",
FL_METHOD_CODEC(fl_standard_method_codec));

fl_method_channel_set_method_call_handler(channel, method_call_cb, nullptr, nullptr);
}

static void method_call_cb(FlMethodChannel* channel, FlMethodCall* method_call, gpointer user_data) {
if (strcmp(fl_method_call_get_name(method_call), "startAccessibilityService") == 0) {
// Implement AT-SPI logic here
fl_method_call_respond_success(method_call, nullptr, nullptr);
} else {
fl_method_call_respond_not_implemented(method_call, nullptr);
}
}

2. Flutter MethodChannel:
- Use the same Dart code as above to call the method.

---

### 3. Testing
- Test your screen reader on each platform to ensure compatibility and performance.
- Use real devices and assistive technologies (e.g., TalkBack on Android, VoiceOver on iOS/macOS).

This approach allows you to build a multiplatform screen reader using Flutter while leveraging platform-specific accessibility APIs.
MSRFarsi | MasoudSoft Screen Reader pinned «ایجاد صفحه خوان مالتی پلتفرم (یعنی قابل اجرا روی تمام سیستم عاملها) توسط فلاتر. Using Flutter to create a multiplatform screen reader involves integrating platform-specific accessibility APIs. Flutter itself provides basic accessibility features, but for advanced…»
Forwarded from Deleted Account
https://github.com/M-Taghizadeh/Persian_Question_Answering_Voice2Voice_AI.git

خدمت شما
پروژه voice to voice فارسی هست.
خیلی کاربردی هست. یه TTS API هم توی کد app.py داره که صدای خوبی هم داره و آموزش دیده شده هست.
خودش ازش به عنوان هوش مصنوعی بومی نوشته. اما خوب کد میاد متن های هماهنگ با متن ورودی رو از ویکی پدیا میگیره و راحت و بدون ویرایش میده بیرون.
در صورتی که یه GPT2 روش پیاده شه، بی نظیر میشه.
#هکاتون
نرم افزاری که
با دست زدن یا سوت زدن یا هر صدایی
گوشی رو پیدا کنیم