انجمن سایت کلیدستان


رتبه موضوع:
  • 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
حرکت متن با صوت (برنامه نویسی اندروید)

حرکت متن با صوت (برنامه نویسی اندروید)

#1
سلام
من میخوام یه فایل صوتی داشته باشم و یه متن.
بعدش متن و صوت با هم هماهنگ باشن.
مثل نرم افزار زیارت ناحیه مقدسه
https://cafebazaar.ir/app/com.mobinmobil...ahie/?l=fa

مثلا وقتی که صوت داره اجرا میشه اون جایی از متن رو که داره میخونه رو مشخص کنه.

چطوری باید این کار رو انجام بدم؟
پاسخ

حرکت متن با صوت (برنامه نویسی اندروید)

#2
سلام
برای این کار دو راه حل دارید

اول اینکه بیاید برای هر فایل صوتی یه سری metatag یا داده اضافی درباره اون فایل صوتی قرار بدید و بعد از اجرای اون فایل صوتی بیاید اون داده های اضافی رو بخونید.
حالا که داده های اضافی رو خوندید متوجه میشید که باید کدوم فایل متنی رو بیارید و باز کنید و داخلش رو بخونید
برای همزمانی صوت و متن باید به صورت هر 1 ثانیه یک بار فایل متنی رو باز و با زمان فایل صوتی چک کنید که در صورت وجود متن در ان زمان بخصوص متن نمایش داده بشه و در غیر این صورت نمایش داده نشه
حالا فایل متن شما باید دقیقا مثل فایل زیرنویس فیلمها یا lyric اهنگها باشه تا بتونید به صورت گفته شده بخونیدش

راه دوم استفاده از کتابخانه 3d party هستش که این کار رو براتون انجام میده
بشرطی که فایل lyric شما با اهنگ هاتون هماهنگ باشه
http://javamusictag.sourceforge.net/

راه سومی هم هست که فعلا مطلب زیادی در موردش پیدا نمیشه و اونم تشخیص و شناسایی Voice هستش که خیلی سخت و پیچیدست و ظاهرا هنوز برای اندروید کتابخانه خاصی براش نیست که بتونه بصورت پایدار و درست این کارو براتون انجام بده
پاسخ
 سپاس شده توسط admin ، af94 ، msh ، sohrabjam

حرکت متن با صوت (برنامه نویسی اندروید)

#3
حالا چطوری باید این کارها رو انجام بدم؟

مثلا کدهاش چطوری میشه؟ و در کل به این کار چی میگن؟
پاسخ

حرکت متن با صوت (برنامه نویسی اندروید)

#4
با استفاده از کد زیر میتونید زمان کامل و زمان سپرده شده از فایصوتی رو بدست بیارید

کد:
protected void setProgressText() {

   final int HOUR = 60*60*1000;
   final int MINUTE = 60*1000;
   final int SECOND = 1000;

   int durationInMillis = mediaPlayer.getDuration();
   int curVolume = mediaPlayer.getCurrentPosition();

   int durationHour = durationInMillis/HOUR;
   int durationMint = (durationInMillis%HOUR)/MINUTE;
   int durationSec = (durationInMillis%MINUTE)/SECOND;

   int currentHour = curVolume/HOUR;
   int currentMint = (curVolume%HOUR)/MINUTE;
   int currentSec = (curVolume%MINUTE)/SECOND;

   if(durationHour>0){
       System.out.println(" 1 = "+String.format("%02d:%02d:%02d/%02d:%02d:%02d",
               currentHour,currentMint,currentSec, durationHour,durationMint,durationSec));            
   }else{
       System.out.println(" 1 = "+String.format("%02d:%02d/%02d:%02d",
               currentMint,currentSec, durationMint,durationSec));
   }
}

با استفاده از این کد میتونید محتوای یک فایل متنی رو بخونید
کد:
File file = new File(your file);

try {
   FileInputStream in = new FileInputStream(file);
               int len = 0;
               byte[] data1 = new byte[1024];
       while ( -1 != (len = in.read(data1)) ){
            if(new String(data1, 0, len).contains(Your String))
                //Jim, we got him...
       }


} catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}
و با استفاده از این متد که در JAVA8 وجود داره میتونید به یک خط خاصی از فایل متنی دسترسی داشته باشید
کد:
Java 8 solution:

For small files:

String line32 = Files.readAllLines(Paths.get("file.txt")).get(32)
For large files:

try (Stream<String> lines = Files.lines(Paths.get("file.txt"))) {
   line32 = lines.skip(31).findFirst().get();
}

حالا با استفاده از کدهای بالا میتونید یک فایل صوتی رو پخش کنید و همزان با پخش فایل صوتی، فایل زیرنویس یا متن اون رو هم باز کرده و خط مورد نظر رو بخونید و نمایش بدید
پاسخ
 سپاس شده توسط admin ، sohrabjam ، af94

حرکت متن با صوت (برنامه نویسی اندروید)

