iVocaloid论坛

标题: 【DDB】写了个初步的拆DDB工具 [打印本页]

作者: Zleepwalking    时间: 2013/6/10 12:08     标题: 【DDB】写了个初步的拆DDB工具

本帖最后由 Zleepwalking 于 2013/6/10 12:11 编辑

QQ截图20130610120305.png
如图,一个简单的小工具。只是把FRM2和SND拆出来而已,ENV包含在拆出的FRM2里。。。
理论上拆出来的东西还能拼回一个DDB,虽然拆了再拼也没啥意义= =

疾风月影说他想分析洛天依的发音表,于是托我写了这么一个坑货。。。会输出好几万个文件。。。所以最好有点心里准备。。。你要有4.08G大的硬盘空间(用来拆洛天依),点下开始提取后你的CPU风扇会狂转,然后硬盘咯吱咯吱地响,如果是固态硬盘的话你可以买块新的了= =【我开玩笑的。。。

短期内就两个应用价值,一个是前面提到的研究中文连续音发音表,另一个是(或许能)制造出DDB文件暴力压缩工具。。。

http://pan.baidu.com/share/link?shareid=1261087320&uk=3423845838

源代码很短:
'
' Created by SharpDevelop.
' Sleepwalking
'
'
Imports System.IO
Public Partial Class MainForm
    Private DDBAddr As String
    Private OutputAddr As String
    Private DDBStream As FileStream
    Private DDBReader As BinaryReader
    Private WriterStream As FileStream
    Private Writer As BinaryWriter
   
    Private MemoryBuffer(1024 * 1024 * 5) As Byte '5MB
    Private MemoryBufferStream As MemoryStream = New MemoryStream(MemoryBuffer)
    Private MemoryWriter As BinaryWriter = New BinaryWriter(MemoryBufferStream)
   
    Public Sub New()
        Me.InitializeComponent()
    End Sub
   
    Sub Button1Click(sender As Object, e As EventArgs)
        openFileDialog1.ShowDialog()
        DDBAddr = openFileDialog1.FileName
    End Sub
   
    Sub Button2Click(sender As Object, e As EventArgs)
        folderBrowserDialog1.ShowDialog()
        OutputAddr = folderBrowserDialog1.SelectedPath
    End Sub
   
    Sub Button3Click(sender As Object, e As EventArgs)
        Dim TrunkIdntfyr(3) As Char
        Dim TrunkLen As Integer
        Dim TrunkAudioSRate As Integer
        Dim TrunkAudioChannel As Int16
        Dim TrunkBeginPosition As Long
        Dim Count_FRM2 As Integer = 0
        Dim Count_SND As Integer = 0
        
        Directory.CreateDirectory(OutputAddr & "FRM2\")
        Directory.CreateDirectory(OutputAddr & "SND\")
        DDBStream = New FileStream(DDBAddr, FileMode.Open)
        DDBReader = New BinaryReader(DDBStream)
        While DDBStream.Position < DDBStream.Length
            progressBar1.Value = CInt(TrunkBeginPosition/ DDBStream.Length * 100)
            TrunkBeginPosition = DDBStream.Position
            TrunkIdntfyr = DDBReader.ReadChars(4)
            TrunkLen = DDBReader.ReadInt32()
            Select Case TrunkIdntfyr
                Case "FRM2"
                    Count_FRM2 += 1
                    If CheckBox_OutputFRM2.Checked Then
                        MemoryBufferStream.Position = 0
                        MemoryWriter.Write(TrunkIdntfyr)
                        MemoryWriter.Write(TrunkLen)
                        MemoryWriter.Write(DDBReader.ReadBytes(TrunkLen - 8))
                        If RadioButton_Address.Checked Then
                            WriterStream = New FileStream(OutputAddr & "FRM2\" & "FRM2_" & TrunkBeginPosition.ToString("X") & ".frm2", FileMode.Create)
                        Else
                            WriterStream = New FileStream(OutputAddr & "FRM2\" & "FRM2_" & Count_FRM2 & ".frm2", FileMode.Create)   
                        End If
                        WriterStream.Write(MemoryBuffer, 0, CInt(MemoryBufferStream.Position))
                        WriterStream.Close()
                    Else
                        DDBStream.Position += TrunkLen - 8
                    End If
                Case "SND "
                    Count_SND += 1
                    TrunkAudioSRate = DDBReader.ReadInt32()
                    TrunkAudioChannel = DDBReader.ReadInt16()
                    MemoryBufferStream.Position = 0
                    MemoryWriter.Write(TrunkIdntfyr)
                    MemoryWriter.Write(TrunkLen)
                    MemoryWriter.Write(TrunkAudioSRate)
                    MemoryWriter.Write(TrunkAudioChannel)
                    MemoryWriter.Write(DDBReader.ReadBytes(TrunkLen - 14))
                    If RadioButton_Address.Checked Then
                        WriterStream = New FileStream(OutputAddr &  "SND\" & "SND_" & TrunkBeginPosition.ToString("X") & ".snd", FileMode.Create)
                    Else
                        WriterStream = New FileStream(OutputAddr &  "SND\" & "SND_" & Count_SND & ".snd", FileMode.Create)
                    End If
                    WriterStream.Write(MemoryBuffer, 0, CInt(MemoryBufferStream.Position))
                    WriterStream.Close()
            End Select
        End While
    End Sub
End Class


图片附件: QQ截图20130610120305.png (2013/6/10 12:02, 4.99 KB) / 下载次数 10
http://bbs.ivocaloid.com/forum.php?mod=attachment&aid=NzIxMzl8YzQ3NDEyMjB8MTc0OTMxNjg0MnwwfDA%3D


作者: rgwan    时间: 2013/6/10 14:03

注意使用RAMDISK。建议别用硬盘。小心报废。
作者: Tnga    时间: 2015/1/2 14:48

Sleepwalking你知道么...其实3年前有前辈写过类似东西....不过我一直用不了(输出全是同一个元音)
继续支持LZ事业
作者: Ehobits    时间: 2017/9/25 08:29

连接挂了希望楼主补发,正好需要这么个东西
作者: Mux    时间: 2017/12/2 20:22

Ehobits 发表于 2017/9/25 08:29
连接挂了希望楼主补发,正好需要这么个东西

按照源代码我编译出来了但是。。。提取出的文件都是.snd文件千方百计没法播放的那种

作者: Chiken_P    时间: 2018/1/13 19:57

链接挂了AAAAAA求补

作者: Filo97    时间: 2019/2/3 03:34

是否有可能重新上载?
作者: 18736639203    时间: 2020/6/24 09:35

Mux 发表于 2017/12/2 20:22
按照源代码我编译出来了但是。。。提取出的文件都是.snd文件千方百计没法播放的那种
...

snd可以用GoldWave打开的,v声库也可以直接在里面播放,就是我一直不能单独拆出来每个音
作者: mcst12345    时间: 2022/4/28 14:52

这个源码是什么语言的




欢迎光临 iVocaloid论坛 (http://bbs.ivocaloid.com/) Powered by Discuz! X2