(SOFT) SOFT (2011 год)

SoundCreator - пакетная озвучка английского текста (первая версия)

SoundCreator - пакетная озвучка английского текста

В отличие от первой версии - вторая версия не только делает озвучку, но и строит вот такие XML-файлики с переводом, которые можно скармливать специальному обучающему плееру - 600 слов из букваря Баррона.


   1:  <Lesson>
   2:     <Sound file="range.mp3" >
   3:       <English text="range = range , area" />
   4:       <Russian text="Диапазон = диапазон области" />
   5:     </Sound>
   6:     <Sound file="maneuver.mp3" >
   7:       <English text="maneuver = maneuver , a movement" />
   8:       <Russian text="маневра = маневр движения" />
   9:     </Sound>
  10:     <Sound file="performance.mp3" >
  11:       <English text="performance = performance , how well a person or machine does something" />
  12:       <Russian text="производительность = производительность , насколько хорошо человек или машина делает что-то" />
  13:     </Sound>
  14:  </Lesson>

Чтобы не возится и сделать прогу побыстрее (в пару символов кода - в строке 69) - я не стал писать свой JSON-парсер (как я сделал в своей уже устаревшей проге GoogleTranslate - устаревшей, потому что Google Translate API стал платным), а взял готовый парсер - JsonFx v2.0, соответственно при работе с моей прогой - сборку с этим JSON-парсером вам надо докопировать в тот же каталог, в котором находится прога SoundCreator2 и обрабатываемые файлы.

Как вы видите в строке 67 - гугловский формат JSON немного не соответствует стандартному - поэтому я вставил пустые нолики в тех местах - на которых парсер падает. Кстати, микрософтовский парсер System.Runtime.Serialization.Json.DataContractJsonSerializer упал ровно в тех же местах - по-видимому у ГУГЛА все-таки свой собственный нестандартный диалект JSON.

Насчет платности официального гугловского АПИ - не пугайтесь, моя прога обращается к гуглу конечно бесплатно. В конце концов прикрутить к любой проге базу на SQLIte со ста тысячами словарных слов и переводом - займет минут 10. Кому придет в голову платить за то - что эта база лежит на сервере ГУГЛа, а не собственном кампутере? Ну разве что амирикосы из глубокой провинции, которых откармливают куриными окорочками и булочками из макдональдса - может они готовы оплачивать Google Translate API? Но я точно не готов за это платить.


