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 - пакетная озвучка английского текста.
|