Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2009, 11:12   #1
Сергей86
 
Регистрация: 09.10.2009
Сообщений: 4
По умолчанию Sound Forge редактирование скрипта на C#

Я обрабатываю в программе Sound Forge 9 записи лекций. Лекции диктовались под запись, поэтому между словами и фразами значительные паузы. Моя цель - удалить паузы. При этом лекция становится в два раза короче. Эти паузы я отслеживаю по громкости звука, но часто в паузу попадают непродолжительные шумы, по громкости сопоставимые с голосом, что делает невозможным удаление паузы целиком. К счастью шумы, которые попадают в паузы имеют продолжительность не более полсекунды, а одно слово лектор произносит минимум за полсекунды. Вообщем, в итоге у меня все сводится к тому, что надо сохранить все области (отмеченные части звукового файла) в один файл. В Sound Forge есть файл скрипта, который сохраняет каждую область в отдельный файл. Вот его содержание:
Код:
using System;
using System.IO;
using System.Windows.Forms;
using SoundForge;

//Run with a file that contains regions
//Iterates through the regions, renders to PCA and saves the rendered file to c:\media\rip
//Scan the file for MODIFY HERE to see how to quickly customize for your own use

public class EntryPoint {
public void Begin(IScriptableApp app) {

   //MODIFY HERE-----------------------------------------------
   string szType  = ".pca"; //choose any valid extension: .avi  .wav  .w64 .mpg .mp3 .wma .mov .rm .aif .ogg .raw .au .dig .ivc .vox .pca
   object vPreset = ""; //put the name of the template between the quotes, or leave blank to pop the Template chooser. 
   string szDir   = @"c:\Media\Rip"; //change the target path here

   ISfFileHost file = app.CurrentFile;
   if (null == file)
   {
      app.SetStatusText("Open a file containing regions before running this script. Script stopped.");    
      return;
   }   

   //make sure the directory exists
   Directory.CreateDirectory(szDir);

   ISfRenderer rend = null;
   if (szType.StartsWith("."))
       rend = app.FindRenderer(null, szType);
   else 
       rend = app.FindRenderer(szType, null);

   if (null == rend)
   {
      app.SetStatusText("Renderer not found. Script stopped.");    
      DPF("renderer for {0} not found.", szType);
      return;
   }

   // if the preset parses as a valid integer, then use it as such, otherwise assume it's a string.
   try {
       int iPreset = int.Parse((string)vPreset);
       vPreset = iPreset;
   } catch (FormatException) {}

   ISfGenericPreset template = null;
   if ((string)vPreset != "")
       template = rend.GetTemplate(vPreset);
   else   
       template = rend.ChooseTemplate((IntPtr)null, vPreset);
   if (null == template)
   {
      app.SetStatusText("Template not found. Script stopped.");      
      return;
   }
   
   string szBase = file.Window.Title;

   foreach (SfAudioMarker mk in file.Markers)
   {
      if (mk.Length <= 0)
         continue;

      string szName = String.Format("{0:d2}-{1}-({2}).{3}", mk.Ident, szBase, mk.Name, rend.Extension);
      szName = SfHelpers.CleanForFilename(szName);
      DPF("Queueing: '{0}'", szName);

      string szFullName =  Path.Combine(szDir, szName);
      if (File.Exists(szFullName))
          File.Delete(szFullName);

      SfAudioSelection  range = new SfAudioSelection(mk.Start, mk.Length);
      file.RenderAs(szFullName, rend.Guid, template, range, RenderOptions.RenderOnly);
   }

   SfStatus status = app.WaitForDoneOrCancel();
   DPF("Done -{0}", status);
}


public void FromSoundForge(IScriptableApp app) {
   ForgeApp = app; //execution begins here
   app.SetStatusText(String.Format("Script '{0}' is running.", Script.Name));
   Begin(app);
   app.SetStatusText(String.Format("Script '{0}' is done.", Script.Name));
}
public static IScriptableApp ForgeApp = null;
public static void DPF(string fmt, params object[] args) { ForgeApp.OutputText(String.Format(fmt, args)); }
} //EntryPoint
А мне нужно сохранить все области в один файл. Скорее всего, переделать этот скрипт под мою задачу совсем просто, но я раньше вообще не писал на C#. Главное, конечно, делается в цикле
Код:
foreach (SfAudioMarker mk in file.Markers)
   {
      if (mk.Length <= 0)
         continue;

      string szName = String.Format("{0:d2}-{1}-({2}).{3}", mk.Ident, szBase, mk.Name, rend.Extension);
      szName = SfHelpers.CleanForFilename(szName);
      DPF("Queueing: '{0}'", szName);

      string szFullName =  Path.Combine(szDir, szName);
      if (File.Exists(szFullName))
          File.Delete(szFullName);

      SfAudioSelection  range = new SfAudioSelection(mk.Start, mk.Length);
      file.RenderAs(szFullName, rend.Guid, template, range, RenderOptions.RenderOnly);
   }
Сергей86 вне форума Ответить с цитированием
Старый 09.10.2009, 11:13   #2
Сергей86
 
Регистрация: 09.10.2009
Сообщений: 4
По умолчанию

На ощуп написал:
Код:
string szName = String.Format("{0}.{1}", mk.Name, rend.Extension);
szName = SfHelpers.CleanForFilename(szName);
DPF("Queueing: '{0}'", szName);

string szFullName =  Path.Combine(szDir, szName);
if (File.Exists(szFullName))
      File.Delete(szFullName);

foreach (SfAudioMarker mk in file.Markers)
   {
      if (mk.Length <= 0)
         continue;

      SfAudioSelection  range = new SfAudioSelection(mk.Start, mk.Length);
      file.RenderAs(szFullName, rend.Guid, template, range, RenderOptions.RenderOnly);
   }
Но этот код завершается с ошибкой. Что делать не знаю, т.к. C# раньше не видел, если это он. Может кто мне поможет. В силу незнания, я прежде всего жду готовых решений, а не рекомендаций. Помогите.
Сергей86 вне форума Ответить с цитированием
Старый 12.10.2009, 05:42   #3
Сергей86
 
Регистрация: 09.10.2009
Сообщений: 4
По умолчанию

Придумал, как сделать
Код:
using System;
using System.IO;
using System.Windows.Forms;
using SoundForge;

public class EntryPoint {
public void Begin(IScriptableApp app) {

   ISfFileHost file = app.CurrentFile;
   if (null == file)
      return;

   long len = file.SampleRate / 2;
   foreach (SfAudioMarker mk in file.Markers)
   {
      if (mk.Length <= 0)
         continue;
      if (mk.Length >= len)
         continue;
     
      file.DeleteAudio(mk.Start, mk.Length);
   }
}

public void FromSoundForge(IScriptableApp app) {
   ForgeApp = app; //execution begins here
   app.SetStatusText(String.Format("Script '{0}' is running.", Script.Name));
   Begin(app);
   app.SetStatusText(String.Format("Script '{0}' is done.", Script.Name));
}
public static IScriptableApp ForgeApp = null;
}
Сергей86 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переменные скрипта wall66 PHP 7 12.12.2008 17:14
Активация VBS Скрипта Titan123 JavaScript, Ajax 1 22.10.2008 12:27
sound djbaxo Общие вопросы C/C++ 4 20.05.2007 21:52