Итак, времени было совсем немного - я потратил буквально час и модифицировал первую версию кода для новых задач вот так:


   1:  Module Module1
   2:   
   3:      Sub Main()
   4:          Try
   5:              Dim PRM() As String = Environment.GetCommandLineArgs
   6:              If PRM.Count < 2 Then
   7:                  GoTo usage
   8:              Else
   9:                  If Not My.Computer.FileSystem.FileExists(PRM(1)) Then
  10:                      Console.WriteLine("no filename " & PRM(1))
  11:                      Console.ReadLine()
  12:                  Else
  13:                      Dim XML As New Text.StringBuilder("<Lesson>" & vbCrLf)
  14:                      '
  15:                      Dim AllRows As String = My.Computer.FileSystem.ReadAllText(PRM(1), System.Text.UTF8Encoding.UTF8)
  16:                      Dim RDR As System.IO.StringReader = New System.IO.StringReader(AllRows)
  17:                      While True
  18:                          Dim OneRow As String = RDR.ReadLine
  19:                          If OneRow <> "" Then
  20:                              Dim Columns() As String = OneRow.Split("=")
  21:                              If Columns.Length = 2 Then
  22:                                  Dim SoundFileName As String = Columns(0).Trim & ".mp3"
  23:                                  Dim Txt As String = Columns(1)
  24:                                  Dim Buf As Byte() = GetBinaryContents("http://translate.google.ru/translate_tts?ie=UTF-8&q=" & Txt & "&tl=en&prev=input")
  25:                                  My.Computer.FileSystem.WriteAllBytes(SoundFileName, Buf, False)
  26:                                  Console.WriteLine(SoundFileName)
  27:                                  '
  28:                                  XML.AppendLine("<Sound file=""" & SoundFileName & """ >")
  29:                                  XML.AppendLine("     <English text=""" & OneRow & """ />")
  30:                                  XML.AppendLine("     <Russian text=""" & Translate(OneRow) & """ />")
  31:                                  XML.AppendLine("</Sound>")
  32:                                  '
  33:                                  System.Threading.Thread.Sleep(1000)
  34:                              Else
  35:                                  Console.WriteLine("no '=' separator in line " & OneRow)
  36:                                  Console.ReadLine()
  37:                              End If
  38:                          Else
  39:                              Exit While
  40:                          End If
  41:                      End While
  42:                      '
  43:                      XML.AppendLine("</Lesson>")
  44:                      My.Computer.FileSystem.WriteAllText("Lesson.xml", XML.ToString, False, System.Text.Encoding.UTF8)
  45:                  End If
  46:              End If
  47:              Exit Sub
  48:          Catch ex As Exception
  49:              Console.WriteLine(ex.Message)
  50:              Console.ReadLine()
  51:          End Try
  52:   
  53:  usage:
  54:          Console.WriteLine("Usage:   SoundCreator.exe FileName" & vbCrLf & _
  55:                            "each row in 'FileName' (UTF-8 encoding) contains two fiedls, separated by '='" & vbCrLf & _
  56:                            "first fields - MP3 filename with voice to be creating, second fiedls - english text for sound")
  57:          Console.ReadLine()
  58:      End Sub
  59:   
  60:      'трянсляция через GOOGLE
  61:      Public Function Translate(ByVal Source As String) As String
  62:          Dim InputString As String = Source.Replace("&", " ").Replace("""", " ").Replace(",", " ").Replace("'", " ").Replace("?", " ")
  63:          Dim JSON As String
  64:          JSON = GetContents("http://translate.google.ru/translate_a/t?client=t&text=" & InputString & "&hl=ru&sl=en&tl=ru&multires=1&otf=2&ssel=0&tsel=0&sc=1")
  65:          Dim Target As String = ""
  66:          If JSON IsNot Nothing Then
  67:              JSON = JSON.Replace(",,", ",0,").Replace(",,", ",0,")
  68:              Dim X = (New JsonFx.Json.JsonReader).Read(JSON)
  69:              Target = X(0)(0)(0).ToString
  70:          End If
  71:          Return Target
  72:      End Function
  73:   
  74:      'считывает бинарный контент с подавлением ошибок
  75:      Public Function GetBinaryContents(ByVal URL As String) As Byte()
  76:          Try
  77:              'запрос по HTTP
  78:              Dim PageRequest As System.Net.HttpWebRequest = CType(System.Net.WebRequest.Create(URL), System.Net.HttpWebRequest)
  79:              'Отправлен запрос
  80:              Dim PageResponse As System.Net.HttpWebResponse = PageRequest.GetResponse
  81:              'Получен ответ
  82:              Dim Reader As New System.IO.BinaryReader(PageResponse.GetResponseStream)
  83:              Dim Buf As Byte() = Reader.ReadBytes(100000)
  84:              Reader.Close()
  85:              Return Buf
  86:              'Загружено в память
  87:          Catch x As System.Exception
  88:              'пусть молча идет дальше при ошибках
  89:          End Try
  90:      End Function
  91:   
  92:   
  93:      'считывает HTML-странички с подавлением ошибок
  94:      Public Function GetContents(ByVal URL As String) As String
  95:          Try
  96:              'запрос по HTTP
  97:              Dim PageRequest As System.Net.HttpWebRequest = CType(System.Net.WebRequest.Create(URL), System.Net.HttpWebRequest)
  98:              PageRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"
  99:              PageRequest.Headers.Add("Accept-Language", "ru,en-us;q=0.7,en;q=0.3")
 100:              PageRequest.Headers.Add("Accept-Charset", "windows-1251,utf-8;q=0.7,*;q=0.7")
 101:              'Отправлен запрос
 102:              Dim PageResponse As System.Net.HttpWebResponse = PageRequest.GetResponse
 103:              'Получен ответ
 104:              Dim Reader As New System.IO.StreamReader(PageResponse.GetResponseStream(), System.Text.Encoding.UTF8)
 105:              Dim HTML As String = Reader.ReadToEnd
 106:              Reader.Close()
 107:              'Загружено в память
 108:              Return HTML
 109:          Catch x As System.Exception
 110:              'пусть молча идет дальше при ошибках
 111:          End Try
 112:      End Function
 113:   
 114:  End Module

Для этой версии я не создавал нового проекта и сгрузить мою прогу в готовом откомпилированном виде вы можете оттуда же, откуда и первую версию - SoundCreator - пакетная озвучка английского текста.



Comments ( )
Link to this page: //www.vb-net.com/SoundCreator2/index.htm
< THANKS ME>