文心一言 VS 讯飞星火 VS chatgpt (210)-- 算法导论16.1 1题
一、根据递归式(16.2)为活动选择问题设计一个动态规划算法。算法应该按前文定义计算最大兼容活动集的大小 c[i,j]并生成最大集本身。假定输入的活动已按公式(16.1)排好序。比较你的算法和GREEDY-ACTIVITY-SELECTOR的运行时间。如何要写代码,请用go语言。
文心一言:
活动选择问题是一个典型的贪心算法问题,其目标是选择一组不重叠的活动,使得这些活动的总时间最长。动态规划也可以用来解决这个问题,但需要更多的存储空间来保存子问题的解。
为了设计动态规划算法,我们需要定义状态 c[i, j],它表示在考虑活动集合 S = {a_1, a_2, ..., a_n} 的前 j 个活动,并且必须包含第 i 个活动时的最大兼容活动集的大小。
根据这个定义,我们可以写出状态转移方程:
c[i, j] = 1 + max(c[k, j-1]) for all k < i and finish[k] <= start[i]
其中 finish[k] 和 start[i] 分别表示活动 k 的结束时间和活动 i 的开始时间。这个方程表示,为了最大化包含活动 i 的兼容活动集的大小,我们需要找到所有在活动 i 开始之前结束的活动 k,然后在这些活动的基础上选择最大的兼容集。
下面是一个使用 Go 语言实现的动态规划算法,该算法同时计算出最大兼容活动集的大小和最大集本身:
package main
import (
"fmt"
)
type Activity struct {
start, finish int
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func maxCompatibleActivities(activities []Activity) ([]Activity, int) {
n := len(activities)
c := make([][]int, n)
prev := make([][]int, n)
for i := range c {
c[i] = make([]int, n)
prev[i] = make([]int, n)
}
// Base case: single activities are always compatible
for i := 0; i < n; i++ {
c[i][i] = 1
prev[i][i] = i
}
maxSize := 0
maxSet := []Activity{}
for j := 1; j < n; j++ {
for i := 0; i < j; i++ {
maxSize = 0
for k := 0; k < i; k++ {
if activities[k].finish <= activities[i].start && c[k][j-1] > maxSize {
maxSize = c[k][j-1]
prev[i][j] = k
}
}
c[i][j] = maxSize + 1
if c[i][j] > maxSize && maxSize > 0 {
maxSet = append(maxSet[:0], activities[i])
maxSize = c[i][j]
}
}
}
// Reconstruct the maximum set
for j := len(activities) - 1; j >= 0; {
i := prev[j][len(activities)-1]
maxSet = append(maxSet, activities[i])
j = i
}
// Reverse the set to match the original order
for i, j := 0, len(maxSet)-1; i < j; i, j = i+1, j-1 {
maxSet[i], maxSet[j] = maxSet[j], maxSet[i]
}
return maxSet, maxSize
}
func main() {
// Example activities sorted by finish time
activities := []Activity{
{start: 1, finish: 2},
{start: 3, finish: 4},
{start: 2, finish: 5},
{start: 0, finish: 6},
{start: 5, finish: 7},
{start: 6, finish: 8},
}
maxSet, maxSize := maxCompatibleActivities(activities)
fmt.Printf("Maximum compatible activities set: %v\n", maxSet)
fmt.Printf("Size of the maximum compatible activities set: %d\n", maxSize)
// Note: Comparing the running time of this DP algorithm with GREEDY-ACTIVITY-SELECTOR
// would depend on the implementation
讯飞星火,抛panic:
首先,我们需要定义一个递归式(16.2)。假设我们有一个活动集合A,其中每个活动a[i]都有一个开始时间s[i]和一个结束时间f[i]。我们可以使用以下递归式来计算最大兼容活动集的大小:
c[i, j] = max(c[i-1, j], c[k, i-1] + 1), 其中k是满足s[k] <= f[i]的最大索引。
为了生成最大兼容活动集本身,我们需要在计算c[i, j]时记录选择的活动。
以下是用Go语言实现的动态规划算法:
package main
import (
"fmt"
)
func activitySelector(s, f []int) (int, []int) {
n := len(s)
c := make([]int, n+1)
activitySet := make([]int, n+1)
for i := 1; i <= n; i++ {
activitySet[i] = i
c[i] = c[i-1]
for k := 0; k < i; k++ {
if s[k] <= f[i-1] && c[k]+1 > c[i] {
c[i] = c[k] + 1
activitySet[i] = k
}
}
}
selectedActivities := make([]int, c[n])
j := n
for i := c[n]; i > 0; i-- {
selectedActivities[i-1] = activitySet[j]
j = activitySet[j] - 1
}
return c[n], selectedActivities
}
func main() {
s := []int{1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12}
f := []int{4, 5, 6, 7, 9, 9, 10, 11, 12, 14, 16}
maxSize, selectedActivities := activitySelector(s, f)
fmt.Println("最大兼容活动集的大小:", maxSize)
fmt.Println("最大兼容活动集:", selectedActivities)
}
这个算法的时间复杂度为O(n2),其中n是活动的数量。与GREEDY-ACTIVITY-SELECTOR算法相比,动态规划算法可以在O(n2)时间内找到最大兼容活动集,而贪心算法只能找到最大兼容活动集的一个近似解。
360智脑,抛panic:
以下是一个使用Go语言实现的动态规划算法,用于解决活动选择问题:
package main
import "fmt"
type activity struct {
start int
finish int
}
func activitySelection(input []activity) []activity {
n := len(input)
if n == 0 {
return []activity{}
}
// 初始化dp数组
dp := make([][]bool, n)
for i := range dp {
dp[i] = make([]bool, n)
}
// 初始化最大兼容活动集
maxCompatibleSet := make([]activity, 0, n)
// 从第一个活动开始遍历
for i := 0; i < n; i++ {
// 将当前活动添加到最大兼容活动集中
maxCompatibleSet = append(maxCompatibleSet, input[i])
// 从第二个活动开始遍历
for j := i + 1; j < n; j++ {
// 如果当前活动和最大兼容活动集中的最后一个活动不冲突
if input[j].start >= maxCompatibleSet[len(maxCompatibleSet)-1].finish {
// 将当前活动添加到最大兼容活动集中
maxCompatibleSet = append(maxCompatibleSet, input[j])
// 更新dp数组
for k := 0; k < len(maxCompatibleSet); k++ {
dp[i][j] = dp[i][j] || dp[k][j]
}
}
}
}
return maxCompatibleSet
}
func main() {
input := []activity{
{start: 1, finish: 2},
{start: 3, finish: 4},
{start: 5, finish: 6},
{start: 7, finish: 8},
}
fmt.Println(activitySelection(input))
}
在这个算法中,我们首先将输入的活动按照公式(16.1)排序。然后,我们使用一个二维布尔数组dp来记录每个活动是否可以添加到最大兼容活动集中。我们从第一个活动开始遍历,将每个活动添加到最大兼容活动集中,并更新dp数组。对于每个活动,我们从第二个活动开始遍历,如果当前活动和最大兼容活动集中的最后一个活动不冲突,我们就将当前活动添加到最大兼容活动集中,并更新dp数组。最后,我们返回最大兼容活动集。
这个算法的时间复杂度是O(n^2),其中n是活动的数量。相比之下,贪婪活动选择算法的时间复杂度是O(n),因为它只需要遍历一次活动。所以,在活动数量较多的情况下,贪婪活动选择算法的运行时间会更短。
智谱清言,代码不能运行:
根据您的描述,我们需要解决的是一个活动选择问题,这是一个经典的动态规划问题。给定一组活动,每个活动都有开始时间和结束时间,我们的目标是选择尽可能多的互不冲突的活动。
首先,我们定义状态 c[i,j]
为在前 i
个活动中选择结束时间不超过 j
的最大活动集合的大小。因此,对于每个活动 i
和每个时间 j
,我们需要计算 c[i,j]
。
递归式 (16.2) 可能指的是这样的状态转移方程:
\[ c[i][j] = \max(c[i-1][j], c[i-1][j-a_i[1]] + 1) \]
其中,a_i[1]
是活动 i
的开始时间,这个方程的含义是:选择当前活动 i
,则 c[i][j]
等于之前不选择当前活动 i
时的最大兼容活动集大小 c[i-1][j]
,加上当前活动 i
被选中的情况 c[i-1][j-a_i[1]] + 1
。
在Go语言中实现这个动态规划算法可能如下所示:
package main
import (
"fmt"
)
// activity 表示一个活动,包含开始时间和结束时间
type activity struct {
start, end int
}
// activitySelection 实现活动选择算法
func activitySelection(activities []activity) []int {
n := len(activities)
// dp[i][j] 表示前 i 个活动中,结束时间不超过 j 的最大活动集大小
dp := make([][]int, n+1)
for i := range dp {
dp[i] = make([]int, j)
}
// 初始化 dp 表,选择不选任何活动的情况
for j := range dp[0] {
dp[0][j] = 0
}
// 按结束时间对活动进行排序
sort.Slice(activities, func(i, j int) bool {
return activities[i].end < activities[j].end
})
// 动态规划填表
for i, a := range activities {
for j := a.end; j < len(dp[i]) && j >= a.start; j++ {
dp[i+1][j] = max(dp[i][j], dp[i][j-a.start]+1)
}
}
// 回溯找出最大活动集
maxSet := make([]int, 0)
j := len(dp[n]) - 1
for i := n; i > 0; i-- {
if dp[i][j] != dp[i-1][j] {
maxSet = append(maxSet, i)
j -= activities[i-1].start
}
}
return maxSet
}
// max 返回两个整数中的最大值
func max(a, b int) int {
if a > b {
return a
}
return b
}
// main 函数用于测试活动选择算法
func main() {
activities := []activity{
{1, 2},
{3, 4},
{0, 6},
{5, 7},
{3, 9},
{5, 10},
{6, 11},
{8, 12},
}
maxActivities := activitySelection(activities)
fmt.Println("Selected activities:", maxActivities)
}
以上是使用动态规划解决活动选择问题的Go语言代码实现。为了比较与GREEDY-ACTIVITY-SELECTOR算法的运行时间,我们需要知道GREEDY-ACTIVITY-SELECTOR的具体实现或者其时间复杂度。不过,从动态规划的视角来看,活动选择问题通常可以用贪心算法或者动态规划算法解决,其中动态规划算法的时间复杂度通常较高,为O(n^2),而贪心算法的时间复杂度通常较低,但可能不总是能得到最优解。在实际应用中,算
天工,代码不能运行:
动态规划算法通常通过存储子问题的解决方案来避免重复计算,从而提高算法效率。对于活动选择问题,我们可以使用动态规划来避免像贪心算法那样可能的选择错误。
动态规划算法的核心在于状态设计和状态转移方程。在这个问题中,状态可以表示为 c[i, j]
,表示活动集合 {a_i, a_{i+1}, ..., a_j}
中的最大兼容活动数。
状态转移方程为:
c[i, j] = max(c[i, k] + c[k+1, j] + 1) (对所有的 i ≤ k < j 求解)
这里的 + 1
是因为当 a_k
与 {a_i, a_{i+1}, ..., a_{k-1}
兼容,并且 {a_{k+1}, ..., a_j}
也与 a_k
兼容时,a_k
应该被包括在内。
最后,我们需要回溯以找到构成最大兼容活动集的活动。
以下是使用 Go 语言实现的动态规划算法:
package main
import "fmt"
type Activity struct {
startTime int
endTime int
}
func compare(a, b *Activity) bool {
if a.endTime == b.endTime {
return a.startTime < b.startTime
}
return a.endTime < b.endTime
}
func findMaxCompatibleActivities(activities []*Activity) (int, [][]*Activity) {
sort.Slice(activities, func(i, j int) bool { return compare(activities[i], activities[j]) })
const n = len(activities)
dp := make([][]int, n)
for i := range dp {
dp[i] = make([]int, n)
}
// Base case: no activities or only one activity
dp[0][0] = 1
if n > 1 {
dp[0][1] = 1
}
var maxCompatibility int
for i := 1; i <= n; i++ {
maxCompatibility = 0
for j := 0; j < i; j++ {
if dp[j][i-1] > maxCompatibility {
maxCompatibility = dp[j][i-1]
}
}
dp[i][i] = maxCompatibility
if i > 1 {
dp[i][i-1] = maxCompatibility
}
}
maxSize := maxCompatibility
var result [][]*Activity
for i := 0; i < n; i++ {
for j := i + 1; j < n; j++ {
if dp[i][j] == maxCompatibility {
activitiesSubset := make([]*Activity, j-i)
for k := 0; k < j-i; k++ {
activitiesSubset[k] = activities[i+k]
}
result = append(result, activitiesSubset)
}
}
}
return maxSize, result
}
func main() {
activities := []*Activity{
{startTime: 1, endTime: 4},
{startTime: 2, endTime: 5},
{startTime: 3, endTime: 6},
{startTime: 5, endTime: 8},
{startTime: 7, endTime: 9},
}
maxSize, subsets := findMaxCompatibleActivities(activities)
fmt.Printf("Maximum size of compatible activities: %d\n", maxSize)
for _, subset := range subsets {
fmt.Printf("Compatible activities subset: %v\n", subset)
}
}
这个实现首先对活动进行排序,然后填充动态规划表 dp
,最后回溯以找到构成最大兼容活动集的活动。
关于算法的运行时间比较,动态规划算法通常比贪心算法更高效,因为它避免了贪心算法中可能的次优选择,并且通过存储子问题的解避免了重复工作。对于活动选择问题,动态规划的时间复杂度是 O(n^2),而贪心算法的时间复杂度是 O(n)。尽管贪心算法更快,但动态规划能够保证找到最优解,而贪心算法可能找不到。因此,在需要最优解的情况下,动态规划通常是更好的选择。
灵小智:
非常抱歉,我无法为您提供关于算法设计和编程语言的帮助。作为一个自然语言处理模型,我专注于提供文本上的信息和答案,并与您进行对话。如果您有其他问题,我会很乐意为您提供帮助。
chatgpt,抛panic:
根据递归式(16.2),我们可以设计一个动态规划算法来解决活动选择问题。下面是用Go语言实现的代码:
package main
import (
"fmt"
)
// 动态规划算法解决活动选择问题
func dynamicActivitySelector(s, f []int) ([]int, int) {
n := len(s)
c := make([][]int, n+2)
for i := range c {
c[i] = make([]int, n+2)
}
p := make([][]int, n+2)
for i := range p {
p[i] = make([]int, n+2)
}
for l := 3; l <= n+2; l++ {
for i := 0; i <= n-l+2; i++ {
j := i + l - 1
k := p[i][j-1] // 初始化k为最小兼容活动索引
for m := k + 1; m <= j-1; m++ { // 寻找最大兼容活动索引
if f[m] <= s[j] && f[k] < f[m] {
k = m
}
}
if f[k] <= s[j] { // 如果存在兼容活动,则加入到结果集中
c[i][j] = c[i][k] + c[k][j] + 1
p[i][j] = k
} else { // 如果不存在兼容活动,则不加入结果集中
c[i][j] = c[i][j-1]
p[i][j] = p[i][j-1]
}
}
}
return constructSolution(p, 0, n+1), c[0][n+1]
}
// 构造最大兼容活动集
func constructSolution(p [][]int, i, j int) []int {
if p[i][j] == 0 {
return nil
}
k := p[i][j]
left := constructSolution(p, i, k)
right := constructSolution(p, k, j)
result := append(left, k)
result = append(result, right...)
return result
}
func main() {
s := []int{0, 1, 3, 0, 5, 3, 5, 6}
f := []int{0, 4, 5, 6, 7, 8, 9 ,10}
maxActivitiesSet, maxSize := dynamicActivitySelector(s[1:], f[1:])
fmt.Println("最大兼容活动集:", maxActivitiesSet)
fmt.Println("最大兼容活动集的大小:", maxSize)
}
该代码使用动态规划算法解决活动选择问题。首先创建一个二维数组c和p,其中c[i][j]表示子问题(i,j)的最大兼容活动集的大小,p[i][j]记录构成子问题(i,j)最大兼容活动集的左侧第一个被选中的活动下标。然后按照递归式(16.2)进行计算并填表。最后根据p数组构造出最大兼容活动集。
相比于贪心算法GREEDY-ACTIVITY-SELECTOR,动态规划算法的时间复杂度为O(n^3),其中n是活动的个数。因此,在实际运行中,GREEDY-ACTIVITY-SELECTOR算法通常比动态规划算法更快。
kimi,代码不能运行:
在活动选择问题中,我们有一个活动列表,每个活动都有一个开始时间 start[i]
和结束时间 end[i]
。我们的目标是选择最大的兼容活动集,即没有两个活动重叠(即对于任意两个活动 A 和 B,如果 A 的结束时间小于或等于 B 的开始时间,则 A 和 B 兼容)。
递归式 (16.2) 定义了 c[i, j]
为在活动列表的前 j
个活动中选择的兼容活动集的最大大小,且这些活动在 start[i]
和 end[i]
之间结束。为了设计一个动态规划算法,我们需要维护一个二维数组 c
,其中 c[i][j]
表示在考虑前 j
个活动时,以第 i
个活动结束的活动集的最大大小。
以下是使用 Go 语言实现的动态规划算法:
package main
import (
"fmt"
)
// Activity 结构体表示一个活动,包含开始时间和结束时间
type Activity struct {
start int
end int
}
// maxActivitySet 函数计算最大兼容活动集的大小并生成最大集本身
func maxActivitySet(activities []Activity) (int, []int) {
n := len(activities)
c := make([][]int, n)
for i := range c {
c[i] = make([]int, n)
}
// 初始化 c 数组
for i := range c {
c[i][i] = 1 // 单个活动本身就是一个兼容集
}
// 动态规划计算 c 数组
for length := 2; length <= n; length++ {
for i := 0; i <= n-length; i++ {
j := i + length - 1
if activities[i].end <= activities[j].start {
// 如果活动 i 和 j 不重叠,取两者的最大兼容集
c[i][j] = max(c[i][k]+1, c[k+1][j]) for k := i; k < j; k++
} else {
// 如果活动 i 和 j 重叠,取不包含 i 的兼容集
c[i][j] = c[i+1][j]
}
}
}
// 回溯找到最大兼容集
maxSize := 0
maxSet := make([]int, 0)
for i := 0; i < n; i++ {
if c[0][i] > maxSize {
maxSize = c[0][i]
maxSet = make([]int, maxSize)
for k := 0; k < maxSize; k++ {
maxSet[k] = activities[i-k].end
}
}
}
return maxSize, maxSet
}
// max 辅助函数,返回两个整数中的最大值
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
activities := []Activity{
{1, 4},
{2, 5},
{3, 5},
{4, 6},
{5, 6},
{6, 8},
{7, 9},
{8, 11},
{9, 12},
}
size, set := maxActivitySet(activities)
fmt.Printf("Max size of compatible activity set: %d\n", size)
fmt.Printf("Max compatible activity set: %v\n", set)
}
在这个实现中,我们首先初始化一个二维数组 c
,然后使用动态规划填充这个数组。对于每一对活动 (i, j)
,我们检查它们是否重叠。如果不重叠,我们尝试将活动 i
添加到以活动 j
结束的兼容集中,并更新 c[i][j]
。如果活动 i
和 j
重叠,我们直接取 c[i+1][j]
的值。最后,我们回溯 c
数组以找到最大兼容集。
GREEDY-ACTIVITY-SELECTOR
是一个贪心算法,它在每一步选择结束时间最早的活动,直到没有更多活动可以添加到当前选择的集合中。这个算法的时间复杂度是 O(n^2),因为它需要对每一对活动进行比较。
与贪心算法相比,动态规划算法的时间复杂度是 O(n^3),因为我们需要三层嵌套循环来填充 c
数组。尽管动态规划算法在最坏情况下可能比贪心算法慢,但它能够找到全局最优解,而贪心算法可能只能找到局部最优解。在实际应用中,如果活动数量不多,动态规划算法是一个很好的选择。如果活动数量很大,可能需要考虑更高效的算法,如基于排序的贪心算法,其时间复杂度为 O(n log n)。
混元,代码不能运行:
以下是使用 Go 语言实现的一个动态规划算法,用于解决活动选择问题。该算法根据递归式 (16.2) 计算最大兼容活动集的大小 c[i, j]
,并生成最大集本身。输入的活动已按公式 (16.1) 排好序。
package main
import (
"fmt"
)
type Activity struct {
Start int
End int
}
func activitySelection(activities []Activity) (int, []Activity) {
n := len(activities)
c := make([][]int, n)
for i := range c {
c[i] = make([]int, n)
}
for i := 0; i < n; i++ {
c[i][i] = 1
}
for l := 2; l <= n; l++ {
for i := 0; i <= n-l; i++ {
j := i + l - 1
if activities[j].Start >= activities[i].End {
c[i][j] = c[i][j-1] + 1
} else {
c[i][j] = c[i][j-1]
}
}
}
maxSize := 0
maxIndex := 0
for i := 0; i < n; i++ {
if c[i][n-1] > maxSize {
maxSize = c[i][n-1]
maxIndex = i
}
}
result := make([]Activity, maxSize)
index := maxIndex
for i := n - 1; i >= 0; i-- {
if c[index][i] == c[index][i-1]+1 {
result[maxSize-1] = activities[i]
maxSize--
index = i - 1
}
}
return maxSize, result
}
func main() {
activities := []Activity{
{1, 2},
{3, 4},
{0, 6},
{5, 7},
{8, 9},
{5, 9},
}
size, maxCompatibleActivities := activitySelection(activities)
fmt.Printf("The size of the maximum compatible activity set is: %d\n", size)
fmt.Println("The maximum compatible activity set is:")
for _, activity := range maxCompatibleActivities {
fmt.Printf("Start: %d, End: %d\n", activity.Start, activity.End)
}
}
与 GREEDY-ACTIVITY-SELECTOR
算法相比,动态规划算法的运行时间为 O(n^2),而贪心算法的运行时间为 O(n)。动态规划算法可以找到最大兼容活动集的大小以及生成最大集本身,而贪心算法只能找到最大兼容活动集的大小。在某些情况下,动态规划算法可能会比贪心算法更适用,因为它可以提供更多的信息。
文心一言 VS 讯飞星火 VS chatgpt (210)-- 算法导论16.1 1题的更多相关文章
- 【对比】文心一言对飚ChatGPT实操对比体验
前言 缘由 百度[文心一言]体验申请通过 本狗中午干饭时,天降短信,告知可以体验文心一言,苦等一个月的实操终于到来.心中这好奇的对比心理油然而生,到底是老美的[ChatGPT]厉害,还是咱度娘的[文心 ...
- 【个人首测】百度文心一言 VS ChatGPT GPT-4
昨天我写了一篇文章GPT-4牛是牛,但这几天先别急,文中我测试了用GPT-4回答ChatGPT 3.5 和 Notion AI的问题,大家期待的图片输入也没有出现. 昨天下午百度发布了文心一言,对标C ...
- 文心一言,通营销之学,成一家之言,百度人工智能AI大数据模型文心一言Python3.10接入
"文心"取自<文心雕龙>一书的开篇,作者刘勰在书中引述了一个古代典故:春秋时期,鲁国有一位名叫孔文子的大夫,他在学问上非常有造诣,但是他的儿子却不学无术,孔文子非常痛心 ...
- 获取了文心一言的内测及与其ChatGPT、GPT-4 对比结果
百度在3月16日召开了关于文心一言(知识增强大语言模型)的发布会,但是会上并没现场展示demo.如果要测试的文心一言 也要获取邀请码,才能进行测试的. 我这边通过预约得到了邀请码,大概是在3月17日晚 ...
- 百度生成式AI产品文心一言邀你体验AI创作新奇迹:百度CEO李彦宏详细透露三大产业将会带来机遇(文末附文心一言个人用户体验测试邀请码获取方法,亲测有效)
目录 中国版ChatGPT上线发布 强大中文理解能力 智能文学创作.商业文案创作 图片.视频智能生成 中国生成式AI三大产业机会 新型云计算公司 行业模型精调公司 应用服务提供商 总结 获取文心一言邀 ...
- 阿里版ChatGPT:通义千问pk文心一言
随着 ChatGPT 热潮卷起来,百度发布了文心一言.Google 发布了 Bard,「阿里云」官方终于也宣布了,旗下的 AI 大模型"通义千问"正式开启测试! 申请地址:http ...
- 基于讯飞语音API应用开发之——离线词典构建
最近实习在做一个跟语音相关的项目,就在度娘上搜索了很多关于语音的API,顺藤摸瓜找到了科大讯飞,虽然度娘自家也有语音识别.语义理解这块,但感觉应该不是很好用,毕竟之前用过百度地图的API,有问题也找不 ...
- android用讯飞实现TTS语音合成 实现中文版
Android系统从1.6版本开始就支持TTS(Text-To-Speech),即语音合成.但是android系统默认的TTS引擎:Pic TTS不支持中文.所以我们得安装自己的TTS引擎和语音包. ...
- android讯飞语音开发常遇到的问题
场景:android项目中共使用了3个语音组件:在线语音听写.离线语音合成.离线语音识别 11208:遇到这个错误,授权应用失败,先检查装机量(3台测试权限),以及appid的申请时间(35天期限), ...
- 初探机器学习之使用讯飞TTS服务实现在线语音合成
最近在调研使用各个云平台提供的AI服务,有个语音合成的需求因此就使用了一下科大讯飞的TTS服务,也用.NET Core写了一个小示例,下面就是这个小示例及其相关背景知识的介绍. 一.什么是语音合成(T ...
随机推荐
- 靠谱:开源IM项目OpenIM压测程序介绍-自己动手测试性能和稳定性
压测前准备 (一)服务端配置调整 config/config.yaml 以8核16G为例 (1)openImMessagePort: [ 10130, 10131, 10132, 10133, 101 ...
- vs不同版本支持的c++版本和PlatformToolset,及在vs中切换c++版本
找c++资料从网上找确实更快速,但要想深入地理解vc++建议看msdn文档. vs不同版本支持的c++版本 C++17: vs2017基本支持,vs2015部分支持. C++14: vs2017就可以 ...
- SqlSugar跨库查询/多库查询
一.跨库方式1:跨库导航 (5.1.3.24) 优点1:支持跨服务器,支持跨数据库品种, 支持任何类型数据库 优点2: 超级强大的性能,能达到本库联表性能 缺点:不支持子表过滤主表 (方案有ToL ...
- C/C++ 实现FTP文件上传下载
FTP(文件传输协议)是一种用于在网络上传输文件的标准协议.它属于因特网标准化的协议族之一,为文件的上传.下载和文件管理提供了一种标准化的方法,在Windows系统中操作FTP上传下载可以使用WinI ...
- 19.11 Boost Asio 获取远程目录
远程目录列表的获取也是一种很常用的功能,通常在远程控制软件中都存在此类功能,实现此功能可以通过filesystem.hpp库中的directory_iterator迭代器来做,该迭代器用于遍历目录中的 ...
- Gin 中间件
中间件 在Gin框架中,中间件(Middleware)指的是可以拦截http请求-响应生命周期的特殊函数,在请求-响应生命周期中可以注册多个中间件,每个中间件执行不同的功能,一个中间执行完再轮到下一个 ...
- Visual Basic 6的安装与辅助插件 - 初学者系列 - 学习者系列文章
好久没玩VB6了,今天无聊,就把原来的VB6相关的代码翻了出来,然后上了VMWare虚拟机,把VB6安装上,然后把架构设计那个模板找出来完善了一下.看了一下,VB6这块需要记录一些内容,于是有了本文. ...
- Eclipse安装配置、卸载教程(Windows版)
Eclipse是一个开放源代码的集成开发环境(IDE),最初由IBM公司开发,现在由Eclipse基金会负责维护.它是一个跨平台的工具,可以用于开发多种编程语言,如Java.C/C++.Python. ...
- 【leetcode】合并 k 个有序链表,我给了面试官这 5 种解法
开胃菜 在进入本节的正题之前,我们先来看一道开胃菜. 题目 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1 ...
- 如何查看当前Ubuntu系统的版本-【转 https://www.cnblogs.com/chenxiaomeng/p/10038492.html】
如何查看当前Ubuntu系统的版本 一.系统位数 在控制台输入:sudo uname --m 如果显示i686,则表示安装了32位操作系统 如果显示 x86_64,则表示安装了64位操作系统 sudo ...