#5
ممنون
متن هایی که دارم رو توی TextView باید نمایش بدم؟
نمیدونم باید برای این کار چه کارهایی انجام بدم.
مرحله به مرحله اش رو نمیدونم ممنون میشم راهنمایی کنید.
پاسخ

حرکت متن با صوت (برنامه نویسی اندروید)

#6
سلام دوستان
اگه کسی تجربه ای در این زمینه داره لطفا به اشتراک بگذاره .
من طبق راهنمایی دوستمون یه سری داده اضافی تو بانک اطلاعاتم که Sqlite  هستش شامل زمان سپری شده هر بخش از دعا که خونده میشه را ایجاد کردم. بعد کدهای لازم را برای نمایش دعای مورد نظرو اجرای mediaplayer  نوشتم. نمایش متن و کل زمان فایل صوتی و زمان سپری شده به راحتی در برنامه نمایش داده میشه . اما برای اینکه زمان سپری شده از پخش فایل صوتی با داده اضافی ایجاد شده در بانک مقایسه بشه تا متن مورد نظر نمایش داده بشه یا Listview به صورت اتوماتیک حرکت بکنه مشکل پیدا کردم. زمان سپری شده فقط یک بار و در زمان کلیک روی کلید play  با داده های من مقایسه میشه در صورتیکه من نیاز دارم مرتب زمان سپری شده با اون داده ها مقایسه بشه و در صورت درست بودن شرط کاری ( نمایش متن ) انجام بشه. تو اینترنت هم خیلی جستجو کردم حتی در سایتهای خارجی در حد توان ولی به نتیجه نرسیدم . در مرحله بعد از Runnable UpdateSongTime استفاده کردم که برای نمایش کل زمان و زمان سپری شده استفاده میکردم . ولی به نتیجه نرسیدم. چون متغیر بدست اومده CharSequence هستش و هر کاری کردم که به String  و بعدش Integer تبدیلش کنم و اون شرطم را باهاش مقایسه کنم نشد که نشد. در مرحله بعد اومدم از روش CountDownTimer اجرای یه سری کد پس از گذشت زمان مشخص استفاده کردم . که متاسفانه به نتیجه نرسید. در مرحله بعد اومدم از آرایه برای ذخیره زمان سپری شده در هر ثانیه استفاده کردم که اونم جواب نداد. نمونه کدم را براتون میزارم دوستان استاد یه نظری بدن و در صورت امکان یه نمونه کد بزارند تا مشکل حل بشه.

کد پی‌اچ‌پی:
@Override
    public void onClick
(View view) {
 
       switch (view.getId()) {
 
           case R.id.play_button:
 
               mediaPlayer.start();

 
               finalTime mediaPlayer.getDuration();
 
               if (oneTimeOnly == 0) {
 
                   seek_bar.setMax((int) finalTime);
 
                   oneTimeOnly 1;
 
               }
 
               tx4.setText(String.format("%02d : %02d",
 
                       TimeUnit.MILLISECONDS.toMinutes((longfinalTime),
 
                       TimeUnit.MILLISECONDS.toSeconds((longfinalTime) -
 
                               TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((longfinalTime)))
 
               );
 
               seek_bar.setProgress((int) startTime);
 
               myHandler.postDelayed(UpdateSongTime100);

 
               db.open();
 
               int s db.count("tbl1""time");
 
               mytime = new Integer[s];
 
               for (int i 0si++) {
 
                   mytime[i] = (db.Time_display("tbl1"i));
 
                   st String.valueOf(mytime[i]);
 
                   st2 Integer.parseInt(st);

 
                   if (startTime == st2 ){
 
                       Toast.makeText(getApplicationContext(), (String.valueOf("Yes")), Toast.LENGTH_LONG).show();
 
                   }else {
 
                       Toast.makeText(getApplicationContext(), (String.valueOf(tt)), Toast.LENGTH_LONG).show();
 
                   }
 
               }
 
               db.close();

 
              // new CountDownTimer(2000,1000){
 
                  // @Override
 
                  // public void onTick(long millisUntilFinished){}

 
                  // @Override
 
                   //public void onFinish(){

 
                      // your code

 
                  // }
 
              // }.start();

 
               break;
 
           case R.id.pause_button:
 
               mediaPlayer.pause();
 
       }
 
   }


 
   private Runnable UpdateSongTime = new Runnable() {
 
       public void run() {

 
           startTime mediaPlayer.getCurrentPosition();
 
           tx1.setText(String.valueOf( ((longstartTime)));
 
           ttt = (tx1.getText().toString());
 
           tt Integer.parseInt(ttt);

 
           tx3.setText(String.format("%02d : %02d / ",
 
                   TimeUnit.MILLISECONDS.toMinutes((longstartTime),
 
                   TimeUnit.MILLISECONDS.toSeconds((longstartTime)-
 
                           TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((longstartTime)))
 
           );
 
           seek_bar.setProgress((int) startTime);
 
           myHandler.postDelayed(this100);

 
       }
 
   }; 
پاسخ
 سپاس شده توسط شماره مجازی امارات ، تلگرام ضد فیلتر 2023


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان