四、用go语言,对输入链长度为 n 的矩阵链乘法问题,描述其子问题图:它包含多少个顶点?包含多少条边?这些边分别连接哪些顶点?

文心一言:

矩阵链乘法问题是一个经典的动态规划问题,其中给定一个矩阵链,我们需要确定一个乘法顺序,使得计算该链所需的总标量乘法次数最少。

子问题图(也叫DAG,有向无环图)的顶点表示子问题的解,边表示子问题之间的关系。在矩阵链乘法问题中,每个子问题可以定义为计算从第i个矩阵到第j个矩阵的乘积的最优方式,其中i <= j。因此,对于长度为n的矩阵链,我们可以有C(n, 2) + n个子问题,其中C(n, 2)表示从n个不同矩阵中选择2个矩阵(包括非连续的情况)的组合数,但实际上由于我们只关心连续子序列的情况,因此实际的子问题数量是n(n-1)/2 + 1(或者说n(n+1)/2,如果我们包括整个链作为一个子问题的话)。然而,更常见的是将子问题定义为计算从第i个矩阵到第j个矩阵的乘积,其中i < j,这样子问题的数量就是n(n-1)/2。

不过,为了简化问题,我们通常将子问题定义为:对于链中的每个可能的子区间 [i, j],计算矩阵Ai乘以Aj的最优成本,其中i < j。这样,子问题的数量就是O(n^2)个,具体来说是n(n-1)/2个不同的子区间(不包括单个矩阵的情况,因为单个矩阵没有乘法操作)。每个子问题对应图中的一个顶点。

边的情况稍微复杂一些,因为每个子问题都依赖于更小的子问题的解。具体来说,对于计算从第i个矩阵到第j个矩阵的乘积的子问题,我们需要考虑所有可能的k(i < k < j),这样我们可以将问题分解为计算从第i个矩阵到第k个矩阵的乘积和从第k+1个矩阵到第j个矩阵的乘积。因此,每个子问题都与O(n)个其他子问题相连,这意味着图中边的数量是O(n^3)。每条边都从表示较小子问题的顶点指向表示较大子问题的顶点。

但是,请注意,上述分析中的边数可能过于悲观,因为在实际的动态规划解决方案中,我们通常不会为每个可能的k都创建一个边。相反,我们只会在需要时计算子问题的解,并将这些解存储在表中以便后续使用。这种方法实际上减少了边的数量,因为不是所有可能的子问题组合都会在实际计算中使用。然而,即使在这种情况下,边的数量仍然是O(n^3)级别,因为每个子问题都可能依赖于O(n)个其他子问题的解。

总的来说,如果我们使用传统的动态规划方法来解决矩阵链乘法问题,并且子问题定义为计算从第i个矩阵到第j个矩阵的乘积的最优成本(其中i < j),那么:

顶点的数量是O(n^2),具体来说是n(n-1)/2个。

边的数量是O(n^3),但实际上可能会少于这个数,因为我们通常只会计算必要的子问题。

每条边都从表示较小子问题的顶点指向表示较大子问题的顶点。具体来说,对于每个子问题[i, j],我们都有边从子问题[i, k]和[k+1, j]指向它,其中i <= k < j。然而,请注意这里有一些重复和不必要的边,因为不是所有这样的组合都会在实际算法中使用。在实际的动态规划解决方案中,我们通常只会为实际计算的子问题组合创建边。

讯飞星火:

在矩阵链乘法问题中,子问题图的顶点数量是 n+1,其中 n 是矩阵链的长度。这是因为我们需要为每个矩阵和每个分割点创建一个顶点。

边的数量是 2n,因为对于每个矩阵对(i,j),我们都需要创建两条边,一条从 i 到 j,另一条从 j 到 i。

这些边连接的顶点如下:

  • 对于第一个矩阵(索引为0),它只连接到下一个矩阵(索引为1)。
  • 对于最后一个矩阵(索引为n-1),它只连接到前一个矩阵(索引为n-2)。
  • 对于其他矩阵(索引为1到n-2),它们都连接到前后两个矩阵。

以下是用Go语言描述子问题图的代码:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. n := 5 // 假设矩阵链长度为5
  7. vertices := make([]string, n+1)
  8. edges := make(map[string]string)
  9. // 创建顶点
  10. for i := 0; i <= n; i++ {
  11. vertices[i] = fmt.Sprintf("M%d", i)
  12. }
  13. // 创建边
  14. for i := 0; i < n-1; i++ {
  15. edges[vertices[i]] = vertices[i+1]
  16. edges[vertices[i+1]] = vertices[i]
  17. }
  18. // 输出顶点和边
  19. fmt.Println("顶点:")
  20. for _, v := range vertices {
  21. fmt.Println(v)
  22. }
  23. fmt.Println("边:")
  24. for k, v := range edges {
  25. fmt.Printf("%s -> %s
  26. ", k, v)
  27. }
  28. }

运行此代码将输出以下结果:

  1. 顶点:
  2. M0
  3. M1
  4. M2
  5. M3
  6. M4
  7. M5
  8. 边:
  9. M0 -> M1
  10. M1 -> M0
  11. M1 -> M2
  12. M2 -> M1
  13. M2 -> M3
  14. M3 -> M2
  15. M3 -> M4
  16. M4 -> M3
  17. M4 -> M5
  18. M5 -> M4

360智脑:

矩阵链乘法问题是求解一系列矩阵相乘的最优算法。在这个问题中,我们将输入矩阵链表示为一个图,其中顶点表示矩阵,边表示矩阵之间的乘法操作。

假设我们有一个链式矩阵 A1, A2, A3, ..., An,其中矩阵 Ai 的行数为 ri,列数为 ci。我们可以将这个问题表示为一个图,其中顶点的数量为 n+1,边的数量为 n。

图的顶点包括:

  1. 一个起始顶点 s,表示矩阵乘法的开始。
  2. n 个矩阵顶点 A1, A2, A3, ..., An,分别表示输入的矩阵。
  3. 一个结束顶点 t,表示矩阵乘法的结束。

图的边包括:

  1. s 到 A1 的边,表示矩阵乘法的开始。
  2. Ai 到 Aj 的边(i < j),表示矩阵 Ai 和 Aj 之间的乘法操作。
  3. An 到 t 的边,表示矩阵乘法的结束。

所以,子问题图包含 n+1 个顶点和 n 条边。这些边分别连接起始顶点 s、矩阵顶点 A1、A2、A3、...、An 和结束顶点 t。

智谱清言:

矩阵链乘法问题是一种经典的动态规划问题,其中我们要找到一组矩阵,使得它们相乘的总体运算次数最小。这个问题可以通过将大问题分解为小问题(子问题)来解决,这正是动态规划的核心思想。

在Go语言中,我们可以定义一个子问题图来表示这个问题。首先,我们需要理解子问题是什么。对于矩阵链乘法问题,子问题是在原问题中的一个子序列的乘法运算。例如,如果我们有一个长度为n的矩阵链,那么它的子问题可以是长度为1到n-1的任何子序列。

子问题图的顶点将代表所有可能的子问题,而边将代表子问题之间的转换。具体来说,如果我们要解决一个长度为n的矩阵链,那么顶点的数量将是O(n^2),因为每个子问题可能涉及到的矩阵数量是n。每条边将连接两个顶点,表示可以从子问题A转换到子问题B。

为了精确地描述这个子问题图,我们需要定义子问题的形式,例如,以递归的方式定义子问题:

  • 子问题(i, j)代表从矩阵链的第i个矩阵到第j个矩阵的子链的乘法运算。

那么,子问题图的顶点数量将是O(n2),因为我们需要考虑每一对可能的i和j。边的数量将是O(n3),因为对于每个子问题(i, j),我们可能需要考虑所有小于j的i',来形成新的子问题(i, j')。

在Go语言中,我们可以使用一个二维数组来表示这个子问题图,其中每个元素代表从子问题(i, j)到子问题(i', j')的转换。

这里是一个简化的Go语言代码框架,用于描述子问题图的开始部分:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. // 矩阵结构
  6. type Matrix struct {
  7. rows, cols int
  8. }
  9. // 矩阵链
  10. type MatrixChain struct {
  11. matrices []*Matrix
  12. }
  13. // 子问题定义
  14. type SubProblem struct {
  15. i, j int // 子问题的起始和结束矩阵位置
  16. cost int // 子问题的最小乘法次数
  17. prev *SubProblem
  18. }
  19. // 构建子问题图
  20. func buildSubProblemGraph(chain *MatrixChain, n int) []*SubProblem {
  21. // 初始化子问题数组
  22. var subProblems []*SubProblem
  23. for i := 0; i < n; i++ {
  24. for j := i + 1; j < n; j++ {
  25. // 创建新的子问题
  26. subProblem := &SubProblem{i: i, j: j, cost: chain.computeCost(i, j)}
  27. // 这里应该有代码来优化成本和链接前一个子问题
  28. // ...
  29. subProblems = append(subProblems, subProblem)
  30. }
  31. }
  32. return subProblems
  33. }
  34. // 计算子问题的成本
  35. func (chain *MatrixChain) computeCost(i, j int) int {
  36. // 计算从i到j的子链的乘法成本
  37. // ...
  38. return 0
  39. }
  40. // main函数
  41. func main() {
  42. // 示例矩阵链
  43. matrices := []*Matrix{
  44. {rows: 3, cols: 3},
  45. {rows: 3, cols: 3},
  46. {rows: 3, cols: 3},
  47. }
  48. chain := &MatrixChain{matrices: matrices}
  49. // 构建子问题图
  50. n := len(matrices)
  51. subProblems := buildSubProblemGraph(chain, n)
  52. // 输出子问题图的顶点和边(示例)
  53. fmt.Printf("SubProblem Graph vertices: %d\n", len(subProblems))
  54. for _, sp := range subProblems {
  55. fmt.Printf("Cost from (%d, %d) to (%d, %d): %d\n", sp.i, sp.j, sp.prev.i, sp.prev.j, sp.cost)
  56. }
  57. }

这段代码定义了子问题的基本结构,并初始化了子问题图的顶点。在实际应用中,我们需要计算每个子问题的成本,并且将这些

通义千问:

在矩阵链乘法问题中,给定一个矩阵链,即一系列需要相乘的矩阵 (A_1, A_2, \ldots, A_n),其中矩阵 (A_i) 的维度为 (p_{i-1} \times p_i)。构建的子问题图通常称为矩阵链乘法的括号化树(Parenthesis Tree/Polyadic Tree)

对于输入链长度为 n 的矩阵链乘法问题,其对应的子问题图包含以下特点:

  1. 顶点数量

    • 子问题图共有 (n-1) 个顶点,因为每一个内部节点(除首尾两个矩阵外)代表了两个连续矩阵之间的可能的合并操作(即加一对括号确定乘法顺序),因此共有 (n-1) 种不同的合并方式。
  2. 边的数量

    • 子问题图中的边是由顶点间的父子关系决定的,每个顶点都有两个孩子节点(除了叶子节点,即最底层的节点),所以如果忽略叶子节点,每层的边数是上一层顶点数的两倍。
    • 因此,如果按照完全二叉树来考虑,边的数量大致是顶点数量的两倍减去 1,即 (2(n-1) - 1),但由于最后一层可能是不满的,实际边的数量会少一些,确切的数量取决于 (n) 的具体值以及是否包括虚拟的叶子节点(若不计算实际运算而只为结构完整性的话)。
  3. 边的连接

    • 在这个图中,每条边连接的是一个子问题与其对应的更小的子问题。
    • 顶点 (i) 表示矩阵 (A_i) 到矩阵 (A_{i+1}) 这一段子链的最优括号化方案,它会有两条边分别向下指向两个子顶点 (j) 和 (k),表示将子链划分为 (A_i A_{i+1} \ldots A_j) 和 (A_{j+1} A_{j+2} \ldots A_{k+1}) 两部分,这两部分分别对应着子问题 (i) 到 (j) 以及 (j+1) 到 (k+1) 的最优括号化方案。

例如,对于矩阵链 (A_1, A_2, A_3, A_4),子问题图将有 3 个顶点(1-2,2-3,3-4 对应的括号决策点),并且根据子问题分解的递归性质,边会连接如下的顶点对:

  • 顶点 1-2 连接到顶点 2-3 和顶点 1(这里的顶点 1 是虚拟根节点,为了表示整个矩阵链)
  • 顶点 2-3 连接到顶点 3-4
  • 顶点 3-4 连接到叶子节点,这里没有进一步的子问题,但也可以视情况添加虚拟叶子节点。

总结来说,子问题图是一个高度为 (n-2) 的完全二叉树(理想情况下),顶点数为 (n-1),边数略小于 (2(n-1)),每个顶点代表一个子问题,并与它的两个子问题相连。

天工:

矩阵链乘法的动态规划解可以通过构建一棵子问题树来直观表示。这棵树的每一个节点代表一个子问题,其状态可以表示为 (i, j, k) 其中 i 是子问题的开始行,j 是结束行,k 是执行这个子问题所需的计算次数(即链的长度)。

对于一个给定的链长度 n 的矩阵链乘法问题,子问题树如下:

  1. 根节点代表整个问题,可以表示为 (1, m, n),其中 m 是所有矩阵的列数。
  2. 从根节点开始,每一层都会产生 n-1 个新节点,每个新节点的链长比上一层的节点少 1。
  3. 每个节点都有两个前驱节点,分别对应于该节点的左半部和右半部。
  4. 每个子问题节点都对应于一个顶点,因此顶点的总数等于从 (1, m, n) 到所有可能的 (i, j, k) 的数量。

顶点的数量可以用以下方法计算:对于每个 i 从 1 到 m-1,对于每个 j 从 i+1 到 m,对于每个 k 从 j-i+1 到 n,都有一个唯一的顶点。所以顶点的总数是:

[ \sum_{i=1}^{m-1} \sum_{j=i+1}^{m} \sum_{k=j-i+1}^{n} 1 = \sum_{i=1}^{m-1} \sum_{j=i+1}^{m} (j-i) = \sum_{i=1}^{m-1} (m-i) ]

这个求和可以简化为:

[ \sum_{i=1}^{m-1} m - \sum_{i=1}^{m-1} i = m(m-1) - \frac{(m-1)(m-2)}{2} ]

[ = \frac{m(m-1)}{2} - \frac{(m-1)(m-2)}{2} ]

[ = \frac{(m-1)(m-0)}{2} ]

[ = \frac{(m-1)^2}{2} ]

边的数量等于顶点的数量减去 1(因为树的根节点没有父节点),所以边的总数也是:

[ \frac{(m-1)^2}{2} - 1 ]

每条边连接的两个顶点分别是当前子问题的左半部和右半部。例如,顶点 (i, j, k) 与顶点 (i+1, j, k-1) 和顶点 (i, j-1, k-1) 相连。这是因为子问题 (i, j, k) 需要其左上方的子问题 (i+1, j, k-1) 和右上方的子问题 (i, j-1, k-1) 的结果来计算自己的结果。

总结一下,对于矩阵链乘法问题,子问题图包含的顶点数和边数分别为:

  • 顶点数:(\frac{(m-1)^2}{2})
  • 边数:(\frac{(m-1)^2}{2} - 1)

其中 m 是参与链乘的所有矩阵的列数。

灵小智:

  1. 对于输入链长度为n的矩阵链乘法问题,子问题图是一个有向无环图(Directed Acyclic Graph, DAG)。该图包含n个顶点和n-1条边。每个顶点表示矩阵链的一个子链,第i个顶点表示从第i个矩阵到第i+1个矩阵(1 i < n)。边连接顶点表示计算子链之间的矩阵乘法。

具体来说,顶点集合V = {v1, v2, ..., vn},其中每个顶点vi表示矩阵链的子链Ai到Ai+1。边集合E = {(v1, v2), (v2, v3), ..., (vn-1, vn)},表示子链与其相邻子链之间的矩阵乘法操作。

例如,当n=4时,子问题图如下所示:

  1. v1 ---> v2 ---> v3 ---> v4

其中,边(v1, v2)表示计算A1A2,边(v2, v3)表示计算(A1A2)A3,边(v3, v4)表示计算((A1A2)A3)A4。

总结起来,子问题图有n个顶点和n-1条边,边连接的顶点表示相邻子链之间的矩阵乘法操作。

chatgpt:

对输入链长度为 n 的矩阵链乘法问题,子问题图的顶点数和边数可以描述如下:

顶点数:在矩阵链乘法问题中,我们需要考虑的是所有可能的括号化方式。因此,子问题图中的顶点数为 (n+1) * (n+1),其中每个顶点表示一个子问题,它包含了两个矩阵相乘的区间。

边数:对于每个子问题,我们需要考虑不同的划分位置,以确定两个相乘矩阵的乘积。因此,在子问题图中,每个顶点最多有 n 条出边和入边。

连接关系:具体来说,子问题图中的边连接着相邻的顶点。每条边连接一个父节点和一个子节点,并表示将父节点划分成两部分进行乘积运算得到子节点。

总结起来:

  • 子问题图包含 (n+1) * (n+1) 个顶点。
  • 每个顶点最多有 n 条出边和入边。
  • 边连接着相邻的顶点,并表示划分父节点得到子节点。

这样构建出来的子问题图可以用于动态规划算法求解矩阵链乘法问题。

kimi:

在矩阵链乘法问题中,子问题图是一个完全二分图(Complete Bipartite Graph),它由两组顶点组成,每组顶点代表矩阵链的一个划分方案。对于长度为 n 的矩阵链,我们可以将矩阵链划分为两个子链,一组顶点代表左半部分的矩阵链,另一组顶点代表右半部分的矩阵链。每条边代表两个子链的连接方式,即在哪个矩阵之间插入乘法操作。

子问题图的顶点和边:

顶点数量:

左半部分的矩阵链有 n/2 个顶点(如果 n 是奇数,左半部分比右半部分多一个矩阵)。

右半部分的矩阵链也有 n/2 个顶点。

总共有 n 个顶点。

边数量:

对于每个可能的划分点 k(从 1 到 n-1),都会有一条边连接左半部分的第 k 个顶点和右半部分的第 k+1 个顶点。

因此,边的数量也是 n-1。

边的连接方式:

边连接左半部分的顶点 i(1 ≤ i ≤ n/2)和右半部分的顶点 j(n/2+1 ≤ j ≤ n),其中 i 和 j 分别代表左半部分和右半部分的矩阵链的结束位置。

对于每个 k(1 ≤ k ≤ n-1),存在一条边连接左半部分的顶点 k 和右半部分的顶点 k+1。

在 Go 语言中,我们可以使用以下方式来表示这个子问题图:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. n := 5 // 输入链的长度
  7. verticesLeft := make([]int, n/2+1) // 左半部分的顶点
  8. verticesRight := make([]int, n/2+1) // 右半部分的顶点
  9. // 初始化顶点
  10. for i := 1; i <= n/2+1; i++ {
  11. verticesLeft[i-1] = i
  12. verticesRight[i-1] = i + n/2
  13. }
  14. // 打印顶点
  15. fmt.Println("Vertices (left):", verticesLeft)
  16. fmt.Println("Vertices (right):", verticesRight)
  17. // 边的连接方式
  18. edges := make([][]int, n-1)
  19. for k := 1; k <= n-1; k++ {
  20. edges[k-1] = []int{k, k+1}
  21. }
  22. // 打印边
  23. fmt.Println("Edges:", edges)
  24. }

在这个示例中,我们创建了两个切片 verticesLeft 和 verticesRight 来表示左半部分和右半部分的顶点。然后,我们创建了一个 edges 切片来表示连接这些顶点的边。这个程序将打印出顶点和边的信息。

混元:

在用 Go 语言解决矩阵链乘法问题时,我们可以使用动态规划来解决。首先,我们需要描述子问题图,它包含多少个顶点、多少条边以及这些边分别连接哪些顶点。

对于输入链长度为 n 的矩阵链乘法问题,我们可以将其表示为一个长度为 n 的数组 p,其中 p[i] 表示第 i 个矩阵的行数(或列数,因为矩阵乘法是可交换的)。我们的目标是找到一种分割方法,使得乘积的标量乘法次数最少。

子问题图包含以下顶点和边:

  1. 顶点:子问题图的顶点表示矩阵链的子序列。对于长度为 n 的矩阵链,我们有 O(n^2) 个子序列。每个顶点表示一个子问题,即计算一个子序列的最小乘积。

  2. 边:子问题图的边表示子问题之间的依赖关系。对于每个顶点 (i, j),我们需要计算从 i 到 j 的最小乘积。为了计算这个值,我们需要遍历所有可能的分割点 k,计算从 i 到 k 和从 k+1 到 j 的最小乘积,然后将它们相乘。这样,我们就得到了一个边 (i, k) 和一个边 (k+1, j)。因此,子问题图有 O(n^3) 条边。

以下是一个简化的 Go 代码实现,用于计算矩阵链乘法问题的最小乘积:

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. func matrixChainOrder(p []int) int {
  7. n := len(p) - 1
  8. m := make([][]int, n)
  9. for i := 0; i < n; i++ {
  10. m[i] = make([]int, n)
  11. }
  12. for l := 2; l <= n; l++ {
  13. for i := 0; i <= n-l; i++ {
  14. j := i + l - 1
  15. m[i][j] = math.MaxInt32
  16. for k := i; k <= j-1; k++ {
  17. q := m[i][k] + m[k+1][j] + p[i]*p[k+1]*p[j+1]
  18. if q < m[i][j] {
  19. m[i][j] = q
  20. }
  21. }
  22. }
  23. }
  24. return m[0][n-1]
  25. }
  26. func main() {
  27. p := []int{30, 35, 15, 5, 10, 20, 25}
  28. fmt.Println(matrixChainOrder(p))
  29. }

这个代码实现了一个动态规划算法,用于计算矩阵链乘法问题的最小乘积。它首先初始化一个二维数组 m,用于存储子问题的最小乘积。然后,它遍历所有可能的子序列长度 l,并计算从 i 到 j 的最小乘积。最后,它返回整个矩阵链的最小乘积。

文心一言 VS 讯飞星火 VS chatgpt (200)-- 算法导论15.2 4题的更多相关文章

  1. 【对比】文心一言对飚ChatGPT实操对比体验

    前言 缘由 百度[文心一言]体验申请通过 本狗中午干饭时,天降短信,告知可以体验文心一言,苦等一个月的实操终于到来.心中这好奇的对比心理油然而生,到底是老美的[ChatGPT]厉害,还是咱度娘的[文心 ...

  2. 【个人首测】百度文心一言 VS ChatGPT GPT-4

    昨天我写了一篇文章GPT-4牛是牛,但这几天先别急,文中我测试了用GPT-4回答ChatGPT 3.5 和 Notion AI的问题,大家期待的图片输入也没有出现. 昨天下午百度发布了文心一言,对标C ...

  3. 文心一言,通营销之学,成一家之言,百度人工智能AI大数据模型文心一言Python3.10接入

    "文心"取自<文心雕龙>一书的开篇,作者刘勰在书中引述了一个古代典故:春秋时期,鲁国有一位名叫孔文子的大夫,他在学问上非常有造诣,但是他的儿子却不学无术,孔文子非常痛心 ...

  4. 获取了文心一言的内测及与其ChatGPT、GPT-4 对比结果

    百度在3月16日召开了关于文心一言(知识增强大语言模型)的发布会,但是会上并没现场展示demo.如果要测试的文心一言 也要获取邀请码,才能进行测试的. 我这边通过预约得到了邀请码,大概是在3月17日晚 ...

  5. 百度生成式AI产品文心一言邀你体验AI创作新奇迹:百度CEO李彦宏详细透露三大产业将会带来机遇(文末附文心一言个人用户体验测试邀请码获取方法,亲测有效)

    目录 中国版ChatGPT上线发布 强大中文理解能力 智能文学创作.商业文案创作 图片.视频智能生成 中国生成式AI三大产业机会 新型云计算公司 行业模型精调公司 应用服务提供商 总结 获取文心一言邀 ...

  6. 阿里版ChatGPT:通义千问pk文心一言

    随着 ChatGPT 热潮卷起来,百度发布了文心一言.Google 发布了 Bard,「阿里云」官方终于也宣布了,旗下的 AI 大模型"通义千问"正式开启测试! 申请地址:http ...

  7. 基于讯飞语音API应用开发之——离线词典构建

    最近实习在做一个跟语音相关的项目,就在度娘上搜索了很多关于语音的API,顺藤摸瓜找到了科大讯飞,虽然度娘自家也有语音识别.语义理解这块,但感觉应该不是很好用,毕竟之前用过百度地图的API,有问题也找不 ...

  8. android用讯飞实现TTS语音合成 实现中文版

    Android系统从1.6版本开始就支持TTS(Text-To-Speech),即语音合成.但是android系统默认的TTS引擎:Pic TTS不支持中文.所以我们得安装自己的TTS引擎和语音包. ...

  9. android讯飞语音开发常遇到的问题

    场景:android项目中共使用了3个语音组件:在线语音听写.离线语音合成.离线语音识别 11208:遇到这个错误,授权应用失败,先检查装机量(3台测试权限),以及appid的申请时间(35天期限), ...

  10. 初探机器学习之使用讯飞TTS服务实现在线语音合成

    最近在调研使用各个云平台提供的AI服务,有个语音合成的需求因此就使用了一下科大讯飞的TTS服务,也用.NET Core写了一个小示例,下面就是这个小示例及其相关背景知识的介绍. 一.什么是语音合成(T ...

随机推荐

  1. [转帖]TiDB系统调参实战经验

    https://tidb.net/blog/c9466c40#TiDB%E7%B3%BB%E7%BB%9F%E8%B0%83%E5%8F%82%E5%AE%9E%E6%88%98%E7%BB%8F%E ...

  2. [转帖]TiFlash 源码阅读(一) TiFlash 存储层概览

    https://cloud.tencent.com/developer/article/1988629 背景 本系列会聚焦在 TiFlash 自身,读者需要有一些对 TiDB 基本的知识.可以通过这三 ...

  3. [转帖]Linux下在文件内部指定行(首行、末尾行等)插入内容

    https://blog.csdn.net/drbing/article/details/52153766 1.在文件的首行插入指定内容: :~$ sed -i "1i#! /bin/sh ...

  4. [转帖]Docker:Python环境Docker镜像瘦身

    https://www.jianshu.com/p/c0ad13e0be85 关键字:Docker,Python 原始镜像 封装一个Python 3.7的环境并且安装Python依赖包实现一个机器学习 ...

  5. [转帖]如何优雅的使用 Systemd 管理服务

    https://zhuanlan.zhihu.com/p/271071439 背景:我们在构建 Kubernetes 容器化平台时,会在节点上部署各种 agent ,虽然容器化当道的今天很多程序可以直 ...

  6. [转帖]【JVM】Java内存区域与OOM

    引入 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. Java虚拟机运行时数据区 如图所示 1.程序计数器(线程私有 ...

  7. 小程序字节转GBK及UTF8

    前段时间在Android原生搞的BLE扫码枪又要移植到小程序上来.本以为小程序不支持BLE的,结果一搜,还真支持-_-|| . 蓝牙部分问题不大,遇到的主要问题是,小程序环境如何对字符编码进行判断以及 ...

  8. css 动画 div顺时针方向移动,

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 【JS 逆向百例】有道翻译接口参数逆向

    逆向目标 目标:有道翻译接口参数 主页:https://fanyi.youdao.com/ 接口:https://fanyi.youdao.com/translate_o?smartresult=di ...

  10. 安装Visual Studio的详细流程

      本文介绍Visual Studio 2022软件Community(社区版)的下载.安装.运行与使用方法.   首先需要提一句,本文介绍的是Visual Studio 2022软件的下载:而其它版 ...